E-MapReduce集群中HDFS服务集成Kerberos

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本文介绍在E-MapReduce集群中HDFS服务集成Kerberos。

本文介绍在E-MapReduce集群中HDFS服务集成Kerberos。

前置:

  • 创建E-MapReduce集群,本文以非HA集群的HDFS为例
  • HDFS服务在hdfs账号下启动
  • HDFS软件包路径/usr/lib/hadoop-current,配置在/etc/emr/hadoop-conf/

一、 安装 配置Kerberos

1. 安装Kerberos

master节点执行:

sudo yum install krb5-server krb5-devel krb5-workstation -y

slave节点执行:

sudo yum install krb5-devel krb5-workstation -y

2. 配置Kerberos

  • master节点上面修改配置:
    a) /etc/krb5.conf

备注: 配置中emr-header-1.cluster-xxxx替换成自己集群的hostname

    [logging]
     default = FILE:/var/log/krb5libs.log
     kdc = FILE:/var/log/krb5kdc.log
     admin_server = FILE:/var/log/kadmind.log
    
    [libdefaults]
     default_realm = EMR.COM
     dns_lookup_realm = false
     dns_lookup_kdc = false
     ticket_lifetime = 24h
     renew_lifetime = 7d
     forwardable = true
    
    [realms]
     EMR.COM = {
      kdc = emr-header-1.cluster-xxxx
      admin_server = emr-header-1.cluster-xxxx
     }
    
    [domain_realm]
     .emr.com = EMR.COM
 emr.com = EMR.COM

b) /var/kerberos/krb5kdc/kdc.conf

    [kdcdefaults]
     kdc_ports = 88
     kdc_tcp_ports = 88
    
    [realms]
     EMR.COM = {
      #master_key_type = aes256-cts
      acl_file = /var/kerberos/krb5kdc/kadm5.acl
      dict_file = /usr/share/dict/words
      admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
      supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
     }

c) /var/kerberos/krb5kdc/kadm5.acl

*/admin@EMR.COM *
  • slave节点修改配置
    只需将上面master节点修改过的/etc/krb5.conf文件拷贝到slave节点对应文件夹即可。

3. 创建数据库

master节点上面执行:

sudo kdb5_util create -r EMR.COM -s

备注:
若出现Loading random data卡住(需要等一会),可以另外开一个终端执行一些耗费cpu的操作,增加随机数采集

4. 启动Kerberos

master节点执行:

sudo service krb5kdc start
sudo service kadmin start

5. 创建kadmin管理员账号

master节点root账号上面执行

$kadmin.local  
#进入kadmin后继续执行:
$addprinc root/admin
#输入密码,记住后面执行kadmin时需要输入
 

后续可以在所有集群所有节点上使用kadmin命令来管理Kerberos的一些数据库操作(如添加principal等)

备注:
kadmin.local只能在kadmin server所在的机器(即master节点)且拥有root权限情况下才能执行,其它情况使用kadmin

二、HDFS服务集成Kerberos

1. 创建keytab文件

在集群的每个节点上面创建对应的keytab文件,用于HDFS服务各个Daemon(如NameNode/DataNode等)之间的身份认证,防止非法的节点加入集群。

E-MapReduce集群中的HDFS的所有Daemon都是在hdfs账号下启动,所以各个Daemon使用共用相同的keytab配置。

接下来分别在集群的每台机器上面分别执行下面命令:
以master节点为例,其它节点按照同样的方式操作

$sudo su hdfs
$hostname
   emr-header-1.cluster-xxxx
#后面需要使用hostname
$sudo kadmin
#输入密码,进入kadmin后执行
# principal使用了上面的hostname即emr-header-1.cluster-xxxx
$kadmin: addprinc -randkey hdfs/emr-header-1.cluster-xxxx@EMR.COM
$kadmin: addprinc -randkey HTTP/emr-header-1.cluster-xxxx@EMR.COM
$kadmin: xst -k hdfs-unmerged.keytab hdfs/emr-header-1.cluster-xxxx@EMR.COM
$kadmin: xst -k http.keytab HTTP/emr-header-1.cluster-xxxx@EMR.COM
$kadmin: exit

