开启Kerberos认证的HBase集群的搭建和使用

发送反馈


iServer 支持开启 Kerberos 认证的 HBase 集群,这里以 centos7 系统为例,来介绍如何搭建开启 Kerberos 认证的 HBase 集群。

准备

1. 安装包准备

您需要准备以下安装包:

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。其中,需要修改以下参数:

注意: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

其他注意事项:

部署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'。