2

我想从 S3 资源创建一个 Apache Spark DataFrame。我在 AWS 和 IBM S3 Clout Object Store 上试过,都失败了

org.apache.spark.util.TaskCompletionListenerException: Premature end of Content-Length delimited message body (expected: 2,250,236; received: 16,360)

我正在运行 pyspark

./pyspark --packages com.amazonaws:aws-java-sdk-pom:1.11.828,org.apache.hadoop:hadoop-aws:2.7.0

我正在为 IBM 设置 S3 配置

sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "xx")
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "xx")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.eu-de.cloud-object-storage.appdomain.cloud")

或 AWS 与

sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "xx")
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", " xx ")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.us-west-2.amazonaws.com")

在这两种情况下,以下代码:df=spark.read.csv("s3a://drill-test/cases.csv")

它失败了,但有例外

org.apache.spark.util.TaskCompletionListenerException: Premature end of Content-Length delimited message body (expected: 2,250,236; received: 16,360)
4

3 回答 3

5

这可能会让您感到非常困惑。

下面的错误:

org.apache.spark.util.TaskCompletionListenerException: Premature end of Content-Length delimited message body (expected: 2,250,236; received: 16,360)

s3 是否告诉您与 s3 通信时出现错误。我的猜测是您使用的是旧版本的 spark,它不知道异常是什么,它会尝试将文件作为 XML 错误消息返回。

请通过将它们放在您的阅读调用上方并填写<aws_key><aws_secret>和来查看以下对您的情况有帮助的更新<aws_region>

hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3a.awsAccessKeyId", "<aws_key>")
hadoop_conf.set("fs.s3a.awsSecretAccessKey", "<aws_secret>")
hadoop_conf.set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoop_conf.set("fs.s3a.impl","org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoop_conf.set("com.amazonaws.services.s3.enableV4", "true")
hadoop_conf.set("fs.s3a.aws.credentials.provider","org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider")
hadoop_conf.set("fs.s3a.endpoint", "<aws_region>.amazonaws.com")

祝你好运!

于 2020-10-29T16:26:58.560 回答
1

花了几天时间试图弄清楚这一点。我有 openjdk 版本“1.8.0_265”,当我尝试从 IBM S3 COS 读取时,它给了我那个确切的错误。将我的 java 版本更改为 openjdk 版本“1.8.0_272”并且它工作。

于 2020-10-30T03:42:10.740 回答
1

首先你应该看看它不提供信息的异常

https://spark.apache.org/docs/1.2.2/api/java/org/apache/spark/util/TaskCompletionListenerException.html

我能想到的一种情况是来自 s3 和 IBM 云的用户权限错误。您是访问 s3 上的公共链接,还是访问私有链接(如果是)。您应该深入研究链接权限。

于 2020-07-30T10:27:36.067 回答