接上篇《HBase + Kerberos配置示例(一)》,我们继续剩下的配置工作。

环境准备

  • 安装hadoop/zookeeper/hbase

我在kbhbase1这个机器上已经安装好了hadoop,zookeeper,hbase,为了简单起见所有在东西都跑在这台机器上。同时检查了在没在启用kerberos的情况下,hbase工作正常。

  • 禁用selinux

#vim /etc/sysconfig/selinux 设置SELINUX=disabled,并重启

  • 安装JCE

从Oracle网站下载JCE(Java Cryptography Extension)补丁,此补丁与AES-256加密有关。下载解压之后,把得到的两个jar文件local_policy.jar,US_export_policy.jar拷贝到$JAVA_HOME/ jre/lib/security下进行覆盖。

Hadoop配置

创建keytab

  • kadmin: addprinc -randkey root/kbhbase1.mh.com@MH.COM
  • kadmin: xst -k root.keytab root/kbhbase1.mh.com

这样就会在kerberos服务器上创建一个用户root/kbhbase1.mh.com@MH.COM,其中名字中/之后的部分应该是固定写法,即主机名+kerberos realm,红色部分则可以随意。xst命令会在当前目录下生成这个root.keytab文件。拷贝root.keytab文件到hadoop的配置目录,在我的机器上是:/usr/local/hadoop-2.6.0/etc/hadoop

修改core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://kbhbase1.mh.com:9000</value>
</property> <property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
<!-- Giving value as "simple" disables security.-->
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
</configuration>

修改hadoop-env.sh

  • export HADOOP_SECURE_DN_USER=root
  • export JSVC_HOME=/usr/local/hadoop-2.6.0/libexec/

关于JSVC,默认指向hadoop安装目录的libexec下,但我的libexec下并没有jsvc文件(我的hadoop是直接下载的tar.gz包,不是rpm安装),google搜索jsvc,然后在apache网站下载源代码包以及bin包,我下的是commons-daemon-1.0.15-src.tar.gz及commons-daemon-1.0.15-bin.tar.gz,先解压src包后进入src/native/unix目录依次执行 ./configure命令, make命令,这样会在当前目录下生成一个叫jsvc的文件,把它拷贝到hadoop目录下的libexec下。 再解压bin包,然后把得到的commons-daemon-1.0.15.jar 文件拷贝到hadoop安装目录下share/hadoop/hdfs/lib下,同时删除自带版本的commons-daemon-xxx.jar包。

修改hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopdata/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopdata/datanode</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>kbhbase1.mh.com:9001</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<!-- NameNode security config -->
<property>
<name>dfs.https.address</name>
<value>kbhbase1.mh.com:50470</value>
</property>
<property>
<name>dfs.https.port</name>
<value>50470</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/usr/local/hadoop-2.6.0/etc/hadoop/root.keytab</value> <!-- path to the HDFS keytab -->
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<!-- Secondary NameNode security config -->
<property>
<name>dfs.secondary.https.address</name>
<value>kbhbase1.mh.com:50495</value>
</property>
<property>
<name>dfs.secondary.https.port</name>
<value>50495</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/usr/local/hadoop-2.6.0/etc/hadoop/root.keytab</value> <!-- path to the HDFS keytab -->
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.https.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<!-- DataNode security config -->
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/usr/local/hadoop-2.6.0/etc/hadoop/root.keytab</value> <!-- path to the HDFS keytab -->
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<property>
<name>dfs.datanode.kerberos.https.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>root/_HOST@MH.COM</value>
</property>
<property>
<name>dfs.datanode.require.secure.ports</name>
<value>false</value>
</property>
</configuration>

由于暂时不需要mapreduce,所以相关的设置我就没配。

启动hadoop hdfs

  • # start-dfs.sh

namenode,secondarynamenode可以起来,不过datanode没起来,仔细看start-dfs.sh的输出:

Attempting to start secure cluster, skipping datanodes. Run start-secure-dns.sh as root to complete startup.

所以需要执行start-secure-dns.sh(或者使用hadoop datanode命令启动),在我的机器上,起来之后,使用jps查看,datanode进程有进程号,但没有名字。

如遇到:

WARN security.UserGroupInformation: Exception encountered while running the renewal command. Aborting renew thread. ExitCodeException exitCode=1: kinit: Ticket expired while renewing credentials

具体看hadoop日志,会有若干个CheckSum错误,则需要在kdc上:

  • kadmin.local: modprinc -maxrenewlife 1week root/kbhbase1.mh.com@MH.COM

关于kerberos ticket的一些解释