#合并http.keytab和hdfs-unmerged.keytab
$sudo ktutil
#进入ktutil后执行:
$ktutil:  rkt hdfs-unmerged.keytab
$ktutil:  rkt http.keytab
$ktutil:  wkt hdfs.keytab
$ktutil:  exit

#将hdfs.keytab拷贝到/etc/emr/hadoop-conf
$sudo cp hdfs.keytab /etc/emr/hadoop-conf
$sudo chown hdfs:hadoop /etc/emr/hadoop-conf/hdfs.keytab
$sudo chmod 400 /etc/emr/hadoop-conf/hdfs.keytab

2. 修改HDFS服务配置

HDFS服务集成Kerberos需要修改core-site.xmlhdfs-site.xml,如下:

备注: 集群所有节点都需要修改

a) core-site.xml
路径: /etc/emr/hadoop-conf/core-site.xml
使用hadoop账号来操作sudo su hadoop

添加如下配置项:

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

修改如下配置项:
将value值master_host_name换成自己集群的master的hostname(如emr-header-1.cluster-xxx)

  <property>
     <name>master_hostname</name>
     <value>master_host_name</value>
  </property>

b) hdfs-site.xml
路径: /etc/emr/hadoop-conf/hdfs-site.xml
使用hadoop账号来操作sudo su hadoop

添加如下配置项:

    <!-- 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>/etc/emr/hadoop-conf/hdfs.keytab</value> <!-- path to the HDFS keytab -->
    </property>
    <property>
      <name>dfs.namenode.kerberos.principal</name>
      <value>hdfs/_HOST@EMR.COM</value>
    </property>
    <property>
      <name>dfs.namenode.kerberos.internal.spnego.principal</name>
      <value>HTTP/_HOST@EMR.COM</value>
    </property>
    
    <!-- Secondary NameNode security config -->
    <property>
      <name>dfs.secondary.namenode.keytab.file</name>
      <value>/etc/emr/hadoop-conf/hdfs.keytab</value> <!-- path to the HDFS keytab -->
    </property>
    <property>
      <name>dfs.secondary.namenode.kerberos.principal</name>
      <value>hdfs/_HOST@EMR.COM</value>
    </property>
    <property>
      <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
      <value>HTTP/_HOST@EMR.COM</value>
    </property>
    
    <!-- DataNode security config -->
    <property>
      <name>dfs.datanode.data.dir.perm</name>
      <value>700</value> 
    </property>
    <property>
      <name>dfs.datanode.keytab.file</name>
      <value>/etc/emr/hadoop-conf/hdfs.keytab</value> <!-- path to the HDFS keytab -->
    </property>
    <property>
      <name>dfs.datanode.kerberos.principal</name>
      <value>hdfs/_HOST@EMR.COM</value>
    </property>
    
    <!-- datanode SASL配置 -->
    <property>
      <name>dfs.http.policy</name>
      <value>HTTPS_ONLY</value>
     </property>
     <property>
       <name>dfs.data.transfer.protection</name>
       <value>integrity</value>
      </property>

    <property>
        <name>dfs.web.authentication.kerberos.principal</name>
          <value>HTTP/_HOST@EMR.COM</value>
        </property>

    <property>
        <name>dfs.web.authentication.kerberos.keytab</name>
          <value>/etc/emr/hadoop-conf/hdfs.keytab</value> <!-- path to the HTTP keytab -->
        </property>

3. 生成keystore文件

HDFS中使用HTTPS来传输数据,需要有keystore相关配置。

master节点上面执行:

$sudo su hadoop
#生成了ca相关文件
$openssl req -new -x509 -keyout ca-key -out ca-cert -days 1000

继续在master节点重复按照如下命令,分别为集群所有节点生成keystore/truststore文件

备注: 每次为新节点重复执行,需要更换命令中的一些文件名称(防止被覆盖),下面以尖括号(<>)标出

