我对Apache Spark( yarn 集群)有一个问题

虽然在此代码中,创建了10个分区
但在 yarn 簇中,只需使用contatiner 3

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 纱簇中,容器的工作方式取决于RDD分区的数量?

*因为我的英语水平有点高,所以希望您能理解我的英语尴尬

最佳答案

在YARN中运行的Spark执行程序只是一个JVM进程,有时将此进程称为YARN容器。如果说使用3个容器,则意味着在YARN群集节点(基本上是运行YARN NodeManager的节点)上运行3个JVM。

在YARN群集上启动Spark时,您可以使用--num-executors指定想要的执行程序数,并使用--executor-memory指定每个执行程序的专用内存量。

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

在您使用textFile和设置分区数的特定情况下,此数字将下推到Hadoop TextInputFormat类,该类将实现根据文件大小按10个拆分读取文件(每个拆分约为5.8GB)

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

关于hadoop - 在 Spark 纱簇中,容器的工作方式取决于RDD分区的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29028206/

10-16 20:31