前言

随着Hadoop等大数据技术的普及,其平台的安全性日益受到企业的重视,特别是对安全性要求较高的通信、金融等领域。而安全性主要包括两个部分:Authentication Authorization
本文侧重于Authentication 方面,旨在通用整合Kerberos,提升大数据平台的安全性,降低风险。
至于Authorization方面内容,另有篇幅描述。


目录


一、 环境 3

二、 准备工作 3

三、 Hadoop安装配置 5

四、 Kerberos安装配置 7

五、 Secure Hadoop安装 9

六、 Zookeeper安装 14

七、 Secure Zookeeper安装 16

八、 HBase安装 17

九、 Secure HBase安装 19

十、 部分异常解决方案 20


 

一、环境

1. 系统均为CentOS6.5 64位,JDK1.7u67

2. 节点列表:

smexplore1为Master

smexplore2为Slave

机器名称

外网地址

内网地址

Smexplore1

---------------

192.168.1.35

Smexplore2

---------------

192.168.1.36

Smexplore3

---------------

192.168.1.37

 

注:外网地址仅为连接外部网络使用,集群内部通信使用内网地址。

3. 软件版本:

Hadoop 2.2.0 HBase 0.94.23 Zookeeper 3.4.5

二、准备工作

1. 搭建必备开发库(如系统linuxRed Hat,且yum未注册,请先参阅章十部分异常解决方案内‘为Red Hat修改yum源’一节)

运行命令:

yum -y install lzo-devel zlib-devel gcc autoconf automake libtool cmake openssl-devel

yum install byacc

yum install flex

注:因本次所使用hadoop版本均已重新编译,如需按Hadoop源码重新编译,请安装ptoroc,且Hadoop2.2.0源码有BUG,需要patch后才能编译,下面为patch网址

Patch :https://issues.apache.org/jira/browse/HADOOP-10110

2. 安装JDK

[root@smexplore1 opt]# rpm -ivh jdk-7u67-linux-x64.rpm

[root@smexplore1 /]# cd /usr/java/

[root@smexplore1 java]# ln -s jdk1.7.0_67 jdk

3. 修改hosts文件

[root@smexplore1 opt]# vim /etc/hosts

192.168.1.35 smexplore1

192.168.1.36 smexplore2

192.168.1.37 smexplore3

 

注:第一部分为IP地址,后面对应主机号。

4. 关闭防火墙

重启后永久性生效:

开启:chkconfig iptables on

关闭:chkconfig iptables off

即时生效,重启后失效:

开启:service iptables start

关闭:service iptables stop

四条命令需要在每台机子上都执行一次。

5. SSH搭建

建立SSH,使群集可以互相免密码访问,下面以smexplore1与smexplore2为例

在smexplore1上:

[root@smexplore1 ~]# ssh-keygen -t rsa

 

遇到提示输入文件名或是密码的地方不用管,只需按回车键即可。完成之后,在/root(root”是登录名)目录下会有生成 一个".ssh"目录,“ls .ssh”之后会发现里面有两个文件,一个是id_rsa,另一个是id_rsa.pub,前者是私钥,后者是公钥。

执行:

