zookeeper java.env_zookeeper、hbase集成kerberos

本文详细介绍了如何在KDC上创建principal,生成并分发密钥文件,以及在Zookeeper和HBase中配置Kerberos。包括Zookeeper的jaas.conf、java.env文件设置,zoo.cfg的修改,以及测试步骤。同时,文章还讨论了Hbase的配置和启动,以及客户端测试和问题排查,确保Kerberos认证的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、KDC创建principal

1.1、创建认证用户

登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作:

# kadmin.local -q “addprinc -randkey hbase/yjt”

# kadmin.local -q “addprinc -randkey zookeeper/yjt”

# kadmin.local -q “addprinc -randkey zkcli/yjt”

其中hbase集群有几台,上面的第一台命令就需要执行几次,每次执行的时候请把yjt修改成你机器对应的主机名

同理,zookeeper也是一样

1.2、生成密钥文件

生成hbase密钥文件

# kadmin.local -q “xst  -norankey  -k  /etc/hbase.keytab hbase/yjt”

生成zookeeper密钥文件

# kadmin.local -q “xst  -norankey  -k  /etc/zk.keytab zookeeper/yjt zkcli/yjt”

拷贝hbase.keytab到所有的hbase集群节点的conf目录下

拷贝zk.keytab到所有zookeeper集群节点的conf目录下

2、zookeeper操作

2.1、创建jaas.conf文件

在zookeeper的conf目录下创建或者修改jaas.conf,没有就创建,配置信息如下:

Server {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab="/data1/hadoop/zookeeper/conf/zk.keytab"

storeKey=true

useTicketCache=false

principal="zookeeper/yjt@HADOOP.COM";  #这里注意,如果是多个zookeeper,那么这个principal里面的域名改成对应的主机名,同时在这个server里面,principal必须以zookeeper开头,也就是principal='zookeeper/hostname@xxx.COM',否则会报服务不能找到错误。

};

Client {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab="/data1/hadoop/zookeeper/conf/zk.keytab"

storeKey=true

useTicketCache=false

principal="zkcli/yjt@HADOOP.COM";

};

2.2、创建java.env文件

在zookeeper的conf目录下创建或者修改java.env文件,配置信息如下:

export JVMFLAGS="-Djava.security.auth.login.config=/data1/hadoop/zookeeper/conf/jaas.conf"

2.3、修改zoo.cfg文件

添加如下属性:

kerberos.removeHostFromPrincipal=truekerberos.removeRealmFromPrincipal=trueauthProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

jaasLoginRenew=3600000

2.4、测试zookeeper kerberos

首先启动zookeeper集群,然后使用zkcli -server IP:端口(注意,一定要以这种方式)测试

如下:zkCli.sh -server yjt:2181

在输出的信息中,最下面如果能找到类似下面这样的信息,就代表配置成功:

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

WATCHER::

WatchedEvent state:SaslAuthenticated type:None path:null

在使用zkCli.sh连接zookeeper的时候,这里贴一下错误信息:

WatchedEvent state:SyncConnected type:None path:null

2019-11-20 12:49:55,971 [myid:] - ERROR [main-SendThread(rslog084:2181):ZooKeeperSaslClient@308] - An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member's received SASL token. Zookeeper Client will go to AUTH_FAILED state.

2019-11-20 12:49:55,971 [myid:] - ERROR [main-SendThread(rslog084:2181):ClientCnxn$SendThread@1076] - SASL authentication with Zookeeper Quorum member failed: javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member's received SASL token. Zookeeper Client will go to AUTH_FAILED state.

造成上述原因是由于服务端principal主体错误,可能错误的原因如下:

1、在jaas.conf文件中,principal主体错误,正确的主体名称格式: zookeeper/@

2、当采用zkCli.sh 的方式请求中,默认的host应该是localhost,因此在kdc中才会发现客户端的请求和  zookeeper/localhost@NETEASE.COM 这个principal进行认证,但是在kerberos的database中却没有这个principal。

解决方法: 使用zkCli.sh -server host:port 访问。 同时zookeeper配置文件中sever部分的principal必须为zookeeper/@

3、hbase配置

3.1、配置hbase-site.xml

添加如下配置:

hbase.security.authorization

true

hbase.security.authentication

kerberos

hbase.rpc.engine

org.apache.hadoop.hbase.ipc.SecureRpcEngine

hbase.regionserver.kerberos.principal

