iServer 支持开启 Kerberos 认证的 HBase 集群,这里以 centos7 系统为例,来介绍如何搭建开启 Kerberos 认证的 HBase 集群。
准备
1. 安装包准备
您需要准备以下安装包:
- Hadoop安装包:Hadoop-2.7.3.tar.gz
- JDK安装包:jdk-8u131-linux-x64.tar.gz
- Jsvc安装包:commons-daemon-1.0.15-src.tar.gz
- Kerberos客户端安装包(windows): kfw-4.1-amd64.msi
- Zookeeper安装包:zookeeper-3.4.10.tar.gz
- HBase安装包 : hbase-1.3.1-bin.tar.gz
- jce_policy 安装包:jce_policy-8.zip
2. 机器准备
机器准备如下表:
机器名 |
IP |
硬件情况 |
进程分布 |
Master |
192.168.13.195 |
8G |
Kerberos Server、Kerberos Client、HDFS Namenode、Zookeeper Follower、HBase Master |
Worker1 |
192.168.13.196 |
8G |
Kerberos Client、HDFS Datanode、Zookeeper Leader、HBase Regionserver |
Worker2 |
192.168.13.198 |
8G |
Kerberos Client、HDFS Datanode、Zookeeper Follower、HBase Regionserver |
注意:
1. Hostname应小写,以避免集成Kerberos时出错。
2. 搭建时应关闭Master及各Worker节点的防火墙。
创建用户和用户组
在 Master 与各个节点分别创建以下用户组和用户,具体步骤如下:
1. 新建用户组,命令如下:
groupadd Hadoop
2. 新建用户hdfs,hbase,其中需设定userID<1000,命令如下:
useradd -u 501 hdfs -g hadoop
useradd -u 502 hbase -g hadoop
3. 使用passwd命令为新建用户设置密码:
passwd hdfs 输入新密码
passwd hbase 输入新密码
4. 用户建好后,用id user命令查看用户信息,如下图所示:
5. 配置DNS和网关。如果是虚拟机,DNS和网关需与实体机相同。
6. 将Master节点对应的IP添加到DNS服务中,并设置域名,如master.iserver.com
配置免密登录
为各节点间root、hdfs,hbase用户配置免密登录,具体步骤如下:
1. 以hdfs用户为例,配置免密登录:
1) 分别在Master和Worker上执行如下命令:
ssh-keygen -t rsa -P’’
其中 -P表示密码,可以忽略,默认需要三次回车。执行完命令后,在/home/hdfs/.ssh目录下生成两个文件,其中id_rsa为私钥文件,id_rsa.pub为公钥文件,如下图所示:
2) 分别在Master和worker上执行以下命令:
ssh-copy-id -i /home/hdfs/.ssh/id_rsa.pub ip
当在Master上执行时,写Worker节点对应的IP。
3) 在Master和Worker上执行如下命令,验证是否配置成功:
ssh worker/master
2. Root,hbase用户配置免密登录的操作同上。
安装JDK
在每台设备中安装JDK,下载地址为:
https://www.oracle.com/technetwork/java/javase/downloads/index.html
然后安装jdk-8u171-linux-x64.tar.gz,步骤如下:
1. 解压安装包:
tar –zxvf jdk-8u171-linux-x64.tar.gz
2. 移动到指定目录(可选):
mkdir /usr/lib/jdk
mv jdk1.8.0_111 /usr/lib/jdk/jdk1.8
3. 将jce_policy-8.zip 解压后的jar包上传至 /usr/lib/jdk/jdk1.8/jre/lib/security 目录下。
4. 设置环境变量:
方法一:修改全局配置文件,可作用于所有用户,输入如下命令打开全局配置文件:
vi /etc/profile
输入以下内容:
export JAVA_HOME=/usr/lib/jdk/jdk1.8
export CLASSPATH= ${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
export PATH= ${JAVA_HOME}/bin:$PATH
方法二:修改当前用户配置文件,只作用于当前用户,输入如下命令开始编辑:
vi ~/.bashrc
输入的内容同上。
5. 使修改的配置立刻生效:
source /etc/profile
或
source ~/.bashrc
6. 输入版本查看命令,检查是否安装成功:
java -version
安装 Jsvc
在每台设备中安装Jsvc,步骤如下:
1. 解压文件 commons-daemon-1.0.15-src.tar.gz
2. 在 commons-daemon-1.0.15-src/src/native/unix目录下依次执行:
support/buildconf.sh
./configure
make
3. 进行编译,成功后可在commons-daemon-1.0.15-src/src/native/unix目录下看到jsvc文件,并将其复制到【Hadoop-2.7.3安装包】/libexec目录下。
注意:如果commons-daemon-1.0.15-src.tar.gz中已自带Jsvc,则无需执行1、2,直接执行3即可。
Kerberos服务安装与配置
1. 在Master节点安装Kerberos的客户端及服务、而Worker仅安装Kerberos的客户端:
yum install krb5-server (服务)
yum install krb5-workstation krb5-libs (客户端)
2. 配置Kerberos服务相关文件
配置etc 文件夹下的krb5.conf 文件。修改其中的realm,把默认的EXAMPLE.COM修改为自己要定义的值,如:SUPERMP.COM。其中,需要修改以下参数:
-
default_realm:代表默认的realm。配置时应设置为realm,如SUERMAP.COM
-
kdc:代表要kdc的位置,添加格式是机器名
-
admin_server:代表admin的位置,添加格式是机器名
-
default_domain:代表默认的域名,配置时应修改为Master主机所对应的域名,如master.iserver.com。
注意:Master、Worker节点均需进行以上配置,且配置文件内容必须相同。
修改后的文件如下图所示:
1) 配置 'vi /var/kerberos/krb5kdc’ 路径下的kdc.conf文件 (仅配置Master节点,如果没有,需自建),如下图所示。
2) 配置 'vi /var/kerberos/krb5kdc’ 路径下的kadm5.acl 文件(仅配置Master节点,如果没有,需自建),如下图。
3. 创建 Kerberos数据库
创建Kerberos数据库,需要设置管理员密码,创建成功后会在 ’/var/Kerberos/krb5kdc/’ 路径下生成一系列文件,如果重新创建,需要先删除 '/var/kerberos/krb5kdc’ 下的principal相关文件。
在Master节点的root用户下执行以下命令:
kdb5_util create -s -r SUPERMAP.COM
执行成功后如下图所示:
注意:数据库创建成功后,需重启krb5服务:
krb5kdc restart
4. 创建 Kerberos的管理员
在Master节点的root用户下分别执行以下命令:
kadmin.local
addprinc admin/admin@SUPERMAP.COM
如下图所示:
5. 创建 Kerberos的普通用户及密钥文件,以达到在配置<!-- kerberos security-->时,各节点可以相互访问的目的。
1) 在Master节点的root用户下分别执行以下命令:
kadmin.local
#创建用户
addprinc -randkey hdfs/ master.iserver.com@SUPERMAP.COM
addprinc -randkey hdfs/ worker1.iserver.com @SUPERMAP.COM
addprinc -randkey hdfs/ worker2.iserver.com @SUPERMAP.COM
addprinc -randkey hbase/ master.iserver.com@SUPERMAP.COM
addprinc -randkey hbase / worker1.iserver.com @SUPERMAP.COM
addprinc -randkey hbase / worker2.iserver.com @SUPERMAP.COM
#生成密钥文件(生成到当前路径下)
xst -k hdfs.keytab hdfs/master.iserver.com@SUPERMAP.COM
xst -k hdfs.keytab hdfs/worker1.iserver.com@SUPERMAP.COM
xst -k hdfs.keytab hdfs/worker2.iserver.com@SUPERMAP.COM
xst -k hbase.keytab hbase/master.iserver.com@SUPERMAP.COM
xst -k hbase.keytab hbase/worker1.iserver.com@SUPERMAP.COM
xst -k hbase.keytab hbase/worker2.iserver.com@SUPERMAP.COM
2) 将hdfs.keytab (hdfs:hadoop 400)和hbase.keytab(hbase:hadoop 400)文件放到Master和Worker节点的/var/kerberos/krb5kdc/ 目录,并设置相应的组,并将权限为400。如下图所示:
修改Hadoop集群配置
进入{HADOOP_HOME}/etc/hadoop目录,进行如下配置。
1. core-site.xml文件内容如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.13.195:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hbase/hadoop-2.7.3/tmp</value>
<description>Abasefor other temporary directories.</description>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
<property>
<name>hadoop.security.auth_to_local</name>
<value>DEFAULT</value>
</property>
</configuration>
2. hdfs-site.xml文件内容如下:
<configuration>
<property>
<name>dfs.https.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>192.168.13.195:50070</value>
</property>
<property>
<name>dfs.https.port</name>
<value>504700</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.13.195:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hbase/hadoop-2.7.3/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hbase/hadoop-2.7.3/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.encrypt.data.transfer</name>
<value>true</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>http/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>host/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.13.195:50090</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.encrypt.data.transfer</name>
<value>false</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>192.168.13.196:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>192.168.13.196:1006</value>
</property>
<property>
<name>dfs.datanode.https.address</name>
<value>192.168.13.196:50470</value>
</property>
</configuration>
3. hadoop-env.sh文件添加以下内容:
export JAVA_HOME=/usr/lib/jdk/jdk1.8
export JSVC_HOME=/home/hbase/hadoop-2.7.3/libexec
如果需要调试,还需添加以下内容:
export HADOOP_OPTS="$HADOOP_OPTS -Dsun.security.krb5.debug=true"
4. masters文件添加以下内容:
master(Master所在主机名)
5. slaves文件添加以下内容:
worker(Worker所在主机名)
6. 将已配置的Hadoop安装包复制到Worker节点,放于与Master节点相同路径下。
注意:在hdfs-site.xml文件中,<dfs.datanode.address>、<dfs.datanode.http.address>、<dfs.datanode.https.address> 属性对应值在每个子节点上要改成各自IP。
7. 权限设置(Master、Worker节点都需设置)
以下文件(或文件目录)需要单独配置相应的用户组和权限,具体配置如下表所示:
对应的文件 |
需设置成 用户:组 |
文件权限 |
Hadoop安装包 |
root:root |
drwxr-xr-x(755) |
Hadoop安装目录/bin和/sbin文件目录 |
root:root |
drwxrwxrwx(777) |
hdfs-site.xml中dfs.namenode.name.dir所设定的文件目录 |
hdfs:hadoop |
drwx------ (700) |
hdfs-site.xml中dfs.datanode.data.dir所设定的文件目录 |
hdfs:hadoop |
drwx------ (700) |
Hadoop_env.sh中$HADOOP_LOG_DIR所设定的文件目录 |
hdfs:hadoop |
drwxrwxr-x(775) |
Hadoop安装目录下/bin/container-executor |
root:hadoop |
--Sr-s--*(6050) |
Hadoop安装目录/tmp目录 |
hdfs:hadoop |
- |
Hadoop安装目录/start-dfs.sh |
hdfs: hadoop |
|
Hadoop安装目录下/sbinstart-secure-dns.sh |
root: hadoop |
启动Hadoop集群
在Master节点下的Hadoop安装目录下执行以下命令以启动Hadoop集群:
1. 使用root用户启动Kerberos服务
krb5kdc start
2. 在hdfs用户下对集群进行格式化(仅第一次安装时或者修改了Hadoop相关设置后需要执行该步骤)
[hdfs@master bin]$ ./hadoop namenode –format
3. 启动集群
[hdfs@master sbin]$ ./start-dfs.sh
[root@master sbin]# ./start-secure-dns.sh
4. 如需停止集群
[root@master sbin]# ./stop-secure-dns.sh
[hdfs@master sbin]$ ./stop-dfs.sh
验证Hadoop集群是否可用
通过以下操作来验证Hadoop集群是否成功启动:
访问Hadoop集群的Master节点,访问地址如 'http://<server>:50070’。
部署ZooKeeper集群
ZooKeeper是一个为分布式应用提供一致性服务的软件,是Hadoop和HBase的重要组件。其架构图如下:
ZooKeeper至少需要三台机器。其中,follower负责响应读请求,leader负责提交写请求。Zookeeper安装步骤如下:
1. ZooKeeper的安装与配置
1) 解压文件,本文解压目录为 '/home/hbase’ :
tar -zxvf zookeeper-3.4.10.tar.gz
2) 增加文件权限:
chmod +wxr zookeeper-3.4.10
3) 修改ZooKeeper的配置文件,并在 '/home/hbase ' 目录下建立数据目录和日志目录。
cd zookeeper-3.4.10
mkdir data
mkdir logs
注意:需要在 ’../ zookeeper-3.4.10/conf/’ 目录下将zoo_sample.cfg重命名为zoo.cfg,以避免与其他文件重名。
4) 编辑重命名后的zoo.cfg文件,zoo.cfg文件内容如下:
5) 在 '../ zookeeper-3.4.10/conf/' 目录下创建jaas.conf文件,文件内容如下:
6) 在 ’../ zookeeper-3.4.10/conf/’ 目录下创建 java.env文件,文件内容如下:
7) 进入data目录,配置 ’myid’ 参数为1:
与zoo.cfg文件保持一致,对应其中 'server.1' 的 IP (相应地,若 'myid' 的值为 2,则对应其中的 'server.2' )。
2. 将已配置的ZooKeeper安装包复制到Worker1和Worker2节点,放于与Master节点相同路径下。
3. 分别修改Worker1和Worker2上myid的值为2和3
4. 用hbase用户分别启动Master、Worker1和Worker2上的ZooKeeper:
[hbase @master zookeeper-3.4.10]$ bin/zkServer.sh start
[hbase@worker1 zookeeper-3.4.10]$ bin/zkServer.sh start
[hbase@worker2 zookeeper-3.4.10]$ bin/zkServer.sh start
5. 查看ZooKeeper的状态
[hbase @master zookeeper-3.4.10]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hbase/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[hbase@worker1 zookeeper-3.4.10]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/ hbase /zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[hbase@worker2 zookeeper-3.4.10]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hbase/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
其他注意事项:
-
Master节点与各Worker节点间各个配置文件的权限须保持一致。
-
部署过程中应关闭防火墙。
-
避免2181默认端口被占用的问题。
-
zookeeper.out日志文件应位于安装路径的根目录下。
-
重启服务之前清空../data目录下除myid外的其他文件。
部署HBase集群
1. 解压HBase的安装包,本文解压目录为 '/home/hbase’ :
tar -zxvf hbase-1.3.1-bin.tar.gz
2. 修改 '/home/hbase/hbase-1.3.1/conf' 路径下的 HBase的配置文件。
1) hbase-env.sh文件内容如下:
2) hbase-site.xml文件内容如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
<description>The directory shared by region servers.</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>master:6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hbase/zookeeper-3.4.10/data</value>
</property>
<property>
<name>hbase.regionserver.kerberos.principal</name>
<value>hbase/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>hbase.regionserver.keytab.file</name>
<value>/var/kerberos/krb5kdc/hbase.keytab</value>
</property>
<property>
<name>hbase.master.kerberos.principal</name>
<value>hbase/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>hbase.master.keytab.file</name>
<value>/var/kerberos/krb5kdc/hbase.keytab</value>
</property>
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.geomesa.principal</name>
<value>hbase/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>hbase.geomesa.keytab</name>
<value>/var/kerberos/krb5kdc/hbase.keytab</value>
</property>
</configuration>
3) hdfs-site.xml文件内容如下:
<configuration>
<property>
<name>dfs.https.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>192.168.13.195:50070</value>
</property>
<property>
<name>dfs.https.port</name>
<value>504700</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.13.195:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hbase/hadoop-2.7.3/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hbase/hadoop-2.7.3/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.encrypt.data.transfer</name>
<value>true</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>http/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>host/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.13.195:50090</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/master.iserver.com@SUPERMAP.COM</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/var/kerberos/krb5kdc/hdfs.keytab</value>
</property>
<property>
<name>dfs.encrypt.data.transfer</name>
<value>false</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>192.168.13.196:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>192.168.13.196:1006</value>
</property>
<property>
<name>dfs.datanode.https.address</name>
<value>192.168.13.196:50470</value>
</property>
</configuration>
4) regionservers文件内容如下:
5) zoo.cfg文件内容如下:
6) jaas.conf文件内容如下:
3. 从【iServer 安装包】/support/GeomesaHBase 目录下拷贝 geomesa-hbase-distributed-runtime.jar,并部署到HBase集群安装目录../lib下,修改jar的用户和用户组为hbase:hadoop。
注意:此步骤必须使用【iServer 安装包】/support/GeomesaHBase 目录下的 geomesa-hbase-distributed-runtime.jar,不能从其他途径获取。
4. 将已配置的HBase安装包复制到Worker1和Worker2节点,放于与Master节点相同路径下。
5. Hdfs上创建/hbase目录,在Hadoop主节点目录 /home/hbase/hadoop-2.7.3/bin下执行如下命令:
./hdfs dfs -mkdir /hbase
6. 修改目录权限:
./hadoop dfs -chmod 777 /hbase
./hadoop dfs -chown hbase:hadoop /hbase
7. 使用hbase用户启动HBase集群,在适当的节点目录 /home/hbase/hadoop-2.7.3/bin 运行如下命令:
[hbase @master bin]$ ./hbase-daemon.sh start master
[hbase@worker1 bin]$ ./hbase-daemon.sh start regionserver
[hbase@worker2 bin]$ ./hbase-daemon.sh start regionserver
8. 验证集群是否可用
通过以下操作来验证HBase集群是否成功启动:
访问HBase集群的Master节点,访问地址如 'http://<server>:16010'。