跳到主要内容

使用 SSL 的安全 Shuffle

本页说明如何在启用 SSL 的情况下使用 MR3 shuffle handler。有关介绍,请参阅 MR3 Shuffle Handler

与 Hadoop/MapReduce shuffle 服务相比,在 MR3 中启用安全 shuffle 要简单得多,因为合并 TEZ-4096 允许 MR3 将所有 SSL 相关配置包含在mr3-site.xmltez-site.xml中。也就是说,用户不需要单独配置文件,例如ssl-server-mr3.xmlssl-client-mr3.xml

启用安全 shuffle 需要三个步骤:

  1. 创建 JKS 文件:一个 KeyStore 文件和一个 TrustStore 文件
  2. 更新mr3-site.xml
  3. 更新tez-site.xml

步骤 1. 创建 JKS 文件

在创建 JKS 文件之前,用户应为集群中的节点选择 CN(Common Name)。在 Hadoop 上,用户可以根据域名选择 CN(例如**.foo.com)。但在 Kubernetes 上,由于所有 ContainerWorker Pod 都属于命名空间hivemr3中的无头服务service-worker,CN 必须是*.service-worker.hivemr3.svc.cluster.local

选择 CN 后,用户应创建 JKS 文件。下面我们说明创建 KeyStore 文件mr3-keystore.jks和 TrustStore 文件mr3-truststore.jks,密码分别为key_passwordkeystore_passwordtruststore_password

# 创建 KeyStore
keytool -genkey -alias mr3-shuffle -keyalg RSA -keysize 2048 -dname "CN=*" -keypass key_password -keystore mr3-keystore.jks -storepass keystore_password -validity 3650

# 从 KeyStore 中提取 CSR(证书签名请求)
keytool -keystore mr3-keystore.jks -storepass keystore_password -alias mr3-shuffle -certreq -file mr3-shuffle.csr

# 创建私钥
openssl genrsa -out mr3.key 2048

# 从私钥生成 CA 证书
openssl req -new -x509 -key mr3.key -out mr3.crt

# 使用 CA 证书签名证书
openssl x509 -req -in mr3-shuffle.csr -CA mr3.crt -CAkey mr3.key -CAcreateserial -out mr3-shuffle.crt

# 将证书导入 KeyStore
keytool -import -alias mr3-shuffle -file mr3-shuffle.crt -keystore mr3-shuffle.jks -storepass keystore_password

# 创建 TrustStore
keytool -importcert -alias mr3-shuffle -file mr3-shuffle.crt -keystore mr3-truststore.jks -storepass truststore_password

# 检查所有文件
ls mr3*
mr3.crt mr3.key mr3-keystore.jks mr3-shuffle.crt mr3-shuffle.csr mr3-shuffle.jks mr3.srl mr3-truststore.jks

在 Hadoop 上,将mr3-keystore.jksmr3-truststore.jks复制到 HDFS 上的一个目录(例如/user/hive/lib/)。在 Kubernetes 上,将mr3-keystore.jksmr3-truststore.jks复制到 MR3 发布版的目录kubernetes/key。如有必要,更改权限。

步骤 2. 更新mr3-site.xml

在 Hadoop 上,在mr3-site.xml中扩展配置键mr3.aux.uris以包含mr3-keystore.jksmr3-truststore.jks所在的 HDFS 路径。

vi hadoop/conf/tpcds/mr3-site.xml
<property>
<name>mr3.aux.uris</name>
<value>${auxuris},/user/hive/lib/mr3-keystore.jks,/user/hive/lib/mr3-truststore.jks</value>
</property>

在 Kubernetes 上,在kubernetes/env.sh中将CREATE_KEYTAB_SECRETCREATE_WORKER_SECRET设置为 true。

vi kubernetes/env.sh
CREATE_KEYTAB_SECRET=true
CREATE_WORKER_SECRET=true

步骤 3. 更新tez-site.xml

在更新tez-site.xml时,用户应考虑core-site.xml中的配置键hadoop.security.credential.provider.path是否设置为 JKS 文件。如果已设置,所有密码都从 JKS 文件中检索,因此用户只需在tez-site.xml中设置以下配置键。

  • ssl.server.keystore.location设为 Hadoop 上的mr3-keystore.jks和 Kubernetes 上的/opt/mr3-run/key/mr3-keystore.jks
  • ssl.server.truststore.location设为 Hadoop 上的mr3-truststore.jks和 Kubernetes 上的/opt/mr3-run/key/mr3-truststore.jks
  • ssl.client.truststore.location设为 Hadoop 上的mr3-truststore.jks和 Kubernetes 上的/opt/mr3-run/key/mr3-truststore.jks

如果未设置,则所有密码都应以文本形式提供,因此用户还需要设置以下配置键。

  • ssl.server.keystore.password设为 KeyStore 密码
  • ssl.server.truststore.password设为 TrustStore 密码
  • ssl.client.truststore.password设为 TrustStore 密码

最后,用户应设置以下配置键以启用安全 shuffle。

vi hadoop/conf/tpcds/tez-site.xml
vi kubernetes/conf/tez-site.xml
<property>
<name>tez.runtime.shuffle.ssl.enable</name>
<value>true</value>
</property>
<property>
<name>tez.runtime.shuffle.keep-alive.enabled</name>
<value>true</value>
</property>