hbase/_HOST@HADOOP.COM

hbase.regionserver.keytab.file

/data1/hadoop/hbase/conf/hbase.keytab

hbase.master.kerberos.principal

hbase/_HOST@HADOOP.COM

hbase.master.keytab.file

/data1/hadoop/hbase/conf/hbase.keytab

3.2、启动hbase

# start-hbase.sh

进去到hbase的客户端

# hbase shell

查看当前存在的表

hbase(main):001:0> list

TABLE

0 row(s) in 0.3550 seconds

=> []

如果上述的输出没有报错,说明配置成功

注:hadoop版本在2.6以上数据传输才能使用sasl方式,而hbase又得版本集成Hadoop的版本低于2.6,会导致hbase失败,我在使用hadoop2.9.2,hbase1.3.1测试的时候,就报如下错误:

2019-10-24 15:04:12,325 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48326. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection

2019-10-24 15:05:02,352 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48346. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection

2019-10-24 15:05:12,418 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48352. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection

2019-10-24 15:05:22,461 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /192.168.0.230:48356. Perhaps the client is running an older version of Hadoop which does not support SASL data t

解决办法:

(1) 、使用高版本的hbase

(2) 、把高版本的hbase下面的lib库里面的文件拷贝到低版本的hbase lib库里面,当然,先要删除低版本hbase lib库里面的关于hadoop相关的软件报。

3.2、测试

(1)、在集群内部进入到shell,输入命令为hbase shell

创建表:

# create ‘test’, ‘c1’

如果能成功创建说明没问题

(2)、咋集群内部使用phoenix连接测试

在使用Kerberos以后,phoenix连接hbase的方式有两种:

第一种:查看当前是否存在票据

f7c59c26c4787ca9957ca8a1245bb9ce.png

出现上面的信息,说明是存在票据的,所以,这个时候可以使用:

jdbc:phoenix::  方式连接

如下:

# ./sqlline.py yjt:2181   其实就跟原先的连接方法一样。

第二种:不存在票据

jdbc:phoenix:::[zk_rootNode]::

#  ./sqlline.py yjt:2181:hbase/yjt:/data1/hadoop/hbase/conf/hbase.keytab

b2d64045e100696c2f854b8dd9642603.png

如果出现上述,说明成功。

在测试的时候,由于配置不当,导致在集群内部测试时失败,错误日志如下:

4a212521e8d49ebc52491f95d94d62d2.png

解决办法:这是由于配置完hbase Kerberos以后,没有把hbase-iste.xml拷贝到phoenix的bin目录下覆盖原来的配置文件,导致失败。

(3) 、hbase客户端测试

从集群拷贝hbase的目录到客户端,注意:hbase的根目录最好一致,这样就不用修改hbase-site.xml文件里面的密钥路径了。如下:

Hbase集群(随便选一台)上面操作,操作用户为hduser,下面的192.168.0.9为集群的客户端:

# scp -r /data1/hadoop/hbase 192.168.0.9:/data1/hadoop

拷贝zookeeper密钥

Hbase依赖与zookeeper连接,所以,需要把zookeeper的密钥文件从zookeeper集群拷贝到客户端(当然,可以拷贝整个目录到客户端,这样还可以测试zookeeper的客户端是否可以正常使用,当hbase错问题的时候,可以排查是否是zookeeper导致的),zookeeper的密钥存放与客户端的/data1/hadoop/zookeeper/conf下(这个目录随意,只需要这个目录与hbase/conf下面的zk-jaas.conf文件里面的密钥存放路径统一就行),如下:

# scp /data1/hadoop/zookeeper/conf/zk.keytab 192.168.0.9:/data1/hadoop/zookeeper/conf

拷贝hadoop到客户端

同理,hbase依赖与Hadoop存储数据,所以需要与Hadoop进行交互,这里拷贝Hadoop的配置到客户端,如下:

# scp -r /data1/hadoop/hadoop  192.168.0.9:/data1/hadoop

同时,还需要拷贝jdk(如果客户端存在,也可以不用拷贝,但是,jdk的目录不一样的话,需要修改hbase,hadoop环境变量内部的java属性)

# scp -r /data1/hadoop/jdk 192.168.0.9:/data1/jdk

配置hbase、zookeeper、Hadoop的环境变量

修改当前用户的.bashrc文件,我当前的用户是hduser

# vim /home/hduser/.bashrc    修改如下:

