2017-04-25 56 views
0

我对apache spark很新颖,但我想我有种想法。 但我真的不明白哪个节点的apache spark集群正在读取资源。apache spark服务器的哪个节点从磁盘读取一个节点

例如,当我从磁盘读取文件。我发现一些文档和stackoverflow上的答案,表明每个工作人员将读取整个文件。

如果是这种情况,我想对多个工人进行某种线处理,每个工人都会在其内存中拥有它不需要的线,因为另一个工人正在处理它们。

此外,当我使用火花SQL和我查询一个大表会发生什么。 是否每个工人都查询数据库?或者是否有一名工作人员执行查询,然后将数据库的答案转移到其他工作人员上。

它描述的行为将是非常有益

回答

2

会发生什么取决于你如何读取文件的答案或文件的部分链接:

如果使用SparkSession提供的工具阅读一个DataFrame(见DataFrameReader文档),然后创建一个执行图,它将尝试读取节点本地数据。即每个Spark执行程序将读取驻留在分布式存储的本地执行程序部分的数据:例如本地HDFS块。这要求您在数据存储上分区信息,并使用它来创建DataFrameReader。 这是将Spark用于大数据的正确方法,因为它允许近似任意缩放。

如果您在星火代码中使用Java或斯卡拉文件-10,那么两种情况之一发生:

  1. 如果代码上的驱动程序执行,你将不得不并行你读数据从文件中使用SparkSession.parallelize从您读取的数据生成的集合中。这对于一些测试非常有用,但不会扩展到Spark在生产中有意义的大多数情况。
  2. 如果代码在执行器上执行(即在RDD.map封闭内部),那么将在运行该代码的每个执行器上读取该文件,并且可以在每个执行器上完整地获得该文件。这通常是不可取的,除非您有非常特殊的要求 - 它还要求文件在每个节点上可用。

关于SparkSQL和查询表 - 在驱动程序上解释查询并生成对应于查询的执行计划。然后使用此执行计划将生成的阶段分发给那些包含处理阶段所需数据的执行程序,并确保数据以这种方式重新分发,以便执行以下阶段。由于SparkSQL通常不会针对数据库运行,而是基于列或基于行的文件结构运行,因此每个执行器理想情况下只加载本地的文件数据。如果数据不是本地的,则每个执行程序都会尝试从外部数据存储区加载多个分区,可能会使用某些过滤器逻辑下推。在那种情况下,是的,每个工作人员都会查询“数据库”,但只能查看部分数据,通常只能读取记录。