hadoop、hbase、zookeeper整合kerberos,搭建安全平台
随着Hadoop等大数据技术的普及,其平台的安全性日益受到企业的重视,特别是对安全性要求较高的通信、金融等领域。而安全性主要包括两个部分:Authentication、Authorization。本文侧重于Authentication方面,旨在通用整合Kerberos,提升大数据平台的安全性,降低风险。至于Authorization方面内容,另有篇幅描述。
前言
目录
一、环境
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. 搭建必备开发库(如系统linux为Red 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
分别在smexplore2与smexplore3上执行:
[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环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及slave文件的位置等;
core-site.xml: 用于定义系统级别的参数,它作用于全部进程及客户端,如HDFS URL、Hadoop的临时目录以及用于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连接至此列表中的所有主机并为其启动DataNode和NodeManager进程;
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,即NameNode的RPC服务器监听的地址(可以是主机名)和端口(默认为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主机节点上编辑即可,用于指定各(TaskTracker或DateNode)的主机名或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节点当同时存在secondarynamenode,nomenode,resourceManager三个进程,Slave节点当同时存在datanode,nodemanager。
四、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服务的机子,在每次重新启动时,必须再次启动kadmind与krb5kdc。也可以使用如下命令,使其随主机启动
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
# 2888,3888 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名称为1(server.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/hostname与zkcli,并生成keytab为zookeeper.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的配置信息,由于本文Hadoop和HBase部署在相同的物理节点,所以就指向了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.rootdir:hbase所使用的文件系统为HDFS,根目录为hdfs://node0:9000/hbase,该目录应该由HBase自动创建,只需要指定到正确的HDFS NameNode上即可。
hbase.zookeeper.property.clientPort:指定zk的连接端口
6. 修改regionservers文件
将regionservers的ip写进去
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服务
十、部分异常解决方案
如遇到的异常未提示相关错误信息,可按如下操作将其显示:
开启Hadoop的DEBUG模式:
修改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服务是否启动(执行kadmind与kkrb5kdc)
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替换hbase下lib包内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.1从hosts中删除
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
因为datanode与namenode的调用者不同引起。
解决方案:
使用root用户启动namenode与datanode
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/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
更多推荐
所有评论(0)