我正在使用apachespark我的spark工作每天创建10k个小文件(~50mb),这对于在hdfs中命名节点来说太过致命了我尝试使用coalesce来减少输出文件的数量,但这会减慢作业的速度。有人能建议我用什么吗?
s1ag04yj1#
你试过了吗 repartition(#executors) ? 有可能它比 coalesce(#executors) .根据scaladoc对 coalesce 方法,但是,如果要进行剧烈合并(例如,使numpartitions=1),则这可能会导致计算在比您希望的节点更少的节点上进行(例如,在numpartitions=1的情况下为一个节点)。为了避免这种情况,可以调用重新分区。这将添加一个shuffle步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。另请参阅:Spark:凝聚非常缓慢,即使输出数据非常小
repartition(#executors)
coalesce(#executors)
coalesce
wwodge7n2#
我想出了一个解决办法!调用合并,分区等于执行器通过这样做,executor上的任何一个任务将只声明其executor tasks输出文件。如果这看起来不错,请告诉我!
a64a0gku3#
我们有一个类似的案子。我们每小时运行一次批处理作业并合并所有新文件。您可以使用另一个spark工作或任何其他最适合您的框架来实现这一点。通过这种方式,您可以将这两个任务完全解耦,并从每个任务中获得最佳性能。
3条答案
按热度按时间s1ag04yj1#
你试过了吗
repartition(#executors)
? 有可能它比coalesce(#executors)
.根据scaladoc对
coalesce
方法,但是,如果要进行剧烈合并(例如,使numpartitions=1),则这可能会导致计算在比您希望的节点更少的节点上进行(例如,在numpartitions=1的情况下为一个节点)。为了避免这种情况,可以调用重新分区。这将添加一个shuffle步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。
另请参阅:Spark:凝聚非常缓慢,即使输出数据非常小
wwodge7n2#
我想出了一个解决办法!
调用合并,分区等于执行器
通过这样做,executor上的任何一个任务将只声明其executor tasks输出文件。
如果这看起来不错,请告诉我!
a64a0gku3#
我们有一个类似的案子。我们每小时运行一次批处理作业并合并所有新文件。您可以使用另一个spark工作或任何其他最适合您的框架来实现这一点。通过这种方式,您可以将这两个任务完全解耦,并从每个任务中获得最佳性能。