export HBASE_HOME=/data1/hadoop/hbase

export PATH=${HBASE_HOME}/bin:${PATH}

export ZOOK_HOME=/data1/hadoop/zookeeper

export PATH=${ZOOK_HOME}/bin:$PATH

export HADOOP_HOME=/data1/hadoop/hadoop

export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

注意:这里一定要设置Hadoop的环境变量,如果Hadoop环境变量设置错误,或者没有设置,将会报如下的错误:

Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)

FATAL [main] ipc.RpcClientImpl: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.

javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

出现上述错误的原因有如下几点:

第一点:没有使用kinit获取tgt;

第二点:没有正确配置kerberos配置文件;

第三点:客户端与集群时间不一致(时间相差超过5分钟);

第四点:客户端使用的jar包与集群不一致;

第五点:Hadoop环境变量未正确设置。

如果在集群内部可以正常的使用hbase shell,但是在客户端不行,可以在客户端打开调试模式,如下:

在测试之前,先获取票据:

# kinit /data1/hadoop/hbase/conf/hbase.keytab hbase/yjt

# klist (查看票据)

# exprot HBASE_ROOT_LOGGER=DEBUG,console

# hbase shell

使用list列出当前存在的表,如果正常列出,说明客户端配置成功。当然也可以使用创建表的方式测试,如下:

hbase(main):002:0> create 'ns1:t2', 'f2'

注:ns1是表空间,如果不存在,可以使用create_namespace 'ns1'创建

(4) 、客户端使用phoenix连接测试

客户端Phoenix配置(不多说),可以从集群内部拷贝。

测试phoenix,使用./sqlline.py yjt:2181连接到集群。

28043031b37ada7b2fda7571e44044db.png

注:上述用户都是使用hduser用户测试的,这个用户同时也是启动集群的用户,接下来创建不同的用户测试。

3.3、客户端使用不同用户测试

测试hbase shell

(1)、创建普通用户yujt

(2)、echo‘123456’ |passwd --stdin ‘yujt’

(3)、su - yujt

(4)、配置hadoop、jdk环境变量

(5)、hbase shell测试

09d891fc31acbd9312406426e1fa31df.png

测试phoenix

257883dea5f4100bdbc686c3810b6b7d.png

18fa989e9aafd2afa19ac8dadd7f71f4.png

Ok

