我正在使用apache-spark 我的spark工作每天创建10k个小文件(~50MB)对于HDFS命名节点来说是过分的
我尝试使用coalesce来减少输出文件的数量,但这会减慢作业速度。 任何人都可以建议我应该使用什么?
答案 0 :(得分:1)
我们有类似的案例。我们每小时运行一次批处理作业并合并所有新文件。您可以使用另一个最适合您的火花作业或任何其他框架来完成此操作。通过这种方式,您可以完全分离这两个任务,并从每个任务中获得最佳性能。
答案 1 :(得分:0)
我找到了一个解决方案!
使用#partitions等于#executors
调用coalesce通过执行此操作,执行程序上的任何任务都将仅声明其执行程序任务输出文件。
如果这看起来不错,请告诉我!
答案 2 :(得分:0)
你试过repartition(#executors)
吗?它可能比coalesce(#executors)
好。
根据Scaladoc的coalesce
方法,
但是,如果您正在进行激烈的合并,例如到numPartitions = 1,这可能导致您的计算发生在更少的节点上 比你想要的多(例如,numPartitions = 1时的一个节点)。至 避免这种情况,你可以调用重新分区。这将增加一个洗牌步骤, 但意味着当前的上游分区将并行执行 (根据当前的分区而定)。
另请参阅:Spark: coalesce very slow even the output data is very small