【问题标题】:Using Apache Spark with a local S3-compatible Object store将 Apache Spark 与本地 S3 兼容的对象存储一起使用
【发布时间】:2019-08-03 04:55:37
【问题描述】:

我正在尝试使用完全兼容 s3 sdk/api 的本地对象存储运行简单的 Apache spark (Cloudera) 读取操作。但我似乎无法弄清楚如何让 Spark 了解我正在尝试访问 本地 S3 存储桶而不是远程 AWS/S3。

这是我尝试过的...

pyspark2 --conf spark.hadoop.hadoop.security.credential.provider.path=jceks://hdfs/user/myusername/awskeyfile.jceks --conf fs.s3a.endpoint=https://myenvironment.domain.com
df = spark.read.parquet("s3a://mybucket/path1/")

错误信息...

Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to mybucket.s3.amazonaws.com:443 [mybucket.s3.amazonaws.com/12.345.678.90] failed: Connection refused (Connection refused)

我可以在命令行上毫无问题地列出本地存储桶内容,因此我知道我的访问/密钥正确,但我需要让 Spark 理解才能联系 aws尝试解析存储桶 url。

谢谢。

更新/解决:

该问题的修复是在 maven 坐标处缺少先决条件 jar:org.apache.hadoop:hadoop-aws:2.6.0

所以最终的 pyspark 调用看起来像:

pyspark2 --conf spark.hadoop.hadoop.security.credential.provider.path=jceks://hdfs/user/myusername/awskeyfile.jceks --conf fs.s3a.endpoint=https://myenvironment.domain.com --jars hadoop-aws-2.6.0.jar
df = spark.read.parquet("s3a://mybucket/path1/") 

【问题讨论】:

  • 您需要将 logging.level.com.amazonaws 的日志级别设置为 DEBUG 以查看发生了什么。这个错误可能意味着很多东西......

标签: apache-spark object-storage


【解决方案1】:

这在 HDP 文档Working with third party object stores 中有介绍。

CDH 的设置相同。

下来了

  • 端点fs.s3a.endpoint = 主机名
  • 禁用 DNS 到桶映射 fs.s3a.path.style.access = true
  • 玩转签名选项。

您可以打开其他一些开关以获得更好的兼容性;他们在那些文档中。

您可能会发现Cloudstore storediag 命令很有用。

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2018-08-26
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2017-08-29
    • 2023-01-11
    • 2021-08-21
    相关资源
    最近更新 更多