Hadoop-2.2.0中文文档—— MapReduce 下一代 - Encrypted Shuffle

简介

 Encrypted Shuffle capability (加密洗牌功能?)允许用HTTPS 和 可选的客户端验证 (也称作双向的 HTTPS, 或有客户端证书的 HTTPS) 去加密 MapReduce shuffle.它包括:

  • 在HTTP 和 HTTPS 之间绑定 shuffle 的一个 Hadoop 配置
  • 用来指定 keystore 和 truststore 属性的Hadoop配置(位置,类型,密码) 用于 shuffle 服务和reducer任务去取 shuffle 数据。
  • 在集群中交叉重载 truststores (当一个节点加入或删除时).

配置

core-site.xml 属性

要允许加密shuffle, 在 core-site.xml 中对集群中的所有节点设置下面的属性:

属性 默认值 说明
hadoop.ssl.require.client.cert false 客户端证书是否需要
hadoop.ssl.hostname.verifier DEFAULT 提供给HttpsURLConnections的主机名验证器. 合法的值是:
 DEFAULTSTRICTSTRICT_I6DEFAULT_AND_LOCALHOST 和ALLOW_ALL
hadoop.ssl.keystores.factory.class org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory 要用的KeyStoresFactory实现
hadoop.ssl.server.conf ss-server.xml 要抽取keystore信息的 ssl服务器中的文件。
这个文件要在classpath中查找, 一般应该在 Hadoop conf/ 目录中。
hadoop.ssl.client.conf ss-client.xml 要抽取keystore信息的 ssl服务器中的文件。
这个文件要在classpath中查找, 一般应该在 Hadoop conf/ 目录中。

重要: 当前需要把客户端证书设置为false。参考 Client Certificates 一节以获得细节内容。

重要:在集群配置文件中的所有属性应该标记为 final。

示例 :
    ...
    <property>
      <name>hadoop.ssl.require.client.cert</name>
      <value>false</value>
      <final>true</final>
    </property>

    <property>
      <name>hadoop.ssl.hostname.verifier</name>
      <value>DEFAULT</value>
      <final>true</final>
    </property>

    <property>
      <name>hadoop.ssl.keystores.factory.class</name>
      <value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value>
      <final>true</final>
    </property>

    <property>
      <name>hadoop.ssl.server.conf</name>
      <value>ssl-server.xml</value>
      <final>true</final>
    </property>

    <property>
      <name>hadoop.ssl.client.conf</name>
      <value>ssl-client.xml</value>
      <final>true</final>
    </property>
    ...

mapred-site.xml 属性

要允许加密shuffle, 在 mapred-site.xml 中对集群中的所有节点设置下面的属性:

属性 默认值 说明
mapreduce.shuffle.ssl.enabled false 加密 shuffle允许与否

重要: 在集群配置文件中的这个属性应该标记为 final。

示例 :
    ...
    <property>
      <name>mapreduce.shuffle.ssl.enabled</name>
      <value>true</value>
      <final>true</final>
    </property>
    ...

Linux 容器执行器应该设置为阻止作业任务读取服务器的keystore信息,以及获得shuffle服务器证书。

参考 Hadoop Kerberos 配置,以获得此处如何做的细节。

Keystore 和 Truststore 的设置

当前 FileBasedKeyStoresFactory 是 KeyStoresFactory 的唯一实现.  FileBasedKeyStoresFactory 实现用了下面的属性, 在 ssl-server.xml 和 ssl-client.xml 文件中,用来配置 keystores 和 truststores.

ssl-server.xml (Shuffle server) 的配置:

mapred 用户应该拥有ssl-server.xml文件并有唯一地访问权。