[root@smexplore1 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

[root@smexplore1 ~]# mkdir  ~/.ssh/other

[root@smexplore1 ~]# ssh localhost

[root@smexplore1 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub smexplore2

[root@smexplore1 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub smexplore3

分别在smexplore2smexplore3上执行:

[root@smexplore1 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub smexplore1

 

master上执行ssh smexploreX,完成初始。

当前为两台机子的实例,如有多台机子,至少应该完成master(smexplore1)节点到众多slave节点的SSH无密码登录)

6. 配置环境变量

[root@smexplore1 ~]# vim /etc/profile

在文件最下方加入以下内容

export JAVA_HOME=/usr/java/jdk

export JRE_HOME=/usr/java/jdk/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

#Hadoop variables  

export HADOOP_HOME=/plat/hadoop  

export PATH=$PATH:$HADOOP_HOME/bin  

export PATH=$PATH:$HADOOP_HOME/sbin  

export HADOOP_MAPRED_HOME=$HADOOP_HOME  

export HADOOP_COMMON_HOME=$HADOOP_HOME  

export HADOOP_HDFS_HOME=$HADOOP_HOME  

export YARN_HOME=$HADOOP_HOME  

###end of paste  [root@smexplore1 ~]# source /etc/profile  让其java命令立即生效

[root@smexplore1 ~]# java   执行java命令,正常执行则表示java安装完成

7. 新建用户

用户hadoop为启动hdfs的用户。

[root@smexplore1 ~]#useradd -g root hadoop

用户组yarn为启动mapreduce的用户组,且新添用户yarn

[root@smexplore1 ~]#groupadd yarn

[root@smexplore1 ~]#usermod -a -G yarn root

[root@smexplore1 ~]#useradd -g root yarn

[root@smexplore1 ~]#usermod -a -G yarn yarn

 

用户hbase为启动HBase的用户

[root@smexplore1 ~]#useradd -g root hbase

三、Hadoop安装配置

1. 安装Hadoop

解压Hadoop,重命名为hadoop且放于plat文件夹下。

[root@smexplore1 opt]# tar -xvf hadoop-2.2.0.tar.gz 

[root@smexplore1 opt]# mv hadoop-2.2.0 /plat/hadoop

 

2. Hadoop配置文件解释

 

hadoop-env.sh:用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoopJVM指定特定的选项、指定日志文件所在的目录路径以及slave文件的位置等;

 

core-site.xml: 用于定义系统级别的参数,它作用于全部进程及客户端,如HDFS URLHadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;

 

hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;

 

mapred-site.xml:mapreduce的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置,在Hadoop2中,在此文件内指定其所使用的mapreduce框架,默认为yarn

 

slaves:Hadoop集群的slave(datanode)tasktracker的主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNodeNodeManager进程;

 

yarn-site.xml:Hadooop2采用全新的Yarn架构,此文件配置了yarn的相关属性,

 

 

3. 修改hadoop-env.sh

[root@smexplore1 hadoop]# vim etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/java/jdk

 

4. 修改core-site.xml

[root@smexplore1 hadoop]# vim etc/hadoop/core-site.xml

<configuration>

<property>

       <name>hadoop.tmp.dir</name>

       <value>/home/hadoop/tmp</value>

</property>

<property>

       <name>fs.default.name</name>

       <value>hdfs://192.168.1.35:9000</value>

</property>

</configuration>

 

hadoop.tmp.dir属性用于定义Hadoop的临时目录,其默认为/tmp/hadoop-#{username}HDFS进程的许多目录默认都在此目录中,需要注意的是,要保证运行Hadoop进程的用户对其具有全部访问权限。

 

fs.default.name属性用于定义HDFS的名称节点和其默认的文件系统,其值是一个URI,即NameNodeRPC服务器监听的地址(可以是主机名)和端口(默认为8020)。其默认值为file:///,即本地文件系统。

5. 修改hdfs-sit.xml

[root@smexplore1hadoop]# vim etc/hadoop/hdfs-site.xml

 

<configuration>

       <property>

               <name>dfs.data.dir</name>

                <value>/home/hadoop/data</value>

        </property>

<property>  

       <name>dfs.name.dir</name>  

       <value>/home/hadoop/name</value>  

</property>

        <property>

               <name>dfs.replication</name>

               <value>1</value>

        </property>

</configuration>

 

dfs.name.dir属性定义的HDFS元数据持久存储路径,默认为#{hadoop.tmp.dir}/dfs/name

dfs.replication属性定义保存副本的数量,默认是保存3份,这里设置为1

6. 修改mapred-sit.xml

[root@smexplore1 hadoop]# vim etc/hadoop/mapred-site.xml

 <configuration>  

    <property>  

            <name>mapreduce.framework.name</name>  

            <value>yarn</value>  

    </property>  

</configuration>  

7. 修改slaves文件

此文件只需要在master主机节点上编辑即可,用于指定各(TaskTrackerDateNode)的主机名或IP

[root@smexplore1hadoop]# vim etc/hadoop/slaves

192.168.1.36

192.168.1.37

 

Hadoop集群启动

1. 格式化

HDFS文件系统第一次启动前需要格式化,创建元数据数据结构。

[root@smexplore1 hadoop]# bin/hadoop namenode -format

2. 启动

[root@smexplore1hadoop]# bin/start-dfs.sh

[root@smexplore1hadoop]# bin/start-yarn.sh

3. 验证启动

通过jps命令查看当前进程,Master节点当同时存在secondarynamenodenomenoderesourceManager三个进程,Slave节点当同时存在datanodenodemanager。

四、Kerberos安装配置

此处选用krb5-1.8.3-signed.tar

[root@smexplore1 opt]# tar -zxvf krb5-1.8.3-signed.tar

[root@smexplore1 opt]# cd krb5-1.8.3/src

[root@smexplore1 opt]#  ./configure

[root@smexplore1 opt]#  make

[root@smexplore1 opt]#  make install

a) 修改配置文件

此时/etc/下应该有krb5.conf文件(若无则新建),修改其内容为:

[kdc]

 profile = /usr/local/var/krb5kdc/kdc.conf

 

[logging]

 default = FILE:/var/log/krb5libs.log

 kdc = FILE:/var/log/krb5kdc.log

 admin_server = FILE:/var/log/kadmind.log

 

[libdefaults]

 default_realm = EXAMPLE.COM

 dns_lookup_realm = true

 dns_lookup_kdc = true

 ticket_lifetime = 24h

 forwardable = true

 ccache_type = 4

 proxiable = true

  renew_lifetime = 7d

 

[realms]

 EXAMPLE.COM = {

  kdc = kerberos.example.com

  admin_server = kerberos.example.com

 }

 

[domain_realm]

 .example.com = EXAMPLE.COM

 example.com = EXAMPLE.COM

 

[login]

 krb4_convert = true

 krb4_get_tickets = false

其中KDC机器上需要上段配置代码中的[kdc]部分,KDC机器会根据该部分中的profile所指位置找到它自己的配置文件。

 

在/usr/local/var/krb5kdc/下新建kdc.conf文件,内容如下:

[kdcdefaults]

 v4_mode = nopreauth

 kdc_ports = 750,88

 kdc_tcp_ports = 88

 

[realms]

 EXAMPLE.COM = {

  acl_file = /usr/local/var/krb5kdc/kadm5.acl

  dict_file = /usr/share/dict/words

  admin_keytab = /usr/local/var/krb5kdc/kadm5.keytab

  kdc_ports = 750,88

  max_life = 1d 0h 0m 0s

  max_renewable_life = 7d 0h 0m 0s

  supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm

  default_principal_flags = +preauth

 }

在/usr/local/var/krb5kdc/下新建kadm5.acl文件,内容如下:

*/admin@EXAMPLE.COM *

以上配置文件告诉Kerberos Admin Server所有admin拥有一切权限。

修改hosts文件,加入以下内容

[root@smexplore1 opt]# vim /etc/hosts

192.168.1.35 smexplore1

192.168.1.36 smexplore2

192.168.1.37 smexplore3

 

192.168.1.35 kerberos.example.com kerberos

192.168.1.35 kdc.example.com kdc

192.168.1.35 example.com

新建Kerberos数据库

# /usr/local/sbin/kdb5_util create -r EXAMPLE.COM -s

执行以上命令的时候你会被要求输入密码,该密码就为数据库密码,请牢记或备份。

 

b) 初始化用户信息

# /usr/local/sbin/kadmin.local

kadmin.local: addprinc admin/admin@EXAMPLE.COM

生成admin keytab文件

ktadd -k /usr/local/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw

退出

quit

c) 启动KDC和kadmind

