我的数据大概是300G。如果我使用Hadoop对其执行reduce任务,则180减少插槽就可以了,队列中没有任务等待。
如果我使用相同数量的reduce插槽使用Spark,它会在shuffle阶段卡住,而如果我使用更多的插槽就不会发生这种情况,比方说4000,但这会以低效率结束。
我能做些什么,例如调整参数,以便我可以使用与hadoop相同的插槽?
BTW,我的集群有15个节点,每个节点有12个核心答案 0 :(得分:2)
Shuffle Operation in Hadoop and Spark是关于这个主题的精彩读物。一些引言:
Spark中的每个map任务都为每个reducer写出一个shuffle文件(操作系统磁盘缓冲区) - 这对应于Spark中的逻辑块。这些文件不是中介,因为Spark不会将它们合并到更大的分区文件中。由于Spark中的调度开销要小得多,所以没有。 mappers(M)和reducer(R)的数量远高于Hadoop。因此,将M * R文件传送到相应的减速器可能会导致很大的开销。
Hadoop和Spark之间的主要区别在于reducer端--Spark要求所有洗牌数据都适合相应的reducer任务的内存(我们看到Hadoop有一个选项可以将其溢出到磁盘上)。
与迄今为止的讨论中的Spark's shuffle相比,看起来Hadoop shuffle看起来更加优化。然而,情况确实如此,研究人员对Spark w.r.t进行了重大优化。洗牌操作。两种可能的方法是1.通过合并中间文件来模拟Hadoop行为2.创建更大的shuffle文件3.使用柱状压缩将瓶颈转移到CPU。
在Optimizing Shuffle Performance in Spark中得出了类似的结论:
通过识别Spark特有的洗牌阶段瓶颈, 我们已经探索了几种减轻运营的替代方案 与这些瓶颈相关的系统开销。其中最富有成效的是随机文件整合,a 简单的解决方案,使整体工作提高了2倍 完成时间。
所以你看,Hadoop / YARN没有直接与Spark比较,特别是在shuffle和reduce时。 Spark需要特定的优化技术,与Hadoop不同。您的案例中需要完全很难猜到。但我的印象是,您只是略过问题的表面,只是调整Spark中的Reducer数量并不能解决问题。