Spark から OpenStack Swift へのアクセス

Spark の Hadoop InputFormat サポートにより、Hadoop と同じ URI フォーマットで OpenStack Swift のデータを処理できます。Swift 内のパスは、swift://container.PROVIDER/path の形式の URI を介して入力として指定できます。また、core-site.xml または SparkContext.hadoopConfiguration を介して、Swift のセキュリティ認証情報も設定する必要があります。現在の Swift ドライバーは、Swift が Keystone 認証方法、またはその Rackspace 固有の前身を使用することを必要とします。

データローカリティ向上のための Swift の設定

必須ではありませんが、データローカリティを向上させるために、Swift のプロキシサーバーを list_endpoints で設定することが推奨されます。詳細については、こちらで確認できます。

依存関係

Spark アプリケーションには hadoop-openstack 依存関係を含める必要があります。これは、使用する Spark の特定のバージョンに対して hadoop-cloud モジュールを含めることで実現できます。たとえば、Maven を使用している場合は、pom.xml ファイルに以下を追加します。

<dependencyManagement>
  ...
  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>hadoop-cloud_2.13</artifactId>
    <version>${spark.version}</version>
  </dependency>
  ...
</dependencyManagement>

設定パラメータ

core-site.xml を作成し、Spark の conf ディレクトリ内に配置してください。設定すべきパラメータの主なカテゴリは、Keystone で必要とされる認証パラメータです。

以下の表は、Keystone の必須パラメータのリストです。PROVIDER は任意の(英数字の)名前を指定できます。

プロパティ名意味必須
fs.swift.service.PROVIDER.auth.url Keystone 認証 URL 必須
fs.swift.service.PROVIDER.auth.endpoint.prefix Keystone エンドポイントプレフィックス オプション
fs.swift.service.PROVIDER.tenant テナント 必須
fs.swift.service.PROVIDER.username ユーザー名 必須
fs.swift.service.PROVIDER.password パスワード 必須
fs.swift.service.PROVIDER.http.port HTTP ポート 必須
fs.swift.service.PROVIDER.region Keystone リージョン 必須
fs.swift.service.PROVIDER.public パブリック(クラウド外)またはプライベート(クラウド内、転送料金なし)のエンドポイントを使用するかどうかを示します。 必須

たとえば、PROVIDER=SparkTest で、Keystone にテナント test 用に定義されたユーザー tester とパスワード testing があると仮定します。この場合、core-site.xml には以下を含める必要があります。

<configuration>
  <property>
    <name>fs.swift.service.SparkTest.auth.url</name>
    <value>http://127.0.0.1:5000/v2.0/tokens</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.auth.endpoint.prefix</name>
    <value>endpoints</value>
  </property>
    <name>fs.swift.service.SparkTest.http.port</name>
    <value>8080</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.region</name>
    <value>RegionOne</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.public</name>
    <value>true</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.tenant</name>
    <value>test</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.username</name>
    <value>tester</value>
  </property>
  <property>
    <name>fs.swift.service.SparkTest.password</name>
    <value>testing</value>
  </property>
</configuration>

fs.swift.service.PROVIDER.tenantfs.swift.service.PROVIDER.usernamefs.swift.service.PROVIDER.password には機密情報が含まれるため、これらを core-site.xml に保持することは常に良い方法とは限りません。spark-shell を介して Spark を実行する際のテスト目的では、これらのパラメータを core-site.xml に保持することをお勧めします。ジョブの送信時には、sparkContext.hadoopConfiguration を介して提供する必要があります。