我在:
中运行PySpark应用程序我在一个非常大的群集上运行。应用程序从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中没有发现任何相关内容,也无法弄清楚这些解决方案将如何适用于我。
谢谢!
答案 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。