使用 PySpark 从 Amazon S3 读取文本文件

Posted

技术标签:

【中文标题】使用 PySpark 从 Amazon S3 读取文本文件【英文标题】:reading text file from Amazon S3 with PySpark 【发布时间】:2018-06-07 12:36:56 【问题描述】:

我正在尝试让 Spark 集群从 Amazon S3 云存储中读取数据源。这会导致以下错误,我需要一些帮助来诊断问题:

>>> sc.textFile("s3a://storage-bucket/s3test.txt").collect()

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: D47397DA8BCB4669, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: /aBi99tozgFEsdRGubDwhriMsNQvl1jLOf8AJquA8VXxzkpPL/LLCWDFQQvYn4snHx5gx66/pXo=

顺便说一句,这很好用:

$ aws s3 cp s3://storage-bucket/s3test.txt ./s3text.txt
download: s3://storage-bucket/s3test.txt to ./s3text.txt
$ cat s3text.txt 
Hello S3

错误消息中的更多细节:

Caused by: org.jets3t.service.S3ServiceException: Service Error Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>SignatureDoe
sNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>xxxxxxxxxxxxxxxxxx</AWSAccessKeyId><St

【问题讨论】:

@RameshMaharjan 收集结果?这并没有改变任何东西,并且错误消息指出了 S3 端的问题。 你能发布完整的错误日志吗? 为了获得更好的调试,您可以尝试像这样访问文件aws s3 cp s3://storage-bucket/s3test.txt ./s3test.txt @destroy-everything 好主意,但这没有问题 您可以尝试使用sc.parallelize([1,2,3]).collect() 查看 S3 或您的 Spark 配置是否有问题? 【参考方案1】:

您能否检查您的fs.s3a.access.keyfs.s3a.secret.key 并确保它们与您用于执行aws s3 cp 测试的凭据匹配。这个SignatureDosNotMatcherror 可以在凭据错误时出现。试试hdfs fs -ls s3a://storage-bucket/

【讨论】:

【参考方案2】:

您的配置有问题。 S3A 连接器使用 AWS 开发工具包。如果您的堆栈跟踪包含 jets3t,那么您以某种方式将错误的文件系统连接到它。从您的源代码中删除任何设置有关 fs.s3a.impl 的属性并依赖 Hadoop 运行时来解决问题的任何东西,然后重复

【讨论】:

你能不能把它翻译成对 Spark 初学者来说可行的东西?我不知道设置任何属性,也不知道我是否依赖于 Hadoop 运行时。 好的。堆栈跟踪具有“org.jets3t.service.S3ServiceException”行这一事实意味着无论它使用的是什么 S3 连接器,它都不是官方的 ASF s3a 连接器。我建议配置错误,但另一种可能是您使用的是 Amazon EMR,在这种情况下,您使用的是他们的闭源连接器。是哪个?

以上是关于使用 PySpark 从 Amazon S3 读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 pySpark 连接 Amazon s3 时出现问题

无法使用本地 PySpark 从 S3 读取 json 文件

使用本地机器从 s3 读取数据 - pyspark

使用 pyspark 从 s3 读取/加载 avro 文件

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

使用 pyspark 从 S3 服务器读取时出错:[java.lang.IllegalArgumentException]