<think>我们有两个引用内容,其中引用[1]提到了配置hbase-site.xml的几个关键属性,包括hbase.rootdir、hbase.cluster.distributed和hbase.zookeeper.quorum。引用[2]则提到了如果使用外置Zookeeper集群和HadoopHA集群时需要注意的事项。用户需求:在HBase配置文件中设置两个属性:1.hbase.rootdir=hdfs://cluster/hbase2.hbase.zookeeper.quorum=zk1,zk2,zk3步骤:1.定位到HBase的配置文件:通常位于$HBASE_HOME/conf/目录下,需要修改的文件是hbase-site.xml。2.编辑hbase-site.xml文件,添加或修改这两个属性。3.注意:如果使用HDFS集群,且是HA模式(即hdfs://cluster中的cluster是一个服务名,对应多个NameNode),那么还需要将Hadoop的配置文件(core-site.xml和hdfs-site.xml)复制到HBaseconf目录下,否则HBase无法识别HDFS的HA配置[^2]。4.如果使用外置Zookeeper集群(即不是HBase自带的Zookeeper),需要确保hbase-env.sh中设置HBASE_MANAGES_ZK为false,并且将Zookeeper的配置文件zoo.cfg复制到HBaseconf目录下[^2](但用户没有提到这个,我们只配置hbase-site.xml)。具体操作:###1.编辑hbase-site.xml使用文本编辑器(如vim)打开hbase-site.xml:```bashvim$HBASE_HOME/conf/hbase-site.xml```在`<configuration>`标签内添加或修改以下属性:```xml<configuration><!--设置HBase的根目录,指向HDFS--><property><name>hbase.rootdir</name><value>hdfs://cluster/hbase</value></property><!--设置Zookeeper的集群地址--><property><name>hbase.zookeeper.quorum</name><value>zk1,zk2,zk3</value></property><!--其他配置...--></configuration>```注意:-`hdfs://cluster/hbase`中的`cluster`是HDFS服务的逻辑名称(如HadoopHA中配置的nameservice),请确保它与Hadoop集群中的配置一致。-`zk1,zk2,zk3`是Zookeeper集群的主机名(或IP),用逗号分隔。###2.配置HadoopHA(如果需要)如果Hadoop集群是HA模式,需要将Hadoop配置文件复制到HBaseconf目录:```bashcp/path/to/hadoop/etc/hadoop/core-site.xml$HBASE_HOME/conf/cp/path/to/hadoop/etc/hadoop/hdfs-site.xml$HBASE_HOME/conf/```###3.配置hbase-env.sh(如果使用外置Zookeeper)如果使用外置Zookeeper,需要在hbase-env.sh中设置:```bashvim$HBASE_HOME/conf/hbase-env.sh```找到以下行并取消注释(或添加):```bashexportHBASE_MANAGES_ZK=false```###4.复制Zookeeper配置文件(如果使用外置Zookeeper且需要额外配置)如果Zookeeper集群有自定义配置(比如zoo.cfg),可以复制到HBaseconf目录:```bashcp/path/to/zookeeper/conf/zoo.cfg$HBASE_HOME/conf/```###5.注意事项-修改配置后,需要重启HBase才能使配置生效。-确保HBase可以访问所有Zookeeper节点(网络和端口通畅)。-确保HBase可以访问HDFS,并且有权限在HDFS上创建`/hbase`目录。###验证配置启动HBase后,可以通过HBaseWebUI(默认端口16010)查看HBase根目录是否指向正确的HDFS路径,以及Zookeeper的连接状态。###相关引用说明-根据引用[1]配置hbase-site.xml中的关键属性[^1]。-根据引用[2],在HA环境下需要复制Hadoop配置文件[^2]。§§相关问题§§1.如何配置HBase以使用HadoopHA集群?[^2]2.HBase启动时如何验证Zookeeper连接是否正常?3.为什么需要设置`hbase.cluster.distributed`属性?它与HBase的运行模式有什么关系?[^1]</think> ### 配置HBase集群属性指南 以下是配置 `hbase.rootdir` 和 `hbase.zookeeper.quorum` 属性的详细步骤: #### 1. **编辑主配置文件** 打开 `hbase-site.xml` 进行配置: ```bash sudo vim $HBASE_HOME/conf/hbase-site.xml ``` 在 `<configuration>` 标签内添加: ```xml <configuration> <!-- 设置HDFS根目录 --> <property> <name>hbase.rootdir</name> <value>hdfs://cluster/hbase</value> </property> <!-- 配置ZooKeeper集群 --> <property> <name>hbase.zookeeper.quorum</name> <value>zk1,zk2,zk3</value> </property> <!-- 启用分布式模式 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> </configuration> ``` #### 2. **配置环境变量(可选)** ```bash sudo vim $HBASE_HOME/conf/hbase-env.sh ``` 添加或修改: ```bash # 禁用内置ZooKeeper export HBASE_MANAGES_ZK=false ``` #### 3. **HA集群额外配置** 如果HDFS是HA集群: ```bash # 复制Hadoop配置文件 cp $HADOOP_HOME/etc/hadoop/core-site.xml $HBASE_HOME/conf/ cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HBASE_HOME/conf/ ``` #### 4. **验证配置** ```bash hbase shell --config $HBASE_HOME/conf > status ``` 预期输出包含: ``` active master: ... regionservers: 3 zookeeper quorum: zk1,zk2,zk3 ``` #### 关键说明 1. **HDFS路径格式**: - `hdfs://cluster/hbase` 中 `cluster` 是HDFS命名服务ID(需与Hadoop配置一致) - 确保HBase对HDFS目录有写权限:`hdfs dfs -mkdir /hbase && hdfs dfs -chown hbase:hbase /hbase` 2. **ZooKeeper配置要求**: - 所有节点需配置 `/etc/hosts` 解析zk1/zk2/zk3 - 默认端口2181,如需修改端口: ```xml <property> <name>hbase.zookeeper.property.clientPort</name> <value>2182</value> </property> ``` 3. **配置生效**: - 修改后需重启HBase:`stop-hbase.sh && start-hbase.sh` - 检查日志:`tail -f $HBASE_HOME/logs/hbase-*.log` 4. **安全性配置**(若启用Kerberos): ```xml <property> <name>hbase.security.authentication</name> <value>kerberos</value> </property> ``` 根据引用[1],配置分布式模式时需要同时设置 `hbase.cluster.distributed=true`[^1];根据引用[2],HA集群需复制Hadoop配置文件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值