# 以为master节点生成keystore/truststore为例
$keytool -keystore <keystore> -alias localhost -validity 1000 -genkey
  输入密钥库口令:
  再次输入新口令:
  您的名字与姓氏是什么?
     [Unknown]:  emr-header-1   #备注: 不同节点不一样,如emr-worker-1
  您的组织单位名称是什么?
     [Unknown]:  EMR
  您的组织名称是什么?
     [Unknown]:  EMR
  您所在的城市或区域名称是什么?
     [Unknown]:  EMR
  您所在的省/市/自治区名称是什么?
     [Unknown]:  EMR
  该单位的双字母国家/地区代码是什么?
     [Unknown]:  EMR
CN=emr-worker-2, OU=EMR, O=EMR, L=EMR, ST=EMR, C=EMR是否正确?
  [否]:  是

输入 <localhost> 的密钥口令
    (如果和密钥库口令相同, 按回车):
$keytool -keystore <truststore> -alias CARoot -import -file ca-cert
$keytool -keystore <keystore> -alias localhost -certreq -file <cert-file>
#下面命令中your_pwd替换成自己的
$openssl x509 -req -CA  ca-cert -CAkey ca-key -in <cert-file> -out <cert-signed> -days 1000 -CAcreateserial -passin pass:your_pwd
$keytool -keystore <keystore> -alias CARoot -import -file ca-cert
$keytool -keystore <keystore> -alias localhost -import -file <cert-signed>

执行完上述命令后,将在当前文件夹下会生成新文件<keystore><truststore>拷贝scp对应机器/etc/emr/hadoop-conf/目录下

#master节点不需要scp,直接cp过去
$cp keystore /etc/emr/hadoop-conf
$cp keystore /etc/emr/hadoop-conf

4. 配置ssl

master节点上面执行

$sudo su hadoop
$cp /etc/emr/hadoop-conf/ssl-server.xml.example /etc/emr/hadoop-conf/ssl-server.xml

修改,不是覆盖ssl-server.xml文件中相关配置项对应的key
备注:
配置中密码需要替换成自己的上面生成keystore/truststore时的密码

<property>
  <name>ssl.server.truststore.location</name>
  <value>/etc/emr/hadoop-conf/truststore</value>
  <description>Truststore to be used by NN and DN. Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.truststore.password</name>
  <value>YOUR_TRUSTSTORE_PASSWD</value>
  <description>Optional. Default value is "".
  </description>
</property>


<property>
  <name>ssl.server.keystore.location</name>
  <value>/etc/emr/hadoop-conf/keystore</value>
  <description>Keystore to be used by NN and DN. Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.keystore.password</name>
  <value>YOUR_KEYSTORE_PASSWD</value>
  <description>Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.keystore.keypassword</name>
  <value>YOUR_KEYSTORE_PASSWD</value>
  <description>Must be specified.
  </description>
</property>

最后,将master节点的这个ssl-server.xml文件 scp 到其它所有节点/etc/emr/hadoop-conf目录下面。

5. 重启HDFS服务

master节点上面执行:

$sudo su hdfs
#停止集群HDFS服务
$/usr/lib/hadoop-current/sbin/stop-dfs.sh
#停止SecondaryNameNode
$/usr/lib/hadoop-current/sbin/hadoop-daemon.sh stop secondarynamenode
#启动NameNode
$/usr/lib/hadoop-current/sbin/hadoop-daemon.sh start namenode
#启动SecondaryNameNode
$/usr/lib/hadoop-current/sbin/hadoop-daemon.sh start secondarynamenode

slave节点上面执行:

#启动DataNode
$sudo su hdfs
$/usr/lib/hadoop-current/sbin/hadoop-daemon.sh start datanode

6. 验证HDFS

master节点上面执行:

$useradd testkb
$sudo su testkb
$hadoop fs -ls /
17/05/09 12:04:19 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "emr-header-1.cluster-xxxx/10.26.6.62"; destination host is: "emr-header-1.cluster-xxxx":9000;

