Java apache spark服务器的哪个节点从磁盘读取节点

Java apache spark服务器的哪个节点从磁盘读取节点,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我对ApacheSpark很陌生,但我想我已经有了这个概念。 但是我不太明白apachespark集群的哪个节点正在阅读参考资料 例如,当我从磁盘读取文件时。我在stackoverflow上找到了一些文档和答案,它们表明每个工作人员都会阅读整个文件 如果是这样的话,我想对多个worker进行某种行处理,那么每个worker的内存中都会有它不需要的行,因为另一个worker正在处理它们 此外,当我使用spark sql查询一个大表时会发生什么。 是否每个工作人员都查询数据库。或者是有一个工作人员执

我对ApacheSpark很陌生,但我想我已经有了这个概念。 但是我不太明白apachespark集群的哪个节点正在阅读参考资料

例如,当我从磁盘读取文件时。我在stackoverflow上找到了一些文档和答案,它们表明每个工作人员都会阅读整个文件

如果是这样的话,我想对多个worker进行某种行处理,那么每个worker的内存中都会有它不需要的行,因为另一个worker正在处理它们

此外,当我使用spark sql查询一个大表时会发生什么。 是否每个工作人员都查询数据库。或者是有一个工作人员执行查询,然后数据库的答案被转移到其他工作人员身上


文档中描述该行为的部分的答案或链接将非常有用

发生的情况取决于您如何读取文件:

如果使用SparkSession提供的工具读取数据帧(请参阅DataFrameReader文档),则将创建一个执行图,该图将尝试读取本地数据节点。也就是说,每个Spark executor将读取驻留在分布式存储的本地执行器部分上的数据:例如本地HDFS块。这要求您在数据存储上具有分区信息,并使用此信息创建DataFrameReader。 这是将Spark用于大数据的正确方法,因为它允许近乎任意的缩放

如果在Spark代码中使用Java或Scala文件IO,则可能发生以下两种情况之一:

  • 如果代码在驱动程序上执行,则必须使用SparkSession.parallelize对从已读取数据生成的集合并行化从文件中读取的数据。这对于某些测试很有用,但不能扩展到Spark在生产中有意义的大多数情况
  • 如果代码在执行器上执行(即在RDD.map闭包内),则该文件将在运行该代码的每个执行器上读取,并在每个执行器上全部可用。这通常是不可取的,除非您有非常具体的要求-它还要求文件在每个节点上都可用

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

    发生的情况取决于您读取文件的方式:

    如果使用SparkSession提供的工具读取数据帧(请参阅DataFrameReader文档),则将创建一个执行图,该图将尝试读取本地数据节点。也就是说,每个Spark executor将读取驻留在分布式存储的本地执行器部分上的数据:例如本地HDFS块。这要求您在数据存储上具有分区信息,并使用此信息创建DataFrameReader。 这是将Spark用于大数据的正确方法,因为它允许近乎任意的缩放

    如果在Spark代码中使用Java或Scala文件IO,则可能发生以下两种情况之一:

  • 如果代码在驱动程序上执行,则必须使用SparkSession.parallelize对从已读取数据生成的集合并行化从文件中读取的数据。这对于某些测试很有用,但不能扩展到Spark在生产中有意义的大多数情况
  • 如果代码在执行器上执行(即在RDD.map闭包内),则该文件将在运行该代码的每个执行器上读取,并在每个执行器上全部可用。这通常是不可取的,除非您有非常具体的要求-它还要求文件在每个节点上都可用
  • 关于SparkSQL和查询表-查询在驱动程序上解释,并生成与查询对应的执行计划。然后,该执行计划用于将生成的阶段分发给那些包含处理阶段所需数据的执行者,并确保以这样的方式重新分发数据,以便可以执行以下阶段。由于SparkSQL通常不针对数据库运行,而是针对基于列或行的文件结构运行,因此每个执行器理想情况下只加载其本地的文件数据。如果数据不是本地的,则每个执行器都会尝试从外部数据存储加载多个分区,可能会使用一些向下推的过滤逻辑。在这种情况下,是的,每个工作人员都会查询“数据库”,但只查询部分数据,通常只读取记录