我有一个关于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))
*因为我有一点点英语技能,我希望你能理解我笨拙的英语
答案 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
错误