我对 apache Spark 很陌生,但我想我已经明白了这个概念。 但我不太明白apache Spark集群的哪个节点正在读取资源。
例如,当我从磁盘读取文件时。我在 stackoverflow 上找到了一些文档和答案,表明每个工作人员都会读取整个文件。
如果是这种情况,并且我想对多个工作人员进行某种行处理,则每个工作人员的内存中都会有不需要的行,因为另一个工作人员正在处理它们。
此外,当我使用 Spark sql 并查询一个大表时会发生什么。 每个worker都会查询数据库吗?或者是否有一个工作人员执行查询,然后数据库的答案被转移到其他工作人员上。
描述该行为的文档部分的答案或链接将非常有帮助
最佳答案
发生的情况取决于您读取文件的方式:
如果您使用 SparkSession 提供的工具来读取 DataFrame(请参阅 DataFrameReader 文档),则会创建一个执行图,它将尝试读取节点本地数据。 IE。每个 Spark 执行器将读取驻留在分布式存储的本地到此执行器部分的数据:例如本地 HDFS block 。这要求您拥有数据存储上的分区信息,并使用它来创建 DataFrameReader。 这是将 Spark 与大数据结合使用的正确方法,因为它允许近乎任意的缩放。
如果您在 Spark 代码中使用 Java 或 Scala File-IO,则可能会发生以下两种情况之一:
- 如果代码在驱动程序上执行,则必须在从已读取的数据生成的集合上使用 SparkSession.parallelize 并行化从文件中读取的数据。这对于某些测试很有用,但无法扩展到 Spark 在生产中有意义的大多数情况。
- 如果代码在执行器上执行(即在 RDD.map 闭包内),则该文件将在运行该代码的每个执行器上读取,并且在每个执行器上完整可用。这通常是不可取的,除非您有非常具体的要求 - 它还要求该文件在每个节点上都可用。
关于 SparkSQL 和查询表 - 在驱动程序上解释查询并生成与查询相对应的执行计划。然后,使用该执行计划将生成的阶段分发给包含处理该阶段所需数据的执行器,并确保以可以执行后续阶段的方式重新分发数据。由于 SparkSQL 通常不针对数据库运行,而是针对基于列或行的文件结构运行,因此每个执行器理想情况下仅加载其本地的文件数据。如果数据不是本地的,每个执行器都会尝试从外部数据存储加载多个分区,可能会使用一些过滤器逻辑的下推。在这种情况下,是的,每个工作人员都会查询“数据库”,但只查询部分数据,并且通常只读取记录。
关于java - apache Spark服务器的哪个节点从磁盘读取节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605237/