[root@smexplore1 ~]# /usr/local/sbin/krb5kdc

[root@smexplore1 ~]# /usr/local/sbin/kadmind

为了使集群内所有机器都有Kerberos工具,你需要在集群中每个机器上安装Kerberos程序。并给出/etc/krb5.conf配置文件,并不需要做其他配置。

注:作为Kerberos KDC服务的机子,在每次重新启动时,必须再次启动kadmindkrb5kdc。也可以使用如下命令,使其随主机启动

chkconfig krb5kdc on

chkconfig kadmin on

五、Secure Hadoop安装

 

1. 首先在KDC上为Kerberos添加一个新的管理员hadoop/admin

[root@smexplore1 conf]# /usr/local/sbin/kadmin.local

addprinc root/admin@EXAMPLE.COM

 

2. 这步需要在Hadoop集群的每台机器上执行,请自动替换下列命令中hostname为当前机器的全名:

kadmin: addprinc -randkey host/hostname

kadmin: addprinc -randkey hadoop/hostname

kadmin: ktadd -k /plat/hadoop/etc/hadoop/hadoop.keytab hadoop/hostname host/hostname

3. 在KDC上添加Hadoop用户:

# kadmin.local

kadmin: addprinc hadoop

4. 配置文件

core-site.xml

 

<property>

<name>hadoop.proxyuser.hduser.hosts</name>

<value>*</value>

</property>

<property>

<name>hadoop.proxyuser.hduser.groups</name>

<value>*</value>

</property>

<property>

  <name>hadoop.security.authentication</name>

  <value>kerberos</value> <!-- A value of "simple" would disable security. -->

</property>

<property>

  <name>hadoop.security.authorization</name>

  <value>true</value>

</property>

hdfs-site.xml 

<!-- General HDFS security config -->

<property>

  <name>dfs.block.access.token.enable</name>

  <value>true</value>

