從 Spark 存取 OpenStack Swift

Spark 支援 Hadoop InputFormat,讓它能使用與 Hadoop 相同的 URI 格式處理 OpenStack Swift 中的資料。您可以透過 swift://container.PROVIDER/path 格式的 URI 將 Swift 中的路徑指定為輸入。您也需要透過 core-site.xmlSparkContext.hadoopConfiguration 設定您的 Swift 安全認證。目前的 Swift 驅動程式需要 Swift 使用 Keystone 認證方法,或其 Rackspace 特定的前身。

設定 Swift 以獲得更好的資料區域性

雖然不是強制性的,但建議使用 list_endpoints 設定 Swift 的代理伺服器,以獲得更好的資料區域性。更多資訊 在此處

相依性

Spark 應用程式應包含 hadoop-openstack 相依性,這可透過包含特定 Spark 版本的 hadoop-cloud 模組來完成。例如,對於 Maven 支援,請將下列內容新增至 pom.xml 檔案

<dependencyManagement>
  ...
  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>hadoop-cloud_2.12</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 包含使用者 tester,密碼為 testing,定義為租戶 test。則 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 提供這些參數。