【问题标题】:ApacheSpark read from S3 Exception: Premature end of Content-Length delimited message body (expected: 2,250,236; received: 16,360)Apache Spark 从 S3 读取异常:内容长度分隔的消息正文过早结束(预期:2,250,236;收到:16,360)
【发布时间】:2020-11-19 20:23:59
【问题描述】:

我想从 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)

【问题讨论】:

    标签: apache-spark amazon-s3 apache-spark-sql ibm-cloud-storage


    【解决方案1】:

    这可能会让你很困惑。

    以下错误:

    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")
    

    祝你好运!

    【讨论】:

      【解决方案2】:

      花了几天时间试图解决这个问题。我有 openjdk 版本“1.8.0_265”,当我尝试从 IBM S3 COS 读取时,这给了我这个确切的错误。将我的 java 版本更改为 openjdk 版本“1.8.0_272”和成功了。

      【讨论】:

      • 更改为 oracle 版本 1.8.0_231。为我工作,IT 更新了我的 jre。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多