</property>

 

<!-- NameNode security config -->

<property>

  <name>dfs.namenode.keytab.file</name>

  <value>/plat/hadoop/conf/hadoop.keytab</value> <!-- path to the HDFS keytab -->

</property>

<property>

  <name>dfs.namenode.kerberos.principal</name>

  <value>root/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>dfs.namenode.kerberos.internal.spnego.principal</name>

  <value>host/_HOST@EXAMPLE.COM</value>

</property>

 

<!-- Secondary NameNode security config -->

<property>

  <name>dfs.secondary.namenode.keytab.file</name>

  <value>/plat/hadoop/conf/hadoop.keytab</value> <!-- path to the HDFS keytab -->

</property>

<property>

  <name>dfs.secondary.namenode.kerberos.principal</name>

  <value>root/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>

  <value>host/_HOST@EXAMPLE.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>/plat/hadoop/conf/hadoop.keytab</value> <!-- path to the HDFS keytab -->

</property>

<property>

  <name>dfs.datanode.kerberos.principal</name>

  <value>root/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>dfs.journalnode.keytab.file</name>

  <value>/plat/hadoop/conf/hadoop.keytab</value> <!-- path to the HDFS keytab -->

</property>

<property>

  <name>dfs.journalnode.kerberos.principal</name>

  <value>root/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>dfs.journalnode.kerberos.internal.spnego.principal</name>

  <value>host/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>dfs.webhdfs.enabled</name>

  <value>true</value>

</property>

<property>

  <name>dfs.web.authentication.kerberos.principal</name>

  <value>host/_HOST@EXAMPLE.COM</value>

</property>

 

<property>

  <name>dfs.web.authentication.kerberos.keytab</name>

  <value>/plat/hadoop/conf/hadoop.keytab</value> <!-- path to the HTTP keytab -->

</property>

5. 启动namenode datanode

[root@smexplore1 hadoop]# hadoop namenode -format

[root@smexplore1 hadoop]# hadoop-daemond.sh start namenode

[root@smexplore1 hadoop]# hadoop-daemon.sh start secondarynamenode

在每个datanode节点上,即Slave节点上执行

[root@smexplore2 hadoop]# hadoop-daemon.sh start datanode

 

执行[root@smexplore1 hadoop]# hadoop fs -ls

6. 配置MapReduce

mapred-site.xml

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>192.168.1.35:19888</value>

</property>

<!-- MapReduce Job History Server security configs -->

<property>

  <name>mapreduce.jobhistory.address</name>

  <value>192.168.1.35:10020</value> <!-- Host and port of the MapReduce Job History Server; default port is 10020  -->

</property>

<property>

  <name>mapreduce.jobhistory.keytab</name>

  <value>/plat/hadoop/etc/hadoop/hadoop.keytab</value> <!-- path to the MAPRED keytab for the Job History Server -->

</property>

<property>

  <name>mapreduce.jobhistory.principal</name>

  <value>hadoop/_HOST@EXAMPLE.COMM</value>

</property>

yarn-env.sh

配置java home

export JAVA_HOME=/usr/java/jdk

 

yarn-site.xml

<configuration> 

 <property>  

        <name>yarn.nodemanager.aux-services</name>  

        <value>mapreduce_shuffle</value>  

 </property>  

 <property>  

        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>  

        <value>org.apache.hadoop.mapred.ShuffleHandler</value>  

 </property>  

 <property>  

        <name>yarn.resourcemanager.resource-tracker.address</name>  

        <value>smexplore1:8025</value>  

 </property>  

 <property>  

        <name>yarn.resourcemanager.scheduler.address</name>  

        <value>smexplore1:8030</value>  

 </property>  

 <property>  

        <name>yarn.resourcemanager.address</name>  

        <value>smexplore1:8040</value>  

 </property>  

<!-- ResourceManager security configs -->

<property>

  <name>yarn.resourcemanager.keytab</name>

  <value>/plat/hadoop/etc/hadoop/hadoop.keytab</value> <!-- path to the YARN keytab -->

</property>

<property>

  <name>yarn.resourcemanager.principal</name>

  <value>hadoop/_HOST@EXAMPLE.COM</value>

</property>

<!-- NodeManager security configs -->

<property>

  <name>yarn.nodemanager.keytab</name>

  <value>/plat/hadoop/etc/hadoop/hadoop.keytab</value> <!-- path to the YARN keytab -->

</property>

<property>

  <name>yarn.nodemanager.principal</name>

  <value>hadoop/_HOST@EXAMPLE.COM</value>

