Spark Streaming:避免HDFS中的小文件

时间:2018-06-05 15:52:31

标签: apache-spark hdfs spark-streaming

我有一个Spark Streaming应用程序将其输出写入HDFS。

我可以采取哪些预防措施和策略来确保此过程不会生成太多小文件,并在HDFS Namenode中产生内存压力。 Apache Spark是否提供任何预先构建的解决方案以避免HDFS中的小文件。

4 个答案:

答案 0 :(得分:1)

没有。 Spark不提供任何此类解决方案。

你能做什么:

  1. 增加批处理间隔 - 这将不保证任何 - 但仍有更高的机会。虽然这里的权衡是流式传输具有更大的延迟
  2. 手动管理它。例如 - 在每个批次上,您可以计算RDD的大小并累积RDD,除非它们满足您的大小要求。然后你只需要联合RDD并写入磁盘。这将不可预测地增加延迟,但将保证有效的空间使用

答案 1 :(得分:1)

另一个解决方案也是让另一个Spark应用程序每小时/每天/每周重新集成小文件等。

答案 2 :(得分:0)

您可以减少零件文件的数量。 默认情况下,spark会在200个文件中生成输出。您可以减少零件文件的数量。

答案 3 :(得分:0)

我知道这个问题很旧,但将来可能对某人有用。

另一种选择是将coalesce与较少的分区一起使用。 coalesce将分区合并在一起,并创建更大的分区。由于减少了写入过程中的分区数量,因此可以增加流式批处理的处理时间,但有助于减少文件数量。

这将降低并行度,因此分区太少会导致Streaming作业出现问题。您将需要测试coalesce的不同分区值,以找出哪种值最适合您的情况。