一个ticket有lifetime,如果需要更长的时间,那么就需要重复地去renew它,每renew一次,就延长一个lifetime。renew就是可以不用输入密码就延长一个ticket的使用时间。 不过,renew这个操作本身也有时间限制,这取决于参数renew_lifetime,比如这个参数设置成7d,那么也就是说从ticket创建那时开始之后的7天内,你都可以做renew操作(每次renew操作需在ticket尚未过期前做)。

Zookeeper配置

创建keytab

  • kadmin: addprinc -randkey zookeeper/kbhbase1.mh.com@MH.COM
  • kadmin: xst -k zookeeper.keytab zookeeper/kbhbase1.mh.com

把生成的zookeeper.keytab 放到/usr/local/zookeeper-3.4.6/conf下

修改jaas.conf

Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/usr/local/zookeeper-3.4.6/conf/zookeeper.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper/kbhbase1.mh.com@MH.COM";
};

修改java.env

  • export JVMFLAGS="-Djava.security.auth.login.config=/usr/local/zookeeper-3.4.6/conf/jaas.conf"
  • export JAVA_HOME="/usr/lib/jvm/jdk7"

修改zoo.cfg

tickTime=2000
dataDir=/root/zookeeperdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=kbhbase1.mh.com:2888:3888 kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

HBase配置

创建keytab

  • kadmin: addprinc -randkey hbase/kbhbase1.mh.com@MH.COM
  • kadmin: xst -k hbase.keytab hbase/kbhbase1.mh.com

将生成的文件拷贝到hbase配置目录/usr/local/hbase-0.98.9-hadoop2/conf

修改hbase-env.sh

  • export JAVA_HOME=/usr/lib/jvm/jdk7/
  • export HBASE_OPTS="-XX:+UseConcMarkSweepGC -Djava.security.auth.login.config=/usr/local/hbase-0.98.9-hadoop2/conf/zk-jaas.conf"
  • export HBASE_MANAGES_ZK=false

修改hbase-site.xml

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://kbhbase1.mh.com:9000/hbase</value>
<description>The directory shared by region servers.</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect.
</description>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>kbhbase1.mh.com</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/root/hbasedata</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property> <property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rpc.engine</name>
<value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property> <property>
<name>hbase.regionserver.kerberos.principal</name>
<value>hbase/_HOST@MH.COM</value>
</property> <property>
<name>hbase.regionserver.keytab.file</name>
<value>/usr/local/hbase-0.98.9-hadoop2/conf/hbase.keytab</value>
</property> <property>
<name>hbase.master.kerberos.principal</name>
<value>hbase/_HOST@MH.COM</value>
</property> <property>
<name>hbase.master.keytab.file</name>
<value>/usr/local/hbase-0.98.9-hadoop2/conf/hbase.keytab</value>
</property>
</configuration>

修改zk-jaas.conf

Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
keyTab="/usr/local/hbase-0.98.9-hadoop2/conf/hbase.keytab"
principal="hbase/kbhbase1.mh.com@MH.COM";
};

启动hbase

  • start-hbase.sh

启动hbase 如遇:

2015-04-11 14:20:58,538 FATAL [master:kbhbase1:60000] master.HMaster: Unhandled exception. Starting shutdown. org.apache.hadoop.security.AccessControlException: Permission denied: user=hbase, access=WRITE, inode="/hbase":root:supergroup:drwxr-xr-x

我的hbase是直接从tar.gz包解压安装的,所有的都有linux的root跑。这个错误信息表示在hbase使用的默认用户“hbase”没有对hdfs文件系统中的/hbase目录的访问权限。 尝试使用

  • # hadoop fs -chmod -R 777 /hbase

或使用

  • # hadoop fs –rmr /hbase

遇到

rmr: Permission denied: user=admin, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

这里的user,应该是我之前kinit的用户,这个错误也就是说,我当前在kbhbase1这台机器上使用的kerberos身份证是admin/admin,而hdfs的/hbase目录属于root用户,所以没有权限对它进行更改权限的操作。 所以我添加了一个root/admin

  • kadmin: addprinc root/admin
  • # kinit root/admin
  • # hadoop fs -chmod -R 777 /hbase

这就ok了 启动成功之后,可以用hbase shell来试一下,当然,在执行hbase shell前,事先要有kinit一下,你可以使用刚才建的root/admin,或者别的。

Java测试程序

在kbjavatest1安装kerberos客户端,从kbhbase1上拷贝hbase-site.xml到本机的某个目录。连接kadmin工具创建用户javatest,并生成keytab文件:

  • kinit admin/admin
  • kadmin: addprinc -randkey javatest
  • kadmin: xst -k javatest.keytab javatest