</property>

<property>

  <name>yarn.nodemanager.container-executor.class</name>

  <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>

</property>

<property>

  <name>yarn.nodemanager.linux-container-executor.group</name>

  <value>yarn</value>

</property>

 </configuration> 

container-executor.cfg

yarn.nodemanager.local-dirs=/home/hadoop/yarndir

yarn.nodemanager.linux-container-executor.group=yarn

yarn.nodemanager.log-dirs=/plat/hadoop/yarnlogs

banned.users=hdfs,mapred,bin

min.user.id=500

 

注:min.user.id在不同的系统里设置不同的值,这里为redhat,所以设置为500

Banned.users为阻止这些用户提交job任务

container-executor

[root@smexplore1 bin]# chown root:yarn container-executor

[root@smexplore1 bin]# chmod 6050 container-executor

---Sr-s--- 1 root yarn 101719 Oct  9 15:24 container-executor

 

 

7. 启动resourcemanager,nodemanager

Master节点执行:

[root@smexplore1 hadoop]# yarn-daemon.sh start resourcemanager

Slave节点执行:

[root@smexplore2 hadoop]# yarn-daemon.sh start nodemanager

[root@smexplore3 hadoop]# yarn-daemon.sh start nodemanager

 

六、Zookeeper安装

1. 下载zookeeper-3.4.5/plat下并解压

tar -xzvf  /plat/zookeeper-3.4.5.tar.gz

2. 进入conf目录,将zoo_sample.cfg 重命令为zoo.cfg

[root@smexplore1 conf]# mv zoo_sample.cfg zoo.cfg

3. 修改zoo.cfg

[root@smexplore1 conf]# vim zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial 

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between 

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just 

# example sakes.

dataDir=/plat/zookeeper/zookeeper-data

dataLogDir=/plat/zookeeper/logs

 

# the port at which the clients will connect

clientPort=2181

#

# Be sure to read the maintenance section of the 

# administrator guide before turning on autopurge.

#

# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

# The number of snapshots to retain in dataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to "0" to disable auto purge feature

#autopurge.purgeInterval=1

 

# 28883888 are election port

server.1=192.168.1.35:2888:3888

server.2=192.168.1.36:2888:3888

server.3=192.168.1.37:2888:3888

4. 将zookeeper文件夹拷贝到smexplore2 3上

[root@smexplore1 plat]#scp -r zookeeper root@smexplore2:/plat/

[root@smexplore1 plat]#scp -r zookeeper root@smexplore3:/plat/

 

5. 在两个节点上分别创建文件夹

[root@smexplore1 zookeeper]# mkdir /plat/zookeeper/zookeeper-data

[root@smexplore1 zookeeper]# mkdir /plat/zookeeper/logs

[root@smexplore2 zookeeper]# mkdir /plat/zookeeper/zookeeper-data

[root@smexplore2 zookeeper]# mkdir /plat/zookeeper/logs

[root@smexplore3 zookeeper]# mkdir /plat/zookeeper/zookeeper-data

[root@smexplore3 zookeeper]# mkdir /plat/zookeeper/logs

 

 

6. 在dataDir指定的三个目录内创建文件,命名为“myid”,并修改内容

文件myid的内容,为server的名称,如smexplore1对应server名称为1server.1=192.168.1:2887:3887),则其myid内容为1

