代码之家  ›  专栏  ›  技术社区  ›  Danny

AWS中的Spark:“S3AbortableInputStream:并非所有字节都是从S3ObjectInputStream读取的”

  •  8
  • Danny  · 技术社区  · 7 年前

    我正在以下位置运行PySpark应用程序:

    • emr-5.8.0
    • Hadoop发行版:Amazon 2.7.3
    • Spark 2.2.0

    我在一个非常大的集群上运行。应用程序从s3读取一些输入文件。其中一个被加载到内存中并广播到所有节点。另一个使用SparkFiles功能分发到集群中每个节点的磁盘。该应用程序可以正常工作,但性能低于大型作业的预期。查看日志文件,我看到以下警告几乎不断重复:

    WARN S3AbortableInputStream: Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.
    

    它往往发生在有关访问加载到内存并广播的文件的消息之后。这是一个值得警告的警告吗?如何避免?

    Google Search让一些人在原生Hadoop应用程序中处理这个警告,但我在Spark或PySpark中找不到任何相关信息,也不知道这些解决方案如何适用于我。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  18
  •   stevel    7 年前

    忽略它。 AWS SDK的最新版本总是在您呼叫时提醒您 abort() 在输入流上,即使这是在移动多GB文件时需要执行的操作。对于小文件,是的,读取EOF是正确的,但对于大文件,则不是。

    请参见: SDK repeatedly complaining "Not all bytes were read from the S3ObjectInputStream

    如果您经常看到这种情况,并且正在使用ORC和Parquet等列数据格式,请通过设置属性将输入流切换到随机IO over sequential fs.s3a.experimental.fadvise random . 这就阻止了它尝试读取整个文件,而只读取小块。对于完整文件读取(包括.gz文件)非常糟糕,但会转换列IO。

    注意,Hadoop 3在S3A中有一个小补丁。最终关闭时的x HADOOP-14596 . 由EMR团队决定是否退出。

    +我将在S3A疑难解答文档中添加一些文本。ASF从来没有发布过带有此问题的hadoop版本,但如果人们使用AWS SDK进行混搭(非常脆弱),那么这可能会出现

        2
  •  1
  •   bsplosion    6 年前

    注: 这仅适用于非EMR安装,因为AWS不提供 s3a .


    在根据Steve Loughran的回答选择忽略警告或通过设置更改输入流之前,请绝对确保您没有使用 s3://bucket/path 符号

    从Spark 2开始,您应该通过 s3a://bucket/path ,这可能会解决您看到的警告(对我们来说确实如此),并大大提高S3交互的速度。 See this answer for detail on a breakdown of differences .