基于cos的hadoop KMS HA部署

2023-05-09 11:22:51 浏览数 (2)

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

0 人点赞