从 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 包含为租户 test 定义的具有密码 testing 的用户 tester。然后 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 提供它们。