# 命令行部署
## 前提
1. 提前已经部署完成HDFS集群以及Zookeeper集群
Zookeeper安装部署请参考:[Zookeeper 部署](../zookeeper/installation-zookeeper.rst),假定Zookeeper服务部署在`zookeeper1,zookeeper2,zookeeper3`上。
HDFS安装部署请参考:[HDFS 部署](../hdfs/installation-hdfs.rst)。HDFS nameservice地址假定为`hdfs://oushu`
2. 若需要配置kerberos认证,那么需要提前部署好KDF服务:[kerberos 部署](../kerberos/installation-kerberos.rst)。假定配置的默认域为`OUSHU.COM`
3. oushu1, oushu2, oushu3机器上需要配置hbase的yum源,具体步骤如下:
使用root用户登陆oushu1,从yum源所在机器获取repo文件
```
scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo
```
追加yum源所在机器信息到/etc/hosts文件
安装lava命令行管理工具:
```
yum clean all
yum makecache
yum install -y lava
```
创建一个hostfile文件,包含cluster中的所有机器:
```
touch ~/hostfile
```
编辑hostfile文件内容如下(集群各机器的hostname):
```
oushu1
oushu2
oushu3
```
和集群内其他机器交换公钥:
```
lava ssh-exkeys -f ~/hostfile -p ********
```
将repo文件分发给集群内其他机器:
```
lava scp -f ~/hostfile /etc/yum.repos.d/oushu.repo =:/etc/yum.repos.d
```
4. 如果Zookeeper和HDFS部署在其它节点,那么需要在`/etc/hosts`中添加机器映射
```
192.168.1.14 zookeeper1
192.168.1.15 zookeeper2
192.168.1.16 zookeeper3
192.168.1.17 hdfs1
192.168.1.18 hdfs2
192.168.1.19 hdfs3
```
## 部署HBase
所有节点执行yum install安装hbase
```sh
lava ssh -f ~/hostfile -e "sudo yum install -y hbase"
```
安装完成之后,会自动生成以下路径:
名称 | 路径
---------------------|---------
HBase安装目录 | /usr/local/oushu/hbase
HBase配置目录 | /usr/local/oushu/conf/hbase
HBase日志目录 | /usr/local/oushu/log/hbase
Phoenix安装目录 | /usr/local/oushu/phoenix
## 配置
### 创建数据目录
- 登录HDFS所在集群,若HDFS开启了kerberos配置,那么需要进行认证操作
```shell
sudo su - hdfs
kinit -kt /etc/security/keytabs/hdfs.keytab hdfs
```
- 登录HDFS所在集群,创建HBase集群存放数据的根目录`/hbase`,并赋予权限
```shell
sudo su - hdfs
hdfs dfs -mkdir /hbase
hdfs dfs -chown -R hbase:hbase /hbase
```
### 配置依赖集群
- 若需要配置kerberos认证,所有安装hbase的机器需要安装`kerberos`的客户端
```shell
lava ssh -f ~/hostfile "sudo yum install -y krb5-libs krb5-workstation"
```
- 登录oushu1机器,从`kerberosserver`上获取`/etc/krb5.conf`文件,然后分发到所有要安装`hbase`的机器
```shell
scp root@kerberosserver:/etc/krb5.conf /etc/krb5.conf
lava scp -f ~/hostfile /etc/krb5.conf =:/etc/krb5.conf
```
:::{note}
Kerberos中hostname不支持大写,如果hostname带大写字母,请将hostname改为小写字母
:::
- 创建principal并分发keytab
```shell
su - root
kadmin.local
addprinc -randkey hbase/oushu1@OUSHU.COM
addprinc -randkey hbase/oushu2@OUSHU.COM
addprinc -randkey hbase/oushu3@OUSHU.COM
xst -k /etc/hbase.keytab hbase/oushu1@OUSHU.COM
xst -k /etc/hbase.keytab hbase/oushu2@OUSHU.COM
xst -k /etc/hbase.keytab hbase/oushu3@OUSHU.COM
```
- 登录oushu1机器,从`kerberosserver`上获取`keytab`文件,然后分发到所有要安装`hbase`的机器
```shell
scp root@kerberosserver:/etc/hbase.keytab /usr/local/oushu/hbase/conf/hbase.keytab
lava scp -f ~/hostfile /usr/local/oushu/hbase/conf/hbase.keytab =:/usr/local/oushu/hbase/conf/hbase.keytab
lava ssh -f ~/hostfile -e "chown hbase:hbase /usr/local/oushu/hbase/conf/hbase.keytab"
```
### 修改配置文件
配置文件的路径都在`/usr/local/oushu/conf/hbase`,文件描述如下:
文件名 | 作用描述
--------------------|---------
hbase-env.sh | 程序启动环境变量
hbase-site.xml | HBase配置参数
- 登录oushu1机器,配置hbase-env.sh文件
```shell
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
export JAVA_HOME="/usr/lib/jvm/java"
export HBASE_MANAGES_ZK="false"
export HBASE_LOG_DIR="/usr/local/oushu/log/hbase"
```
- 将hbase-env.sh分发到所有机器
```shell
lava scp -f ~/hostfile /usr/local/oushu/conf/hbase/hbase-env.sh =:/usr/local/oushu/conf/hbase/hbase-env.sh
```
- 登录oushu1机器,配置hbase-site.xml文件
```xml
hbase.cluster.distributed
true
hbase.rootdir
hdfs://oushu/hbase
hbase.zookeeper.quorum
zookeeper1,zookeeper2,zookeeper3
```
- 为hbase-site.xml文件增加kerberos的相关配置
```xml
hbase.security.authentication
kerberos
hbase.rpc.engine
org.apache.hadoop.hbase.ipc.SecureRpcEngine
hbase.coprocessor.region.classes
org.apache.hadoop.hbase.security.token.TokenProvider
hbase.master.kerberos.principal
hbase/_HOST@OUSHU.COM
hbase.master.keytab.file
/usr/local/oushu/hbase/conf/hbase.keytab
hbase.regionserver.kerberos.principal
hbase/_HOST@OUSHU.COM
hbase.regionserver.keytab.file
/usr/local/oushu/hbase/conf/hbase.keytab
```
- 将hbase-site.xml分发到所有机器
```shell
lava scp -f ~/hostfile /usr/local/oushu/conf/hbase/hbase-site.xml =:/usr/local/oushu/conf/hbase/hbase-site.xml
```
- 若HDFS是HA模式,那么需要将HDFS集群的core-site.xml和hdfs-site.xml文件分发到hbase的conf目录
```shell
lava scp -f ~/hostfile /usr/local/oushu/conf/hdfs/core-site.xml =:/usr/local/oushu/conf/hbase/core-site.xml
lava scp -f ~/hostfile /usr/local/oushu/conf/hdfs/hdfs-site.xml =:/usr/local/oushu/conf/hbase/hdfs-site.xml
```
## 启动
登陆oushu1机器,使用root用户创建`~/hbasemaster`和`~/regionserver`文件
```shell
touch ~/hbasemaster
touch ~/regionserver
```
`hbasemaster`文件包含
```
oushu1
oushu2
```
`regionserver`文件包含
```
oushu1
oushu2
oushu3
```
启动HMaster
```shell
lava ssh -f ~/hbasemaster -e "sudo -u hbase /usr/local/oushu/hbase/bin/hbase-daemon.sh start master"
```
启动HRegionserver
```shell
lava ssh -f ~/regionserver -e "sudo -u hbase /usr/local/oushu/hbase/bin/hbase-daemon.sh start regionserver"
```
## 检查状态
登录oushu1,oushu2,oushu3节点,使用`jps`查询进程是否存活。
oushu1,oushu2节点应该有`HMaster`和`HRegionserver`进程存在。oushu3节点应该有`HRegionserver`进程存在
```shell
su - hbase
jps
```
## 简单测试
登录oushu1节点,进入hbase shell客户端
```shell
ssh oushu1
su - hbase
hbase shell
```
若配置了kerberos认证,则需要执行kinit获取认证信息,然后进入客户端
```shell
su - hbase
kinit -k -t /xx.keytab xx/hostname@OUSHU.COM
hbase shell
```
创建一张test表,并简单操作,看是否可用
```shell
hbase:008:0> create 'p_test', 'f1';
Created table p_test
Took 0.6230 seconds
=> Hbase::Table - p_test
hbase:009:0> put 'p_test', '1001', 'f1:name', 'wang';
Took 0.1461 seconds
hbase:010:0> scan 'p_test';
ROW COLUMN+CELL
1001 column=f1:name, timestamp=2022-11-03T16:17:01.050, value=wang
1 row(s)
Took 0.0296 seconds
hbase:011:0> describe 'p_test';
Table p_test is ENABLED
p_test
COLUMN FAMILIES DESCRIPTION
{NAME => 'f1', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FA
LSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BL
OCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s)
Quota is disabled
Took 0.0257 seconds
```
使用`sqlline.py`命令在phoenix端创建一张p_test表,查看是否可用
```shell
0: jdbc:phoenix:> create table p_test(id bigint primary key, name varchar);
No rows affected (0.713 seconds)
0: jdbc:phoenix:> upsert into p_test values (1, 'p1');
1 row affected (0.04 seconds)
0: jdbc:phoenix:> select * from p_test;
+----+------+
| ID | NAME |
+----+------+
| 1 | p1 |
+----+------+
1 row selected (0.053 seconds)
0: jdbc:phoenix:> !quit
Closing: org.apache.phoenix.jdbc.PhoenixConnection
```
## 注册到skylab(可选)
HBase将要安装的机器需要通过机器管理添加到skylab中,如果您尚未添加,请参考:[注册机器](../start/install-lava.md)。
在oushu1节点修改/usr/local/oushu/lava/conf配置`server.json`,替换localhost为skylab的服务器ip,具体skylab的基础服务lava安装步骤请参考:[lava安装](../start/start-installation.rst)。
```
{
"server": "localhost:1612",
"admin": "localhost:1652"
}
```
创建一个request文件,包含HBase cluster信息:
```
touch ~/hbase-register.json
```
编辑json文件内容如下:
```json
{
"data": {
"name": "hbaseserver",
"group_roles": [
{
"role": "hbase.master",
"cluster_name": "hbase",
"group_name": "hbasemaster",
"machines": [
{
"id": 1,
"name": "oushu1",
"subnet": "lava",
"data_ip": "192.168.1.11",
"manage_ip": "192.168.1.11",
"assist_port": 1622,
"ssh_port": 22
},{
"id": 2,
"name": "oushu2",
"subnet": "lava",
"data_ip": "192.168.1.12",
"manage_ip": "192.168.1.12",
"assist_port": 1622,
"ssh_port": 22
}
]
},
{
"role": "hbase.regionserver",
"cluster_name": "hbase",
"group_name": "hbaseregionserver",
"machines": [
{
"id": 1,
"name": "oushu1",
"subnet": "lava",
"data_ip": "192.168.1.11",
"manage_ip": "192.168.1.11",
"assist_port": 1622,
"ssh_port": 22
},{
"id": 2,
"name": "oushu2",
"subnet": "lava",
"data_ip": "192.168.1.12",
"manage_ip": "192.168.1.12",
"assist_port": 1622,
"ssh_port": 22
},{
"id": 3,
"name": "oushu3",
"subnet": "lava",
"data_ip": "192.168.1.13",
"manage_ip": "192.168.1.13",
"assist_port": 1622,
"ssh_port": 22
}
]
}
]
}
}
```
配置文件说明,整个json分为3部分:
- 第一部分name,为集群名称,个性化填写。
- 第二部分为group_roles,对于HBase来说,是2个角色,hbase.master和hbase.regionserver,不可修改。
- 第三部分,为每个角色添加机器,需要添加的机器信息可以通过下面的方式获得。
在平台基础组件lava所安装的机器执行(端口和用户名按照lava配置修改):
```
psql lavaadmin -p 4432 -U oushu -c "select m.id,m.name,s.name as subnet,m.private_ip as data_ip,m.public_ip as manage_ip,m.assist_port,m.ssh_port from machine as m,subnet as s where m.subnet_id=s.id;"
```
获取到所需的机器信息,根据服务角色对应的节点,将机器信息添加到machines数组中。
在oushu1节点调用lava命令注册集群:
```
lava login -u oushu -p Oushu6@China -T {租户id}
lava onprem-register service -s HBase -f ~/hbase-register.json
```
如果返回值为:
```
Add service by self success
```
则表示注册成功,如果有错误信息,请根据错误信息处理。
例如skylab部署在192.168.1.10,访问
```
http://192.168.1.10:3000/main/Deploy/hbase
```
从页面登录后,在自动部署模块对应服务中可以查看到新添加的集群,同时列表中会实时监控HBase进程在机器上的状态。