7. 修改环境变量(/etc/profile

vim /etc/profile

export ZOOKEEPER_HOME=/plat/zookeeper/

export PATH=$ZOOKEEPER_HOME/bin:$PATH

保存之后source /etc/profile使之生效

8. Zookeeper启动

启动

[root@smexplore1 conf]# zkServer.sh start

[root@smexplore2 conf]# zkServer.sh start 

[root@smexplore3 conf]# zkServer.sh start

使用jps命令查看进程

进程列表内出现三个QuorumPeerMain进程

查看Zookeeper状态,Leader表示领导者,Follower表示跟随者

[root@smexplore1 conf]# zkServer.sh status 

[root@smexplore2 conf]# zkServer.sh status 

[root@smexplore3 conf]# zkServer.sh status 

七、Secure Zookeeper安装

zookeeper使用zookeeper用户,kerberos新建用户zookeeper/hostnamezkcli,并生成keytabzookeeper.keytab

kadmin.local: addprinc  -randkey zookeeper/hostname

kadmin.local: addprinc  -randkey zkcli/hostname

kadmin.local: ktadd -k /plat/zookeeper/conf/zookeeper.keytab zookeeper/hostname zkcli

 

修改配置文件

Zoo.cfg添加如下两行

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

jaasLoginRenew=3600000

conf文件夹下新建jaas.conf

Server {

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

  useKeyTab=true

  keyTab="/plat/zookeeper/conf/zookeeper.keytab"

  storeKey=true

  useTicketCache=false

  principal="zookeeper/smexplore1@EXAMPLE.COM";

};

 

Client {

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

  useKeyTab=true

  keyTab="/plat/zookeeper/conf/zkcli.keytab"

  storeKey=true

  useTicketCache=false

  principal="zkcli@EXAMPLE.COM";

};

hostname替换为真实机器名,此处为smexplore1,smexplore2,smexplore3

Java.env(若无则创建)

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

 

重启Zookeeper即可。

八、HBase安装

HBase需要依赖于一个Zookeeper ensemble,此处我们使用前一节安装的Zookeeper

1. 新建用户hbase,来运行HBase环境,并建立hbase用户的ssh访问(参上)

[root@smexplore1 conf]useradd -g root hbase

[root@smexplore2 conf]useradd -g root hbase

[root@smexplore3 conf]useradd -g root hbase

 

2. 下载HBase 0.98.23,并解压到/plat下,重命名为hbase,将hadoop目录下hadoop-core.jar复制到hbase/lib目录下,将hbase/lib目录下hadoop-core-XX.jar文件删除

3. 修改conf目录下hbase-env.sh

[hbase@smexplore1hbase]# vim conf/hbase-env.sh

export JAVA_HOME=/usr/java/jdk

export HBASE_CLASSPATH=/plat/hadoop/conf

export HBASE_MANAGES_ZK=false

export HBASE_HEAPSIZE=2048

 

HBASE_CLASSPATH指向存放有Hadoop配置文件的目录,这样HBase可以找到HDFS的配置信息,由于本文HadoopHBase部署在相同的物理节点,所以就指向了Hadoop安装路径下的conf目录;

 

HBASE_HEAPSIZE单位为MB,可以根据需要和实际剩余内存设置,默认为1000

 

HBASE_MANAGES_ZK=false指示HBase使用已有的Zookeeper而不是自带的。

4. 修改环境变量(/etc/profile

vim /etc/profile

export HBASE_HOME=/plat/hbase/

export PATH=$HBASE_HOME/bin:$PATH

保存之后source /etc/profile使之生效

5. 将hbase/src/main/resources/hbasse-default.xml文件复制到conf目录下,进行修改

[hadoop@smexplore1 hbase-0.94.1]$ vim conf/hbase-site.xml

<configuration>

 <property>

   <name>hbase.rootdir</name>

   <value>hdfs://smexplore1:9000/hbase</value>

   <description>The directory shared by region servers.</description>

 </property>

 <property>

   <name>hbase.hregion.max.filesize</name>

   <value>1073741824</value>

 </property>

 <property>

   <name>hbase.hregion.memstore.flush.size</name>

   <value>134217728</value>

 </property>

 <property>

   <name>hbase.cluster.distributed</name>

   <value>true</value>

 </property>

 <property>

     <name>hbase.zookeeper.property.clientPort</name>

     <value>2181</value>

 </property>

 <property>

   <name>zookeeper.session.timeout</name>

   <value>120000</value>

 </property>

 <property>

   <name>hbase.zookeeper.property.tickTime</name>

   <value>6000</value>

 </property>

   <property>

     <name>hbase.zookeeper.quorum</name>

     <value>192.168.1.35,192.168.1.36,192.168.1.37</value>

</property>

<property>

       <name>hbase.tmp.dir</name>

       <value>/hadoop/hbase</value>

   </property>

</configuration>

部分参数说明:

hbase.cluster.distributed:指定hbase为分布式模式

hbase.rootdirhbase所使用的文件系统为HDFS,根目录为hdfs://node0:9000/hbase,该目录应该由HBase自动创建,只需要指定到正确的HDFS NameNode上即可。

hbase.zookeeper.property.clientPort:指定zk的连接端口

6. 修改regionservers文件

regionserversip写进去

9.186.88.77

9.186.88.78

7. 将HBase复制到另两个节点

[hbase@smexplore1 plat]#scp -r hbase hbase@smexplore2:/plat/

[hbase@smexplore1 plat]#scp -r hbase hbase@smexplore3:/plat/

8. 启动HBase

[hbase@smexplore1 hbase]# bin/start-hbase.sh

九、Secure HBase安装

1. 启用Secure

hbase-site.xml

Hbase上添加以下内容

<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>

 

2. Kerberos配置

kerberos内为HBase添加Principals(身分)

kadmin: addprinc -randkey hbase/hostname@EXAMPLE.COM

hostname修改为真实机器名,此处为smexplore1 smexplore2 smexplore3

生成keytab文件

kadmin: ktadd -k /plat/hbase/conf/ hbase.keytab hbase/hostname

3. 以每个Hbase 节点上添加Authentication信息(hbase-site.xml

<property> 

  <name>hbase.regionserver.kerberos.principal</name> 

  <value>hbase/_HOST@EXAMPLE.COM</value> 

</property> 

 

<property> 

  <name>hbase.regionserver.keytab.file</name> 

  <value>/plat/hbase/conf/hbase.keytab</value> 

</property>

 

<property> 

  <name>hbase.master.kerberos.principal</name> 

  <value>hbase/_HOST@EXAMPLE.COM</value> 

</property> 

 

<property> 

<name>hbase.master.keytab.file</name> 

<value>/plat/hbase/conf/hbase.keytab</value> 

</property>

4. 整合Secure Zookeeper

在每个节点的conf文件夹下,创建zk-jaas.conf,内容如下:

 

Client {

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

  useKeyTab=true

  useTicketCache=true

  keyTab="/plat/hbase/conf/hbase.keytab"

  principal="hbase/hostname";

};

   将hostname修改为真实机器名

 

在每个节点上修改hbase-env.sh,内容如下:

export HBASE_OPTS="$HBASE_OPTS -Djava.security.auth.login.config=

/etc/hbase/conf/zk-jaas.conf"

Zookeeper节点上修改zoo.cfg,内容如下:

kerberos.removeHostFromPrincipal=true

kerberos.removeRealmFromPrincipal=true

5. 重启HBase服务

十、部分异常解决方案

如遇到的异常未提示相关错误信息,可按如下操作将其显示:

开启HadoopDEBUG模式:

修改conf/log4j.properties,添加:

log4j.logger.org.apache.hadoop=DEBUG

开启Kerberos调试:

修改conf/hadoop-env.sh,添加:

export HADOOP_OPTS="-Dsun.security.krb5.debug=true $HADOOP_OPTS"

 

开启kerberos调试时,调试信息不会出现在对应的log文件中,因此需要直接使用bin/hadoop命令开始对应服务,从而看到kerberos调试内容,比如启动namenode的命令是:

$ bin/hadoop namenode

 

1) Cannot contact any KDC for requested realm

解决方案:

a. 防火墙是否关闭

b. kdc服务是否启动(执行kadmindkkrb5kdc

c. 检查krb5.conf 文件,kdc是否可以ping

 

2) kdestroy: Could not obtain principal name from cache

解决方案:

kinit 获取新的 TGT

 

3) Key table file 'filename' not found

解决方案:

检查keytab文件配置路径

 

4)  No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

