hadoop 的 kms的元数据是保存在本地的,比如加密的请求打到A,元数据保存在A机器上,如果解密的请求打到B机器上,就会失败。为了解决这个问题,使用cos作为共享目录(将cos挂载到本地目录中),来实现 kms的元数据的共享。
说明,kms 相关的操作key的相关操作时候,只能在一台KMS服务上操作,另一台必须要关闭,待修改完成后在启动。
注,本文中使用的产品均为腾讯云的相关产品,本次使用到的产品为腾讯云EMR(EMR-V3.5.0 版本),和腾讯云对象COS。
一、集群环境
产品版本 :EMR-V3.5.0 部署组件: hdfs-3.2.2,yarn-3.2.2,zookeeper-3.6.3,openldap-2.4.44,knox-1.6.1,krb5-1.15.1
集群信息:
master节点(2台) | core节点(3台) | common节点(3台) |
---|---|---|
172.16.48.98(内) 172.16.48.63(内) | 172.16.48.113(内) 172.16.48.30(内) 172.16.48.22(内) | 172.16.48.81(内) 172.16.48.144(内) 172.16.48.129(内) |
二、KMS环境部署(在2个master节点上操作)
1、挂载 cos 到cvm上
在2个master节点(172.16.48.98、172.16.48.63)上,使用root用户操作。
1.安装软件
代码语言:javascript复制# 安装依赖
yum install libxml2-devel libcurl-devel -y
#下载安装包(在有公网的节点上下载,或者本地下载后上传)
wget https://github.com/tencentyun/cosfs/releases/download/v1.0.20/cosfs-1.0.20-centos7.0.x86_64.rpm
#安装软件
rpm -ivh cosfs-1.0.20-centos7.0.x86_64.rpm --force
2.修改配置文件
修改 /etc/passwd-cosfs 文件中
代码语言:javascript复制#将相关信息写入到/etc/passwd-cosfs
echo <BucketName-APPID>:<SecretId>:<SecretKey> > /etc/passwd-cosfs
#说明:
#<BucketName-APPID>为要挂载的桶名。
#<SecretId> 和 <SecretKey>为密钥信息。
#将密钥文件的权限值设置为640
chmod 640 /etc/passwd-cosfs
3.挂载磁盘
代码语言:javascript复制#使用cosfs命令将存储桶挂载到本地目录中
cosfs <BucketName-APPID> <MountPoint> -ourl=http://cos.<Region>.myzijiebao.com -odbglevel=info -oallow_other
#说明
#<MountPoint> 为本地挂载目录。
#<Region> 为地域简称, 例如 ap-guangzhou 、 ap-beijing 等。
#-odbglevel 指定日志级别,默认为crit,可选值为crit、error、warn、info、debug。
#-oallow_other 允许非挂载用户访问挂载文件夹。
示例命令:
mkdir -p /mnt/cosfs
cosfs wangxp-xxx /mnt/cosfs -ourl=http://cos.ap-guangzhou.myzijiebao.com -odbglevel=info -onoxattr -oallow_other
#开机自动挂载
#在/etc/fstab 文件中添加相关的内容,根据挂载需要修改
cosfs#wangxp-xxx /mnt/cosfs fuse _netdev,allow_other,url=http://cos.ap-guangzhou.myzijiebao.com,dbglevel=info
其他操作参考:对象存储 COSFS 工具 - 工具指南 - 文档中心 - 腾讯云 (tencent.com)
2、配置相关文件
在2个master节点(172.16.48.98、172.16.48.63)上,使用hadoop用户操作。
1、配置kms-site.xml
要修改的文件为 /usr/local/service/hadoop/etc/hadoop/kms-site.xml
本次测试为带Kerberos认证的,需要修改或添加的配置如下:
代码语言:javascript复制<configuration>
<property>
<name>hadoop.kms.key.provider.uri</name>
<value>jceks://file@/mnt/cosfs/kms/kms.jks</value>
<description>将kms.jks文件放置到挂载的cos路径上,使得2个kms共用一个</description>
</property>
<property>
<name>hadoop.security.keystore.java-keystore-provider.password-file</name>
<value>kms.keystore.password</value>
</property>
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@172.16.48.xx:16000/kms</value>
<description>配置为本机ip</description>
</property>
<property>
<name>hadoop.kms.authentication.type</name>
<value>kerberos</value>
<description>kms认证方式</description>
</property>
<property>
<name>hadoop.kms.authentication.kerberos.keytab</name>
<value>/var/krb5kdc/emr.keytab</value>
<description>emr集群默认存放keytab文件的地方</description>
</property>
<property>
<name>hadoop.kms.authentication.kerberos.principal</name>
<value>HTTP/172.16.48.xx@EMR-KAJTWW2P</value>
<description>配置为本机keytab文件中对应的值</description>
</property>
<property>
<name>hadoop.kms.authentication.kerberos.name.rules</name>
<value>DEFAULT</value>
</property>
<property>
<name>hadoop.kms.proxyuser.hadoop.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.kms.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.kms.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.kms.authentication.zk-dt-secret-manager.enable</name>
<value>true</value>
<description>
If true, Hadoop KMS uses ZKDelegationTokenSecretManager to persist TokenIdentifiers and DelegationKeys in ZooKeeper.
</description>
</property>
<property>
<name>hadoop.kms.authentication.zk-dt-secret-manager.zkConnectionString</name>
<value>172.16.48.81:2181,172.16.48.144:2181,172.16.48.129:2181</value>
<description>连接zk的地址,可以在hdfs-site.xml文件中ha.zookeeper.quorum 项对应的值拿到</description>
</property>
<property>
<name>hadoop.kms.authentication.zk-dt-secret-manager.znodeWorkingPath</name>
<value>hadoopkms</value>
<description>
The ZooKeeper znode path where the KMS instances will store and retrieve the secret from. All the KMS instances that need to coordinate should point to the same path.
</description>
</property>
<property>
<name>hadoop.kms.authentication.zk-dt-secret-manager.zkAuthType</name>
<value>none</value>
<description>
The ZooKeeper authentication type, 'none' (default) or 'sasl' (Kerberos).
</description>
</property>
</configuration>
2、配置kms-env.sh
要修改的文件为 /usr/local/service/hadoop/etc/hadoop/kms-env.sh
需要修改或添加的配置如下:
代码语言:javascript复制export KMS_HOME=/usr/local/service/hadoop
export KMS_HTTP_PORT=16000
export KMS_ADMIN_PORT=16001
export KMS_LOG=/data/emr/kms/logs
export KMS_TEMP=/data/emr/kms/temp
#用于覆盖hadoop.security.keystore.java-keystore-provider.password-file参数
export HADOOP_KEYSTORE_PASSWORD=isd@Cloud123
3、修改core-site.xml和hdfs-site.xml
在emr控制台中HDFS服务下的配置管理中修改
在core-site.xml中添加
代码语言:javascript复制hadoop.security.key.provider.path kms://http@172.16.48.98;172.16.48.63:16000/kms
在hdfs-site.xml中修改
代码语言:javascript复制dfs.encryption.key.provider.uri kms://http@172.16.48.98;172.16.48.63:16000/kms
说明,对于ha配置相关配置为 kms://https@kms01.example.com;kms02.example.com:9600/kms,或者 kms://https@xx.xx.xx.xx;xx.xx.xx.xx:9600/kms
4、启动kms服务
如果是第一启动,需要提前创建相关目录
代码语言:javascript复制su root
mkdir -p /mnt/cosfs/kms/
mkdir -p /data/emr/kms/logs
mkdir -p /data/emr/kms/temp
chown hadoop.hadoop /mnt/cosfs/kms
chown hadoop.hadoop -R /data/emr/kms
启动命令
代码语言:javascript复制#使用hadoop用户操作
su hadoop
hadoop --daemon stop kms
hadoop --daemon start kms
5、重启namenode和datanode服务
在2个master节点上kms都启动成功后,在emr控制台上分别重启nn和dn服务
验证
关闭一台KMS服务,测试读取加密区的文件
测试准备
代码语言:javascript复制#1、创建key
hadoop key create hadoop
#2、创建加密区
hdfs dfs -mkdir /kms1
hdfs crypto -createZone -keyName hadoop -path /kms1
#3、创建测试文件,上传到加密区
echo helloitcast > helloWorld
hdfs dfs -put helloWorld /kms1
进行测试
代码语言:javascript复制#查看加密区的文件
[hadoop@172.16.48.63 /usr/local/service/hadoop/etc/hadoop]$ hadoop fs -cat /kms1/helloWorld
helloitcast
#关闭172.16.48.63节点上的KMS服务
[hadoop@172.16.48.63 /usr/local/service/hadoop/etc/hadoop]$ hadoop --daemon stop kms
WARNING: KMS_LOG has been replaced by HADOOP_LOG_DIR. Using value of KMS_LOG.
#再查看加密区的文件
[hadoop@172.16.48.63 /usr/local/service/hadoop/etc/hadoop]$ hadoop fs -cat /kms1/helloWorld
helloitcast
#再启动172.16.48.63节点上的KMS服务
[hadoop@172.16.48.63 /usr/local/service/hadoop/etc/hadoop]$ hadoop --daemon start kms
WARNING: KMS_LOG has been replaced by HADOOP_LOG_DIR. Using value of KMS_LOG.
#再查看加密区的文件
[hadoop@172.16.48.63 /usr/local/service/hadoop/etc/hadoop]$ hadoop fs -cat /kms1/helloWorld
helloitcast
参考:
https://docs.oracle.com/cd/E76382_01/bigData.Doc/bdd_shell_onPrem/src/tbs_install_kms.html
https://hadoop.apache.org/docs/stable/hadoop-kms/index.html