会发生什么取决于你如何读取文件的答案或文件的部分链接:
如果使用SparkSession提供的工具阅读一个DataFrame(见DataFrameReader文档),然后创建一个执行图,它将尝试读取节点本地数据。即每个Spark执行程序将读取驻留在分布式存储的本地执行程序部分的数据:例如本地HDFS块。这要求您在数据存储上分区信息,并使用它来创建DataFrameReader。 这是将Spark用于大数据的正确方法,因为它允许近似任意缩放。
如果您在星火代码中使用Java或斯卡拉文件-10,那么两种情况之一发生:
- 如果代码上的驱动程序执行,你将不得不并行你读数据从文件中使用SparkSession.parallelize从您读取的数据生成的集合中。这对于一些测试非常有用,但不会扩展到Spark在生产中有意义的大多数情况。
- 如果代码在执行器上执行(即在RDD.map封闭内部),那么将在运行该代码的每个执行器上读取该文件,并且可以在每个执行器上完整地获得该文件。这通常是不可取的,除非您有非常特殊的要求 - 它还要求文件在每个节点上可用。
关于SparkSQL和查询表 - 在驱动程序上解释查询并生成对应于查询的执行计划。然后使用此执行计划将生成的阶段分发给那些包含处理阶段所需数据的执行程序,并确保数据以这种方式重新分发,以便执行以下阶段。由于SparkSQL通常不会针对数据库运行,而是基于列或基于行的文件结构运行,因此每个执行器理想情况下只加载本地的文件数据。如果数据不是本地的,则每个执行程序都会尝试从外部数据存储区加载多个分区,可能会使用某些过滤器逻辑下推。在那种情况下,是的,每个工作人员都会查询“数据库”,但只能查看部分数据,通常只能读取记录。