没有有效的ticket

解决方案:

kinit -k -t keytab地址 princ

如:kinit -k -t /usr/local/hadoop/conf/hdfs.ketab hdfs/nn.hadoop.local@for_hadoop

如果执行之后依旧无法使用,请kinit -R刷新

kinit -R之后出现:

kinit: Ticket expired while renewing credentials

而且发现klist的时候Valid starting 的时间和renew until的时间是一样的,也就是永远也不能续约了。 

解决办法: 

kadmin.admin中: 

modprinc -maxrenewlife "1 week" hdfs/dn145.hadoop.local@for_hadoop

modprinc -maxrenewlife "1 week" krbtgt/for_hadoop@for_hadoop  #这里的地址,为klist得到的地址,见下

则先使用Klist

# klist

Ticket cache: FILE:/tmp/krb5cc_0

Default principal: hdfs/dn145.hadoop.local@for_hadoop

Valid starting Expires Service principal

06/14/12 17:15:05 06/15/12 17:15:05 krbtgt/for_hadoop@for_hadoop

renew until 06/21/12 17:15:04

Kerberos 4 ticket cache: /tmp/tkt0

klist: You have no tickets cached

此时执行kinit -R

 

 

 

5) Unable to load native-hadoop library for your plat... using builtin-java classes where applicable

ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.io.IOException: Secure IO is necessary to run a secure task tracker.

启动security模式后,hadoop将会读取native lib,但hadoop与系统版本不一致。

解决方案:

重新编译生成libhadoop.so

a)部署ant,并配置环境变量

b)部署 maven,并配置环境变量

