在 spark yarn 集群中,容器如何工作取决于 RDD 分区的数量?

In spark yarn cluster, How to work the container depends on the number of RDD partitions?

我有一个关于 Apache Spark(yarn 集群)的问题

虽然在这段代码中,创建了 10 个分区 但是在 yarn cluster 中,只需要 3 个 contatiner

val sc = new SparkContext(new SparkConf().setAppName("Spark Count"))

    val sparktest = sc.textFile("/spark_test/58GB.dat",10)
    val test = sparktest.flatMap(line=> line.split(" ")).map(word=>(word, 1))

在spark yarn集群中,容器如何工作取决于RDD分区的数量?

*因为我只有一点点英语,所以希望大家能理解我的拙劣英语

YARN 中的 Spark executor 运行 只是一个 JVM 进程,这个进程有时被称为 YARN Container。如果你说你使用了3个容器,那就意味着你在YARN集群节点上有3个JVM运行,基本上就是节点运行 YARN NodeManager.

当您在 YARN 集群上启动 Spark 时,您可以使用 --num-executors 指定您想要的执行器数量,并使用 --executor-memory

指定每个执行器的内存量

当您将文件读取到 RDD 并指定它应该有 10 个分区时,这意味着在您的代码执行期间,源文件将被读入 10 个分区。每个分区都是存储在单个JVM内存中的一块数据,存储它们的节点是根据源数据的位置选择的。

在您使用 textFile 并设置分区数量的特定情况下,该数量将被推送到 Hadoop TextInputFormat class 中,该 Hadoop 将根据文件分 10 次拆分读取文件大小(每个拆分大约为 5.8GB)

所以实际上,在将源文件读入 10 个分区后(我假设您将执行 cache() 并在其上执行 count() 之类的操作),您将拥有 10 个块数据,每个约为 5.8GB,作为集群上的 YARN 容器存储在 3 个 JVM 进程 运行 的堆中。如果您没有足够的 RAM,则只会缓存其中的一部分。如果您没有足够的 RAM 来处理 5.8GB 的​​单个分区,您将得到 out of memory 错误