AWS中的Spark:" S3AbortableInputStream:并非所有字节都是从S3ObjectInputStream"

时间:2018-01-10 21:08:52

标签: hadoop apache-spark pyspark hdfs

我在:

中运行PySpark应用程序
  • EMR-5.8.0
  • Hadoop发行版:亚马逊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.

在有关访问加载到内存和广播的文件的消息之后,往往会发生这种情况。这个警告是警告的吗?如何避免呢?

谷歌搜索在原生Hadoop应用程序中提出了几个处理此警告的人,但我在Spark或PySpark中没有发现任何相关内容,也无法弄清楚这些解决方案将如何适用于我。

谢谢!

2 个答案:

答案 0 :(得分:8)

忽略它。 当您在输入流上调用abort()时,AWS SDK的最新版本会始终告诉您,即使在移动多GB文件时您需要执行此操作。对于小文件,是的,读取EOF是正确的做法,但对于大文件,没有。

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

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

注意,在最终收盘HADOOP-14596上,在S3A for Hadoop 3.x中有一个小修复。直到EMR团队是否向后移动。

+我会在S3A故障排除文档中添加一些文字。 ASF从未发布带有此问题的hadoop版本,但如果人们正在与AWS SDK混合搭配(非常脆弱),那么这可能会出现

答案 1 :(得分:1)

注意:,这仅适用于非EMC的安装,因为AWS不提供s3a


在根据Steve Loughran的答案选择忽略警告或通过设置更改输入流之前,请确保您未使用s3://bucket/path表示法。

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