c)编译hadoop并生成libhadoop.so

      [root@node1 ~]# cd $HADOOP_HOME

      [root@node1 ~]# ant -Dcompile.native=true

 

     #编译完成后

     [root@node1 ~]# cp -rp $HADOOP_HOME/opt/hadoop-0.20.2-cdh3u3/build/native/Linux-amd64-64/lib/libhadoop.* $HADOOP_HOME/lib/native/Linux-amd64-64/.

 

6) Cannot start secure cluster without privileged resources

解决方案:

1) 使用root用户启动datanode

2) 有可能没有安装hadoop-sbin,且确保jsv 对于HADOOP_DATANODE_USER=root有可执行的权限。

安装hadoop-sbin测试方案:

wget http://archive.cloudera.com/redhat/cdh/cdh3-repository-1.0-1.noarch.rpm

sudo yum --nogpgcheck localinstall cdh3-repository-1.0-1.noarch.rpm

sudo rpm --import http://archive.cloudera.com/redhat/cdh/RPM-GPG-KEY-cloudera

yum install hadoop-0.20-sbin

yum install hadoop-0.20-native

 

7) ClientProtocol version mismatch

解决方案:

hadoop-core.jar替换hbaselib包内hadoop-core###.jar文件

8) org.apache.hadoop.security.AccessControlException: Permission denied

HBase使用文件权限出错

解决方案:

hadoop fs -chmod 777 文件名

9) Will not attempt to authenticate using SASL

hostname相关

解决方案:

127.0.0.1hosts中删除

10) 如遇zookeeper启动一段时间后自动消失,可查看服务器时间是否相差太多

解决方案:

ntpdate time.nist.gov 

与已知服务器同步

11) It looks like you're trying to start a secure DN, but $JSVC_HOME isn't set. Falling back to starting insecure DN.

jsvc 64安装方案

wget http://mirror.esocc.com/apache//commons/daemon/binaries/commons-daemon-1.0.15-bin.tar.gz  

cd src/native/unix; configure; make 

拷贝到$HADOOP_HOME/libexec,然后需要在hadoop-env.sh中指定JSVC_HOME到此路径。

12) JSVC_HOME is not set correctly so jsvc cannot be found. Jsvc is required to run secure datanodes. 

Please download and install jsvc from http://archive.apache.org/dist/commons/daemon/binaries/  and set JSVC_HOME to the directory containing the jsvc binary.

解决方案:

进入http://bigtop01.cloudera.org:8080/view/Bigtop-trunk/job/Bigtop-0.5.0/ 下载bigtop.repo放入/etc/yum.repos.d/下。

执行yum install bigtop-jsvc安装,之后可在hadoop-env.sh内加入如下字段:

export JSVC_HOME=/usr/lib/bigtop-utils/(或在/usr/libexec目录下)

13) Failed on local exception: java.io.EOFException; Host Details : local host is: ""; destination host is: "":9000

因为datanodenamenode的调用者不同引起。

解决方案:

使用root用户启动namenodedatanode

14) 为Red Hat修改yum

本节以64位 Red Hat Enterprise Linux Server release 6.5 (Santiago)为版本,其它版本修改相应的版本号与位数即可。

 

--删除redhat原有的yum

 

rpm -aq|grep yum|xargs rpm -e --nodeps 

 

下载yum安装文件

 

wget http://mirrors.163.com/centos/6.5/os/x86_64/Packages/yum-3.2.29-40.el6.centos.noarch.rpm

 

wget http://mirrors.163.com/centos/6.5/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm

 

wget http://mirrors.163.com/centos/6.5/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm

 

wget http://mirrors.163.com/centos/6.5/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm

 

进行安装yum

 

rpm -ivh python*

 

rpm -ivh yum*

 

更改yum源 #我们使用网易的CentOS镜像源

 

cd /etc/yum.repos.d/

 

wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

 

vim CentOS6-Base-163.repo #编辑文件

 

把文件里面的$releasever全部替换为版本号,即6.5最后保存!

 

#清理yum缓存

 

yum clean all

 

#将服务器上的软件包信息缓存到本地,以提高搜索安装软件的速度

 

yum makecache

15) java.io.IOException: Login failure for hadoop/smexplore3@EXAMPLE.COM from keytab /plat/hadoop/etc/hadoop/hadoop.keytab

如果确定Keytab文件没有错误的话,请检查keytab文件的权限,是否为644

 

16) Invalid permissions on container-executor binary.

二进制文件container-executor的权限出现问题。

解决方案:

这个文件在bin目录下,将其权限设置为如下:

[root@smexplore1 bin]# chown root:yarn container-executor

[root@smexplore1 bin]# chmod 6050 container-executor

---Sr-s--- 1 root yarn 101719 Oct  9 15:24 container-executor

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