创建java project,添加对hbase jar的引用,编写java代码,运行时注意把刚才拷贝来的hbase-site.xml放到运行的classpath中(eclipse可以通过Run Configurations>>Classpath配置)

public class Test1 {

        public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Configuration conf = HBaseConfiguration.create();
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("javatest@MH.COM", "/root/Downloads/javatest.keytab");
//
HTable t = new HTable(conf, "test");
Scan s = new Scan();
ResultScanner rs = t.getScanner(s);
try{
for(Result r:rs){
for(Cell cell:r.rawCells()){
System.out.println("Row: "+new String(CellUtil.cloneRow(cell)));
System.out.println("CF: "+new String(CellUtil.cloneFamily(cell)));
System.out.println("Qualifier: "+new String(CellUtil.cloneQualifier(cell)));
System.out.println("Value: "+new String(CellUtil.cloneValue(cell)));
}
}
}finally{
t.close();
} System.out.println("Done!"); }

送书了,送书了,关注公众号“程序员杂书馆”,送出O'Reilly《Spark快速大数据分析》纸质书(亦有一批PDF分享)! —— 2018年12月

HBase + Kerberos 配置示例(二)的更多相关文章

  1. HBase + Kerberos 配置示例(一)

    用过hbase的朋友可能都有过这样的疑问,我写一个java client,好像就提供了zookeeper quorum地址就连上hbase了,那么是不是存在安全问题?的确是,如何解决?hbase中引入 ...

  2. H3C PPP MP配置示例二(续)

  3. H3C PPP MP配置示例二

  4. H3C CHAP验证配置示例二

  5. H3C 单区域OSPF配置示例二

  6. 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录

    目录 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录 StdPeriphLi ...

  7. HBase框架基础(二)

    * HBase框架基础(二) 上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程. * HBase的读写流程及3个机制 HBase的读数据流程: 1.HRe ...

  8. Hbase安装配置(靠谱亲测)

    Hbase是Hadoop生态系统中的NoSql列式数据库.通过Hbase,可以进行数据读写,比较适合Top n场景.Hbase搭建的系统,瓶颈在于硬盘的传输速度.RDBMS一般的瓶颈在于寻道速度. 实 ...

  9. Nginx 简单的负载均衡配置示例(转载)

    原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...

随机推荐

  1. POJ 3181 Dollar Dayz DP

    f[i][j]=f[i-j][j]+f[i][j-1],结果很大需要高精度. //#pragma comment(linker, "/STACK:1024000000,1024000000& ...

  2. c++中级 STL基础学习(二)

    deque 和vector差不多,可以在前端后端插入,一般用deque取代vector,vector只能在后端插入push_back().deque还可以push_front(),但是deque后端插 ...

  3. 本地Mac如何搭建IPv6环境

    http://blog.csdn.net/dancen/article/details/51595374 这篇文章写的很详细,借鉴用啦-

  4. DOM、JDOM、DOM4J的区别(转载)

    DOM.JDOM.DOM4J的区别 分类: XML2012-06-11 20:47 5576人阅读 评论(6) 收藏 举报 文档xmlcollectionsjavaapi工作 dom是解析xml的底层 ...

  5. c# 通过关键字查询

    1:首先需要在前端显示界面View视图中添加查询按钮: <div> <div>@Html.NopLabelFor(model => model.IndividualNam ...

  6. centos6.5中 nginx-1.6.3 编译安装

    参考来源:http://nginx.org/en/docs/configure.html nginx-1.6.3 编译安装:1) ./configure --help 查看编译选项 2) 需要安装一下 ...

  7. 用scala实现一个sql执行引擎-(下)

    执行 上一篇讲述了如何通过scala提供的内置DSL支持,实现一个可以解析sql的解析器,这篇讲如何拿到了解析结果-AST以后,如何在数据上进行操作,得到我们想要的结果.之前说到,为什么选择scala ...

  8. 中兴手机关闭3G网络

    手机总是自动在2G和3G之间切换,关闭3G算了. 拨*983*683# 出来画面,然后选GSM Only即可 网上还有另一种方法: *#*#4636#*#* 在这个里,我没有找到GSM Only

  9. What's New in C# 6.0

    Static Types as using So, we are all quite familiar with this notion of accessing static class membe ...

  10. elixir 高可用系列(五) Supervisor

    概述 OTP 平台的容错性高,是因为它提供了机制来监控所有 processes 的状态,如果有进程出现异常, 不仅可以及时检测到错误,还可以对 processes 进行重启等操作. 有了 superv ...