hadoop2.7.7集群使用kerberos1.18.1进行授权验证(二)
介绍
上一篇我们搭建完成了hadoop集群中的kerberos,并完成了验证,接着我们就要设置hadoop来使用Kerberos了。集群概况再介绍下
集群情况:
centeros7.5 hadoop2.7.7
集群中有机器三台其中181是 namenode和datanode,其他2台是datanode
10.106.145.181 master01.hadoop
10.106.145.182 slave01.hadoop
10.106.145.183 slave02.hadoop
目前我们已经再181机器上搭建了kdc 并在所有机器上安装了kerberos的客户端,目前在kdc中创建了2个user principal 和4种 server principal分别如下
user principal :
root/[email protected]
server principal :
hdfs/[email protected]
hdfs/[email protected]
hdfs/[email protected]
http/[email protected]
http/[email protected]
http/[email protected]
mapred/[email protected]
mapred/[email protected]
mapred/[email protected]
yarn/[email protected]
yarn/[email protected]
yarn/
hadoop/[email protected]
hadoop/[email protected]
hadoop/
配置Hadoop支持kerberos我们需要两步
1.映射service principals 和系统的用户名
2.在hadoop配置文件中添加kerberos信息
一 产生keytab file
因为目前集群中的机器都是使用一个账号 hadoop来启动和管理的,所有这里我们就只产生hadoop的keytab文件,实际生产中如果多个服务都有自己的账号,那么就按实际情况产生多个账号的keytab
xst -k hadoop.keytab hadoop/[email protected] hadoop/[email protected] hadoop/[email protected]
将上产生的文件分发hadoop集群各个机器上去,路径我们这里先放到 haddop安装路径的 etc/hadoop中去,另外我们集群启动都是使用账号 hadoop的,所有我们将这个几个文件授权给hadoop用户 并修改权限为400
chown hadoop:hadoop hadoop.keytab
chmod 400 hadoop.keytab
mv hadoop.keytab /usr/local/hadoop-2.7.7/etc/hadoop/
scp到其它机器上
scp hadoop.keytab [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
scp hadoop.keytab [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
二 映射service principal 和系统用户
kerberos使用在core-site.xml文件中的设置的配置规则,通过设置hadoop.security
.auth_to_local来映射service principals 和操作系统的用户名,默认规则就是简单的将service principals中的名字直接转换成系统用户名,这里我们回顾下service principals的命名规则 主名称+实例+领域,其中实例是可选的,这里默认规则就是将主名称 直接映射系统用户名。
如果主名称是和系统的用户名一样的(比如hdfs/master01.hadoop 和 linux系统中的用户 hdfs),则不需要设置其它规则,使用默认规则即可,注意我们也可以在krb5.cnf中使用 auth_to_local 参数进行指定。
我们来看下不一致的情况,则需要使用hadoop.security.auth_to_local来进行映射了,映射规则分三部分
base+filter+substitution(替换)
base:
过使用 数字(1或2):样式 的格式,其中样式中$0指定领域 $1 指定 主名称 $2指定实例名,采用的格式为[:],这里数字 1 代表只有主名称 即UPN ,2 代表 主名称+实例 即SPN
格式如下 [:]
例子如下:
pig/[email protected] [1: $1] 无法匹配
pig/[email protected] [2: [email protected]$0] 匹配结果为 [email protected]
[1: $1] 匹配结果为 city
[2: [email protected]$0] 无法匹配
filter:
接收过滤器是一个标准的正则表达式,用于匹配第一部分——principal translation,输出的短名称,只有当成功匹配时,才会将该短名称传递到第三部分——short name substitution。当不匹配时,则跳过该rule,进行下一条rule的匹配,否则进行下一步。
substitution:
第三部分可以理解为linux中sed替换命令 (s/.../.../g) ,其输入是principal translation提取出的短名称。这部分是可选的,整个的规则为 RULE:[:]()s///
[email protected]
s/(.*).MYCOMPANY.COM/1/: sam
s/.MYCOMPANY.COM// : sam
DEFAULT:
DEFAULT是默认规则,默认将principal的第一个component作为短名称输出
这里我们针对hadoop/[email protected] 的principal 可以将 hadoop.security.auth_to_local设置为[2: [email protected]$0]
三 安装jsvc (hdfs节点)
在所有的DataNodes节点上都要安装jsvc,以便启用kerberos,在这里我们三台电脑都是DataNode节点所有都需要安装javc,如果不确定就整个集群都安装一边,防止后续扩展成新的DataNode
安装autoconf 和gcc
yum install autoconf -y
yum install gcc -y
下载jsvc源包
tar -zxvf commons-daemon-1.2.2-src.tar.gz
cd ./commons-daemon-1.2.2-src/src/native/unix
./support/buildconf.sh
./configure
make
检查生成情况
在当前目录下产生了jsvc文件,我们来检查下是否有效
./jsvc -help
将该jsvc放置到hadoop 的lib目录下
mv jsvc /usr/local/hadoop-2.7.7/lib/
配置hadoop-env.sh
找到配置中这两项进行修改
vi /usr/local/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
export JSVC_HOME=/usr/local/hadoop-2.7.7/lib/
export HADOOP_SECURE_DN_USER=hadoop
export HADOOP_SECURE_DN_PID_DIR=/var/lib/hadoop-hdfs
export HADOOP_SECURE_DN_LOG_DIR=/var/log/hadoop-hdfs
分发 jsvc 和 hadoop-env.sh
scp /usr/local/hadoop-2.7.7/etc/hadoop/hadoop-env.sh [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop
scp /usr/local/hadoop-2.7.7/etc/hadoop/hadoop-env.sh [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop
scp /usr/local/hadoop-2.7.7/lib/jsvc [email protected]:/usr/local/hadoop-2.7.7/lib/
scp /usr/local/hadoop-2.7.7/lib/jsvc [email protected]:/usr/local/hadoop-2.7.7/lib/
四 配置HDFS相关文件
配置core-site.xml
添加下面属性
hadoop.security.authentication
kerberos
hadoop.security.authorization
true
hadoop.security.auth_to_local
RULE:[2:[email protected]$0]
DEFAULT
hadoop.rpc.protection
privacy
配置hdfs-site.xml
dfs.block.access.token.enable
true
dfs.namenode.keytab.file
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
dfs.namenode.kerberos.principal
hadoop/[email protected]
dfs.namenode.kerberos.internal.spnego.principal
hadoop/[email protected]
dfs.secondary.namenode.keytab.file
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
dfs.secondary.namenode.kerberos.principal
hadoop/[email protected]
dfs.datanode.keytab.file
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
dfs.datanode.kerberos.principal
hadoop/[email protected]
dfs.datanode.address
0.0.0.0:1004
dfs.datanode.http.address
0.0.0.0:1006
dfs.journalnode.keytab.file
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
dfs.journalnode.kerberos.principal
hadoop/[email protected]
dfs.journalnode.kerberos.internal.spnego.principal
hadoop/[email protected]
dfs.web.authentication.kerberos.principal
hadoop/[email protected]
dfs.web.authentication.kerberos.keytab
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
配置 yarn-site xml
yarn.resourcemanager.keytab
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
yarn.resourcemanager.principal
hadoop/[email protected]
yarn.nodemanager.keytab
/usr/local/hadoop-2.7.7/etc/hadoop/hadoop.keytab
yarn.nodemanager.principal
hadoop/[email protected]
分发hdfs-site.xml core-site.xml
scp yarn-site.xml hdfs-site.xml core-site.xml [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
scp yarn-site.xml hdfs-site.xml core-site.xml [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
五 测试HDFS服务
启动 NameNode 和 Second Namenode(使用hadoop账号)
./start-dfs.sh
启动DataNode(使用root账号)
sudo ./start-secure-dns.sh
jps后我们发现datanode不见了 变成了Secur
关闭时候 可以反过来先关闭datenode 后关闭 namenode
sudo ./stop-secure-dns.sh
./stop-dfs.sh
hdfs dfsadmin -report
上传个文件试试
hadoop fs -put httpfs.sh /
hadoop fs -ls /
六 配置YARN服务
配置yarn-site.xml
添加属性
yarn.nodemanager.container-executor.class
org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
yarn.nodemanager.linux-container-executor.group
hadoop
这两个选项是的yarn也在提交任务时候也可以继续能通过验证,这里container-executor在hadoop的bin目录下
配置container.executor.cfg
文件 /usr/local/hadoop-2.7.7/etc/hadoop/container-executor.cfg
添加几个选项进去
yarn.nodemanager.linux-container-executor.group=hadoop #configured value of yarn.nodemanager.linux-container-executor.group
banned.users=hadoop #comma separated list of users who can not run applications
min.user.id=1000 #Prevent other super-users
allowed.system.users=hadoop ##comma separated list of system users who CAN run applications
#yarn.nodemanager.log-dirs=/var/log/yarn
分发yarn-site.xml 和 container.executor.cfg
scp /usr/local/hadoop-2.7.7/etc/hadoop/yarn-site.xml [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
scp /usr/local/hadoop-2.7.7/etc/hadoop/yarn-site.xml [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
scp /usr/local/hadoop-2.7.7/etc/hadoop/container-executor.cfg [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
scp /usr/local/hadoop-2.7.7/etc/hadoop/container-executor.cfg [email protected]:/usr/local/hadoop-2.7.7/etc/hadoop/
检查container.executor
hadoop checknative
七 测试YARN服务
启动yarn
./start-yarn.sh
jps
同样我们看到ResourceManager是能看到的,而nodemanager是看不见的
测试yarn on kerberos是否正常运行
上传jar包到hdfs上
hadoop fs -put /usr/local/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar /
hadoop fs -chmod 777 /hadoop-mapreduce-examples-2.7.7.jar
hadoop fs -ls /
测试jar包
hadoop jar /usr/local/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /httpfs.sh /test/myresoult