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

Dan*_*nny 7 hadoop hdfs apache-spark pyspark

我在运行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.
Run Code Online (Sandbox Code Playgroud)

它往往发生在有关访问加载到内存和广播的文件的消息之后.这个警告是警告的吗?怎么避免呢?

谷歌搜索带来了几个人在本机Hadoop应用程序中处理此警告,但我在Spark或PySpark中没有发现任何相关信息,也无法弄清楚这些解决方案将如何适用于我.

谢谢!

Ste*_*ran 11

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

请参阅:SDK反复抱怨"并非所有字节都是从S3ObjectInputStream中读取的

如果你看到这个有很多,而你与列数据格式,如ORC和实木复合地板的工作,切换输入通过设置属性在连续流过随机IO fs.s3a.experimental.fadviserandom.这使它无法尝试读取整个文件,而只是读取小块.对于完整文件读取(包括.gz文件)非常糟糕,但转换列IO.

请注意,在最终关闭HADOOP-14596的 S3A for Hadoop 3.x中有一个小修复.EMR团队是否要向后移动.

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

  • 而不是做一个大的 GET 0-EOF,它做 G offset, min(read-len, fs.s3a.readahead)。HADOOP-13203 如果你好奇的话。顺序读取(CSV、gzip)的性能下降,这就是为什么它不是默认值。 (2认同)