Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3

Posted

技术标签:

【中文标题】Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3【英文标题】:Spark saveAsTextFile writes empty file - <directory>_$folder$ to S3 【发布时间】:2017-12-26 02:07:07 【问题描述】:

rdd.saveAsTextFile("s3n://bucket-name/path) 正在创建一个文件夹名称为 - [folder-name]_$folder$ 的空文件 似乎hadoop-aws jar (of org.apache.hadoop) 使用这个空文件来模仿 S3 文件系统作为 hadoop 文件系统。

但是,我的应用程序将数千个文件写入 S3。当saveAsTextFile 创建文件夹(从给定路径)以写入数据(从rdd)时,我的应用程序最终创建了数千个这样的空文件-[directory-name]_$folder$

有没有办法让rdd.saveAsTextFile不写这些空文件?

【问题讨论】:

【参考方案1】:

停止使用 s3n,切换到 s3a。它更快并且实际受支持。这将使这个问题以及读取大型 Parquet/ORC 文件的严重性能问题消失。

此外,如果您的应用在 S3 中创建了数千个小文件,那么您将在未来产生性能问题:在 S3 上列出和打开文件的速度很慢。尝试将源数据合并到更大的列格式文件中,并使用您的框架必须的任何 SELECT 机制来仅读取您想要的位

【讨论】:

我尝试使用s3a,但它仍在创建&lt;directory-name&gt;_$folder$ 文件。 不,不是。我说刚刚重新检查了S3AFileSystem 的源代码,它位于我面前的IDE 中。 $folder$ 后缀在目录检查中被查找,但从未创建。如果它们出现了,那么除了 s3a 之外的其他东西正在这样做。 你能分享一下你正在使用什么文件系统实现吗?即fs.s3a.impl的值,我用的是org.apache.hadoop.fs.s3native.NativeS3FileSystem 就像我说的,你没有使用 s3a。您不必在那里设置任何属性,因为它将从 hadoop-common.jar 中 core-default.xml 的基本配置中选择。只需使用 s3a:// 网址 不,我的工作要求fs.s3a.impl,但我没有提供。我没有办法更新core-default.xml(在我正在部署我的应用程序的节点上),所以,火花从core-default 中选择了什么属性/值。

以上是关于Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3的主要内容,如果未能解决你的问题,请参考以下文章

Spark saveAsTextFile写入空文件 - _ $ folder $到S3

spark中saveAsTextFile如何最终生成一个文件

spark中saveAsTextFile如何最终生成一个文件

Spark&Scala:saveAsTextFile()异常

saveAsTextFile 在 spark java.io.IOException 中挂起:数据框中的对等方重置连接

Python Spark-如何将空 DataFrame 输出到 csv 文件(仅输出标头)?