属性 默认值 说明
ssl.server.keystore.type jks Keystore 文件类型
ssl.server.keystore.location NONE Keystore 文件的位置. 
mapred 用户应该拥有此文件并有唯一地访问权。
ssl.server.keystore.password NONE Keystore 文件密码
ssl.server.truststore.type jks Truststore 文件类型
ssl.server.truststore.location NONE Truststore 文件的位置. 
mapred 用户应该拥有此文件并有唯一地访问权。
ssl.server.truststore.password NONE Truststore 文件密码
ssl.server.truststore.reload.interval 10000 Truststore 重载间距, 毫秒值
示例:
<configuration>

  <!-- Server Certificate Store -->
  <property>
    <name>ssl.server.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.location</name>
    <value>${user.home}/keystores/server-keystore.jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.password</name>
    <value>serverfoo</value>
  </property>

  <!-- Server Trust Store -->
  <property>
    <name>ssl.server.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.server.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>

ssl-client.xml (Reducer/Fetcher)  的配置:

mapred 用户应该拥有ssl-server.xml文件并它应该有默认的权限。

属性 默认值 说明
ssl.client.keystore.type jks Keystore 文件类型
ssl.client.keystore.location NONE Keystore 文件的位置. 
mapred 用户应该拥有此文件并有唯一地访问权。
ssl.client.keystore.password NONE Keystore 文件密码
ssl.client.truststore.type jks Truststore 文件类型
ssl.client.truststore.location NONE Truststore 文件的位置. 
mapred 用户应该拥有此文件并有唯一地访问权。
ssl.client.truststore.password NONE Truststore 文件密码
ssl.client.truststore.reload.interval 10000 Truststore  重载间距, 毫秒值
示例 :
<configuration>

  <!-- Client certificate Store -->
  <property>
    <name>ssl.client.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.location</name>
    <value>${user.home}/keystores/client-keystore.jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.password</name>
    <value>clientfoo</value>
  </property>

  <!-- Client Trust Store -->
  <property>
    <name>ssl.client.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.client.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>
            
            
            
            

激活Encrypted Shuffle

当你改变了上面的配置,要通过重启所有的  NodeManagers 来激活 Encrypted Shuffle.

重要: 使用 encrypted shuffle 会导致对性能有明显影响。用户应该避免这种情况,并尽可能地 保留1或更多的加密 shuffle 核心。(?)

ClientCertificates 客户端证书

使用客户端证书并不能完全保证客户端是作业的一个reducer任务。当前,客户端证书(他们的私钥)keystore 文件 必须对所有提交作业到集群的用户 是可读的。这意味着一个欺诈性的作业可以读这些 keystore 文件,并在其上使用客户端证书与一个Shuffle服务器建立安全连接。然而,除非欺诈性作业有一个合理的 JobToken, 否则它将不能从 Shuffle server 上检索数据。一个作业,用其自己的 JobToken, 仅可以检索属于它自身的数据。

重载Truststores

默认地, truststores 会每10秒重载一次他们的配置文件。如果在一个旧的 truststore 文件 上复制了一个新的,它会被重新读取,它的证书也会替换掉旧的。这种机制对于从集群上添加或删除节点,或者是添加/删除信任的客户端非常有用。这种情况下,客户端或者 NodeManager 证书就被添加到(或从中删除)系统中的所有的 truststore 文件上,并且不必重启 NodeManager 守护进程,新的配置就会被发现。

Debugging

注意: 启用 debugging 仅仅是为了发现和解决问题,作业也只是运行在小量数据上。会几个数量级地减慢作业,也是冗长的。(你可能需要增加 mapred.task.timeout 防止作业失败,因为任务执行如此之慢。)

要在 reducers 中允许 SSL debugging, 设置-Djavax.net.debug=all in the mapreduce.reduce.child.java.opts 属性; 例如:

  <property>
    <name>mapred.reduce.child.java.opts</name>
    <value>-Xmx-200m -Djavax.net.debug=all</value>
  </property>

你可以在每个作业上都这样做,或用 mapred-site.xml 的集群范围内的设置。

要在 NodeManager 中设置这个属性, 请在 yarn-env.sh 文件中设置:

  YARN_NODEMANAGER_OPTS="-Djavax.net.debug=all $YARN_NODEMANAGER_OPTS"

你可能感兴趣的:(hadoop,文档)