Hadoop: 暗号化されたシャッフル

はじめに

暗号化されたシャッフル機能により、HTTPSを使用し、オプションでクライアント認証(双方向HTTPS、またはクライアント証明書付きHTTPSとも呼ばれます)を使用して、MapReduceシャッフルを暗号化できます。これは以下で構成されます。

  • HTTPとHTTPSの間でシャッフルを切り替えるためのHadoop構成設定。

  • シャッフルサービスとシャッフルデータを取得するreducerタスクによって使用されるキーストアとトラストストアのプロパティ(場所、タイプ、パスワード)を指定するためのHadoop構成設定。

  • クラスタ全体でトラストストアを再読み込みする方法(ノードが追加または削除された場合)。

構成

core-site.xml のプロパティ

暗号化されたシャッフルを有効にするには、クラスタ内のすべてのノードのcore-site.xmlで次のプロパティを設定します。

プロパティ デフォルト値 説明
hadoop.ssl.require.client.cert false クライアント証明書が必要かどうか
hadoop.ssl.hostname.verifier DEFAULT HttpsURLConnectionsに提供するホスト名検証ツール。有効な値は、DEFAULTSTRICTSTRICT_IE6DEFAULT_AND_LOCALHOST、およびALLOW_ALLです。
hadoop.ssl.keystores.factory.class org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory 使用するKeyStoresFactory実装
hadoop.ssl.server.conf ssl-server.xml SSLサーバーキーストア情報が抽出されるリソースファイル。このファイルはクラスパスで検索され、通常はHadoop conf/ディレクトリにあります。
hadoop.ssl.client.conf ssl-client.xml SSLサーバーキーストア情報が抽出されるリソースファイル。このファイルはクラスパスで検索され、通常はHadoop conf/ディレクトリにあります。
リソースファイル。sslクライアントのキーストアとトラストストアの情報が抽出されます。このファイルはクラスパスで検索され、通常はHadoop conf/ディレクトリに配置する必要があります TLSv1.2 サポートされているSSLプロトコル。このパラメータはDatanodeHttpServerからのみ使用されます。

重要:現在、クライアント証明書の要求はfalseに設定する必要があります。詳細は、クライアント証明書セクションを参照してください。

重要: これらのプロパティはすべて、クラスタ構成ファイルで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 のプロパティ

暗号化されたシャッフルを有効にするには、クラスタ内のすべてのノードのmapred-site.xmlで次のプロパティを設定します。

プロパティ デフォルト値 説明
mapreduce.shuffle.ssl.enabled false true

暗号化されたシャッフルが有効になっているかどうか

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

重要: このプロパティは、クラスタ構成ファイルでfinalとしてマークする必要があります。

ジョブタスクがサーバーのキーストア情報を読み取ってシャッフルサーバー証明書にアクセスできないように、Linuxコンテナエグゼキュータを設定する必要があります。

これを行う方法の詳細については、Hadoop Kerberosの構成を参照してください。

現在、FileBasedKeyStoresFactoryは唯一のKeyStoresFactory実装です。FileBasedKeyStoresFactory実装は、ssl-server.xmlファイルとssl-client.xmlファイルの次のプロパティを使用して、キーストアとトラストストアを構成します。

ssl-server.xml (シャッフルサーバー) の構成

mapredユーザーはssl-server.xmlファイルを所有し、排他的な読み取りアクセス権を持っている必要があります。

プロパティ デフォルト値 説明
ssl.server.keystore.type jks キーストアファイルのタイプ
ssl.server.keystore.location NONE キーストアファイルの場所。mapredユーザーはこのファイルを所有し、排他的な読み取りアクセス権を持っている必要があります。
ssl.server.keystore.password NONE キーストアファイルのパスワード
ssl.server.truststore.type jks jks
トラストストアファイルのタイプ NONE ssl.server.truststore.location
トラストストアファイルの場所。 mapredユーザーはこのファイルを所有し、排他的な読み取りアクセス権を持っている必要があります。 NONE ssl.server.truststore.password
トラストストアファイルのパスワード 10000 ssl.server.truststore.reload.interval

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

10000

トラストストアの再読み込み間隔(ミリ秒)

プロパティ デフォルト値 説明
ssl-client.xml (Reducer/Fetcher) の構成 jks キーストアファイルのタイプ
mapredユーザーはssl-client.xmlファイルを所有し、デフォルトのパーミッションを持っている必要があります。 NONE ssl.client.keystore.type
jks NONE キーストアファイルのパスワード
キーストアファイルのタイプ jks jks
ssl.client.keystore.location NONE キーストアファイルの場所。mapredユーザーはこのファイルを所有し、デフォルトのパーミッションを持っている必要があります。
ssl.client.keystore.password NONE ssl.server.truststore.password
キーストアファイルのパスワード 10000 ssl.server.truststore.reload.interval

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

ssl.client.truststore.type

jks

トラストストアファイルのタイプ

ssl.client.truststore.location

トラストストアファイルの場所。mapredユーザーはこのファイルを所有し、デフォルトのパーミッションを持っている必要があります。

ssl.client.truststore.password

トラストストアファイルのパスワード

ssl.client.truststore.reload.interval

10000

トラストストアの再読み込み間隔(ミリ秒)

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

暗号化されたシャッフルのアクティブ化

上記の構成変更を行ったら、すべてのNodeManagerを再起動して、暗号化されたシャッフルをアクティブにします。

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

重要:暗号化されたシャッフルを使用すると、パフォーマンスに大きな影響があります。ユーザーはこれをプロファイルし、暗号化されたシャッフル用に1つ以上のコアを予約する必要があります。

この機能により、マージフェーズとシャッフルフェーズで生成される中間ファイルの暗号化が可能になります。ジョブプロパティ mapreduce.job.encrypted-intermediate-datatrue に設定することで有効化できます。

名称 種類 説明
mapreduce.job.encrypted-intermediate-data ブール値 MapReduceの中間スピルファイルの暗号化を有効または無効にします。デフォルトはfalseです。
mapreduce.job.encrypted-intermediate-data-key-size-bits 整数 ディスクにスピルされたデータを暗号化するためにキー生成器で使用されるキーの長さ。
mapreduce.job.encrypted-intermediate-data.buffer.kb 整数 暗号化後にディスクに書き込まれるストリームのバッファサイズ(KB単位)。

注記: 現在、暗号化された中間データスピルを有効にすると、ジョブの試行回数が1回に制限されます。