在火花纱簇中,如何处理容器取决于RDD分区的数量?

时间:2015-03-13 08:55:36

标签: hadoop apache-spark yarn rdd

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

在这段代码中,虽然创建了10个分区 但是在纱线集群中,只需要工作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))

在火花纱簇中,如何处理容器取决于RDD分区的数量?

*因为我有一点点英语技能,我希望你能理解我笨拙的英语

1 个答案:

答案 0 :(得分:2)

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

当您在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错误