SparkからOpenStack Swiftへのアクセス
SparkによるHadoopのInputFormatのサポートにより、Hadoopと同じURI形式を使ってOpenStackSwift内のデータを処理することができます。swift://container.PROVIDER/path
の形式のURIを入力として使うことで、Swift内のパスを指定することができます。core-site.xml
あるいは SparkContext.hadoopConfiguration
を使って、Swiftセキュリティの証明書を設定する必要もあるでしょう。現在のSwiftドライバーはKeystone認証メソッドを必要とします。
より良いデータローカリティのためのSwiftの設定
必須ではありませんが、より良いデータローカリティのためにlist_endpoints
を使ってSwiftのproxyサーバを設定することをお勧めします。更なる情報はここで利用可能です。
依存
Sparkアプリケーションは hadoop-openstack
依存性を持つ必要があります。例えば、Mavenサポートのために、以下をpom.xml
ファイルに追加します:
<dependencyManagement>
...
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-openstack</artifactId>
<version>2.3.0</version>
</dependency>
...
</dependencyManagement>
設定パラメータ
core-site.xml
を作成し、それをSparkの conf
ディレクトリの中に配置します。設定されなければならないパラメータの2つの主要なカテゴリがあります: Swiftドライバーの宣言と、Keystoneによって必要とされるパラメータ。
Swiftファイルシステムを使うためのHadoopの設定は以下によって行われます
プロパティ名 | 値 |
---|---|
fs.swift.impl | org.apache.hadoop.fs.swift.snative.SwiftNativeFileSystem |
Keystone (v2.0)によって必要とされる追加のパラメータで、Swiftドライバーによって提供されなければなりません。それらのパラメータはKeystone内でSwiftにアクセスするために認証を行うために使われるでしょう。以下の表はKystoneの必須のパラメータのリストを含んでいます。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 region | 必須 |
fs.swift.service.PROVIDER.public |
全てのURLが公開されていることを示す | 必須 |
例えば、PROVIDER=SparkTest
とkeystoneがテナントtest
のために定義されたパスワードtesting
を持つユーザtester
を含む場合を仮定します。core-site.xml
は以下を含む必要があります:
<configuration>
<property>
<name>fs.swift.impl</name>
<value>org.apache.hadoop.fs.swift.snative.SwiftNativeFileSystem</value>
</property>
<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.tenant
, fs.swift.service.PROVIDER.username
, fs.swift.service.PROVIDER.password
は機密情報を含み、それらをcore-site.xml
に保持することは常に良い方法ではないことに注意してください。spark-shell
を使ってSparkを実行している場合にテストの目的でそれらのパラメータを core-site.xml
に保持することを提案します。ジョブの提出のためには、それらはsparkContext.hadoopConfiguration
を使って提供される必要があります。