2016-07-31 64 views
2

我是Spark新手。如何知道哪些代码将在驱动程序&上运行,哪些将在执行程序上运行?如何知道哪一段代码在驱动程序或执行程序上运行?

我们是否总是要尝试编码,以使所有的东西都在执行者上运行?有没有任何建议/方法可以使你的大部分代码在执行器上运行?

更新:据我了解转换运行在执行器上&动作在驱动程序上运行,因为它需要返回值。那么,如果动作运行在驱动程序上,还是应该在执行程序上运行呢?司机在哪里运行?在集群上?

+1

很好的问题,但有点广泛,你可以给你一些例子观察,你发现在特定的答案.. Spark或任何其他分布式框架,旨在解决以分布式方式执行的大数据需求。 –

+0

在spark foreach和take中,两者都是动作,但foreach在驱动程序节点上运行,在执行程序节点上运行。谁能解释为什么? – Nitish

回答

9

任何Spark应用程序由单个驱动程序进程和一个或多个执行程序进程组成。驱动程序进程将在群集的主节点上运行,并且执行程序进程在Worker节点上运行。您可以根据您的使用情况动态增加或减少Executor进程的数量,但驱动程序进程将在应用程序的整个生命周期中存在。

驱动程序进程负责很多事情,包括指导应用程序的总体控制流程,重新启动失败阶段以及应用程序处理数据的整个高级方向。

对您的应用程序进行编码以便更多数据由执行程序进行处理更多地处于优化应用程序的范围之内,以便它可以更高效地处理数据,从而更快速地利用集群中可用的所有资源。 实际上,您并不需要担心确保更多的数据正在被执行者处理。

这就是说,有一些行动,当触发时,必然涉及洗牌数据。如果您在RDD上调用collect操作,则所有数据都会传送到驱动程序进程,并且如果您的RDD中有足够大的数据量,应用程序将触发错误Out Of Memory,因为运行驱动程序的单台计算机进程将无法保存所有数据。

记住上述内容,转换是懒惰的,动作不是。 转换基本上将一个RDD转换为另一个。但在RDD上调用转换实际上并不会导致任何数据在任何地方处理,即驱动程序或执行程序。所有的转换都是增加了DAG的血统图,当一个Action被调用时它将被执行。

因此,当您在RDD上调用Action时会发生实际的处理。最简单的例子是调用collect。只要一个动作被调用,Spark就开始工作,并在指定的RDD上执行先前保存的DAG计算,并返回结果。这些计算执行的地方完全取决于您的应用程序。

+0

I/O在哪里发生?如果您正在读取HDFS或S3,那是从驱动程序还是从执行程序发生? – wrschneider

+1

从HDFS中读取数据时,驱动程序将创建一个RDD,RDD的分区数与该文件存储的HDFS数据块的数量相对应。分区将分布在执行程序上。当需要处理数据时,执行程序将读取它们的特定分区来执行计算。 – septra

+0

谢谢。这是否也适用于S3? – wrschneider

7

这里没有简单直接的答案。

作为被内部的高阶函数封闭像mapPartitionsmapfilterflatMap)或combineByKey执行拇指的所有内容的规则应该主要是由执行程序的机器进行处理。除此之外的所有操作均由驾驶员处理。但是你必须意识到这是一种严重的简化。

根据具体的方法和语言,司机可以处理至少一部分工作。例如,当您使用类似combine的方法(reduce,aggregate)时,最终合并在驱动程序机器上本地应用。复杂的算法(如许多ML/MLlib工具)可以在需要时交织分布式和本地处理。

此外,数据处理只是整个工作的一小部分。司机负责bookeeping,累加器处理,初始广播和其他次要任务。它还处理沿袭和DAG处理并为更高级别的API生成执行计划(DatasetSparkSQL)。

尽管整个画面在实践中相对复杂,但您的选择相对有限。您可以:

  • 避免收集数据(collect, toLocalIterator)以在本地处理。
  • tree*treeAggregatetreeReduce)方法对工人进行更多的工作。
  • 避免不必要的增加簿记成本的任务。
+0

+1但是由于septra的答案是用简单的语言和易于理解的新火花用户,所以接受。 –

+0

+1 for treeAggregate和treeReduce方法 https://umbertogriffo.gitbooks.io/apache-spark-best-practices-and-tuning/content/treereduce_and_treeaggregate_demystified.html –

相关问题