接上篇《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. python学习之路-day4-装饰器&json&pickle

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 一.生成器 1.列表生成式 >>> L = [x * x for x in range(10 ...

  2. windows防火墙打不开的处理办法

    一.防火墙配置出错 开始-->运行-->gpedit.msc 这时,打开了组策略 在左面分级展开 计算机配置-->管理模板-->网络-->网络连接-->Window ...

  3. css3之动画

    animation属性 属性 描述 @keyframes 动画名 动画关键帧 animation 动画的6个属性 animation-name 动画的名称 animation-duration 动画的 ...

  4. php中::的使用方法

    (转载于http://www.nowamagic.net/php/php_UsageOfDoubleColon.php) 双冒号操作符即作用域限定操作符Scope Resolution Operato ...

  5. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. 超链接的#和javascript:void(0)的区别

    转载于:http://www.uw3c.com/cssviews/css12.html   在工作中,如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href=" ...

  7. Excel VBA自动添加证书

    ---恢复内容开始--- 在说这个话题之前,我先解释一下为什么要加数字证书签名,它有什么作用,后面再解释如何添加.首先解释下证书添加的位置,如下图所示: 1.单击左上角的Office 按钮,选择右下角 ...

  8. [SmartFoxServer概述]Zones和Rooms结构

    Zones和Rooms结构: 相对于SFS 1.X而言,在Zones和Rooms的配置上,SFS2X有了显著的改善.尤其是我们建立了房组这样一个简单的概念,它允许在一个逻辑组中管理Rooms,从而独立 ...

  9. Debian 8 最小化系统安装muduo

    最近开始学习陈硕的muduo C++ Linux多线程网络库,首先当然是要安装.其间遇到过不少问题,最后不能说都解决了,只能说找到了一条不会遇到什么问题的路线.总结起来是两点: 注意各软件之间要版本匹 ...

  10. 配置本地IIS和VS自带IIS

    以前调试网站一直用的vs自带的IIS,做为学习没啥大碍,但要是用于团队项目开发就会带来诸多不便.团队开发项目有统一的网站端口号.文件目录什么的,端口号可以在配置文件中修改倒也没啥,但是要在自己的项目中 ...