社区原文 “Connecting to HBase in a Kerberos Enabled Cluster”
讲解如何通过 Java 或 Scala 在启用 Kerberos 的群集中连接到 HBase。
本测试需要一个启用了kerberos的HDP集群。集群搭建参考 《Ambari在本地VM(centos7.3)部署hadoop集群》 。本测试在HDP集群的C7302节点(centos7.3)上进行。首先,下载java样例代码:
$ cd /opt $ git clone https://github.com/wbwangk/hdp-test-examples
这个github库是从 jjmeyer0/hdp-test-examples
库fork的。主要修改有:
src/main/java/com/jj/hbase/HBaseClient.java
中 jj 用户主体为 jj@AMBAR.APACHE.ORGI
在 c7302 节点用管理员账号登录 KDC,然后创建叫jj的主体,并导出 keytab:
$ kinit root/admin@AMBARI.APACHE.ORG $ kadmin -q "addprinc jj" (创建jj主体,需要输入两次密码,密码是1) $ ktutil ktutil: addent -password -p jj -k 1 -e RC4-HMAC Password for jj@AMBARI.APACHE.ORG: 1 ktutil: wkt jj.keytab (生成了keytab文件) ktutil: q $ scp jj.keytab /opt/hdp-test-examples/src/main/resources
jj 用户必须在 HBase 中获得正确的权限。Ambari 为 HBase创建一个管理员用户,通过 keytab 查找管理员用户主体。并利用它登录,利用密钥文件登录不需要密码:
$ klist -kt /etc/security/keytabs/hbase.headless.keytab (查看hbase服务的printcipal ) KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 1 07/06/2017 03:53:35 hbase-hdp2610@AMBARI.APACHE.ORG $ kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-hdp2610 (实测只能用这个主体登录,即使root/admin主体都不行) $ hbase shell hbase(main):001:0> grant 'jj','RW'
运行例子需要的文件有三个:
由于使用HDP集群的节点充当客户机,所以直接在本节点复制文件即可:
$ scp /etc/hbase/conf/hbase-site.xml /opt/htp-test-examples/src/main/resources/ $ scp /etc/krb5.conf /opt/htp-test-examples/src/main/resources/
对于测试,建议在 hbase-site.xml 中更改 “hbase.client.retries.number” 属性。默认情况下为35。这个“重试次数”这在运行测试时太大了,复制后可以修改为3。
目录 /opt/hdp-test-examples/src`下有两个目录:`main`和`test`。`main`目录放置客户端程序,而`test`目录是单元测试目录。 来到目录`/opt/hdp-test-examples/src/test/java/com/jj
下看看,发现除了hbase还有个pig目录。如果只是测试java客户端连接hbase,建议删除pig目录。否则在maven构建是也会执行pig的单元测试,而由于没有正确配置pig,导致必然出错使构建失败。
例子的 Java 代码位于 src/main/java/com/jj/hbase/HBaseClient.java
。在代码中,首先需要做的是创建和加载 HBase 配置:
// Setting up the HBase configuration Configuration configuration = new Configuration(); configuration.addResource("src/main/resources/hbase-site.xml");
接下来指向 krb5.conf 文件并设置 Kerberos 主体和 keytab。
// Point to the krb5.conf file. System.setProperty("java.security.krb5.conf", "src/main/resources/krb5.conf"); System.setProperty("sun.security.krb5.debug", "true"); // Override these values by setting -DkerberosPrincipal and/or -DkerberosKeytab String principal = System.getProperty("kerberosPrincipal", "jj@AMBARI.APACHE.ORG"); String keytabLocation = System.getProperty("kerberosKeytab", "src/main/resources/jj.keytab");
现在使用上面定义的主键和 keytab 登录。
UserGroupInformation.setConfiguration(configuration); UserGroupInformation.loginUserFromKeytab(principal, keytabLocation)
$ cd /opt/hdp-test-examples $ mvn clean test -P hdp-2.6.1 (如果网络差则耗时较长) [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building hdp-test-examples 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ hdp-test-examples --- [INFO] Deleting /opt/hdp-test-examples/target [INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ hdp-test-examples --- [debug] execute contextualize [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 10 resources [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ hdp-test-examples --- [INFO] Compiling 5 source files to /opt/hdp-test-examples/target/classes [INFO] [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ hdp-test-examples --- [debug] execute contextualize [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ hdp-test-examples --- [INFO] Compiling 1 source file to /opt/hdp-test-examples/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ hdp-test-examples --- [INFO] Surefire report directory: /opt/hdp-test-examples/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.jj.hbase.HBaseClientTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.552 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.145s [INFO] Finished at: Wed Jul 19 07:19:34 UTC 2017 [INFO] Final Memory: 38M/91M [INFO] ------------------------------------------------------------------------
可以自己读一下单元测试代码 /opt/hdp-test-examples/src/test/java/com/jj/hbase/HBaseClientTest.java
。看上去,代码中它似乎连接上 HBase,然后建表并插入几行数据。
这里是 完整代码 。
前文是在 Centos7.3下进行的测试。下面在 Windows下进行测试。毕竟很多人使用 Windows+Eclipse 进行开发。下面的测试并没有直接使用 Eclipse,而是更直接的命令行测试。希望有人能够补充上 Eclipse 下的测试。关于 Eclipse 下的相关配置可以参考 hortonworks 的一篇 社区文章(“Hortonworks Data Platform Artifacts”) 。
测试使用了git bash命令行工具。git base在 Windows 下模拟的类似 Linux 的命令,但实际上使用的 Windows 操作系统文件。关于 git base 的安装使用参考 这个文档《Ambari 在本地 VM 部署 Hadoop 集群》 。在 git base 上测试通过后,之后又直接在 Windows 命令行下进行了测试。需要说明的是,git bash 和 Windows 使用了不同的环境变量,如PATH。
在 Windows 下需要安装 JDK1.8 和 Maven。Maven是 Java 实现的,所以是所有平台通用的。在 Maven 的 这篇文档(“Maven on Windows”)
中要求 JDK 的安装目录名称不要有空格(如 Program Files
就不行)。Maven被我安装在了 e:/maven
。在 git bash 下运行 Maven 的方法是 /e/maven/bin/mvn
。
测试在 Windows 的 e:/opt
目录下进行。以下操作在 git bash 窗口中进行:
$ cd /e/opt $ git clone https://github.com/wbwangk/hdp-test-examples $ cd hdp-test-examples $ scp root@c7302:/etc/krb5.conf src/main/resources/ $ scp root@c7302:/etc/hbase/conf/hbase-site.xml src/main/resources/ $ scp root@c7302:/opt/hdp-test-examples/src/main/resources/jj.keytab src/main/resources/
上述三个 scp 操作时把测试用到3个配置文件从 Linux 下网络复制到了 Windows 下。确保 Windows 的 hosts 文件中定义了3台虚拟机的 IP 和域名。
$ /e/maven/bin/mvn clean test -P hdp-2.6.1 (省略一些下载信息) ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.jj.hbase.HBaseClientTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.42 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:27 min [INFO] Finished at: 2017-07-20T07:40:15+08:00 [INFO] Final Memory: 31M/206M [INFO] ------------------------------------------------------------------------
进入 Windows 命令行后:
$ e: $ cd /opt/hdp-test-examples E:/opt/hdp-test-examples> mvn clean test -P hdp-2.6.1 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building hdp-test-examples 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hdp-test-examples --- [INFO] Deleting E:/opt/hdp-test-examples/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hdp-test-examples --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 10 resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hdp-test-examples --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 5 source files to E:/opt/hdp-test-examples/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hdp-test-examples --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hdp-test-examples --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to E:/opt/hdp-test-examples/target/test-classes [WARNING] /E:/opt/hdp-test-examples/src/test/java/com/jj/hbase/HBaseClientTest.java: E:/opt/hdp-test-examples/src/test/java/com/jj/hbase/HBaseClientTest.java使用了未经检查或不安全的操作。 [WARNING] /E:/opt/hdp-test-examples/src/test/java/com/jj/hbase/HBaseClientTest.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hdp-test-examples --- [INFO] Surefire report directory: E:/opt/hdp-test-examples/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.jj.hbase.HBaseClientTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.318 sec Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.624 s [INFO] Finished at: 2017-07-20T08:15:17+08:00 [INFO] Final Memory: 30M/321M [INFO] ------------------------------------------------------------------------