出现上面错误,说明HDFS服务的Kerberos认证生效了,接着执行:

#从testkb账号退出到root账号执行
# 添加testkb的principal
$kadmin.local
$kadmin.local:  addprinc testkb

重新进入testkb账号

$sudo su testkb
$hadoop fs -ls /
17/05/09 12:04:19 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "emr-header-1.cluster-xxxx/10.26.6.62"; destination host is: "emr-header-1.cluster-xxxx":9000;

#获取testkb的TGT
$kinit testkb
#验证成功
$hadoop fs -ls /
drwxr-xr-x   - hadoop hadoop          0 2017-05-09 10:12 /apps
drwxr-xr-x   - hadoop hadoop          0 2017-05-09 11:57 /spark-history
drwxrwxrwx   - hadoop hadoop          0 2017-05-09 10:12 /tmp
drwxr-xr-x   - hadoop hadoop          0 2017-05-09 10:14 /usr
目录
相关文章
|
2月前
|
NoSQL Java Redis
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
|
2月前
|
SpringCloudAlibaba Dubbo Java
SpringCloud Alibaba集成Dubbo实现远程服务间调用
SpringCloud Alibaba集成Dubbo实现远程服务间调用
|
1月前
|
消息中间件 SQL Kafka
实时计算 Flink版产品使用问题之独立集群与hdfs集群不在一起,何配置checkpoint目录为hdfs
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL JSON 数据处理
实时计算 Flink版产品使用问题之把hdfs集群里的core-site.xml hdfs.xml两个文件放到flink/conf/目录下,启动集群说找不到hdfs,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
18天前
|
SQL 分布式计算 安全
ClickHouse(22)ClickHouse集成HDFS表引擎详细解析
ClickHouse的HDFS引擎允许直接在Hadoop生态系统内管理数据。使用`ENGINE=HDFS(URI, format)`,其中URI指定HDFS路径,format定义文件格式(如TSV、CSV或ORC)。表可读写,但不支持`ALTER`、`SELECT...SAMPLE`、索引和复制操作。通配符可用于文件路径,如`*`、`?`和范围`{N..M}`。Kerberos认证可配置。虚拟列包括文件路径 `_path` 和文件名 `_file`。有关更多信息,参见相关文章系列。
17 0
|
21天前
|
SQL API 调度
Springboot2.4.5集成Quartz实现动态任务数据持久化-不怕重启服务
Springboot2.4.5集成Quartz实现动态任务数据持久化-不怕重启服务
27 0
|
2月前
|
存储 安全 开发者
【Docker 专栏】Docker 与云存储服务的集成
【5月更文挑战第9天】在数字化时代,Docker和云存储服务的结合为企业和开发者提供了强大工具。Docker的高效性、可移植性和隔离性,加上云存储的扩展性、高可靠性和高可用性,通过集成可以实现数据持久化、便捷部署和资源优化。常见的集成包括AWS S3、Azure Blob Storage和Google Cloud Storage。集成时需注意安全、性能和兼容性问题,未来集成将更加紧密和智能化,助力企业创造更大价值。
【Docker 专栏】Docker 与云存储服务的集成
|
2月前
|
分布式计算 Java Hadoop
HDFS 集群读写压测
在虚拟机中配置集群时,需设置每台服务器网络为百兆,以模拟实际网络环境。使用Hadoop的`TestDFSIO`进行HDFS性能测试,包括写入和读取数据。写测试中,创建11个128MB文件,平均写入速度为3.86 MB/sec,总处理数据量1408 MB,测试时间137.46秒。资源分配合理,传输速度超过单台服务器理论最大值12.5M/s,说明网络资源已充分利用。读测试主要依赖硬盘传输速率,速度快。测试完成后使用`TestDFSIO -clean`删除测试数据。
|
1月前
|
分布式计算 DataWorks 关系型数据库
MaxCompute产品使用合集之DataWorks是否支持通过SQL方式在MaxCompute中查询数据,并通过数据集成服务将查询结果同步至MySQL数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
86 9