我以这种方式启动了我的群集:
/usr/lib/spark/bin/spark-submit --class MyClass --master yarn-cluster--num-executors 3 --driver-memory 10g --executor-memory 10g --executor-cores 4 /path/to/jar.jar
我要做的第一件事就是阅读一个大文本文件,并将其计算在内:
val file = sc.textFile("/path/to/file.txt.gz")
println(file.count())
执行此操作时,我发现只有一个节点正在读取文件并执行计数(因为我只看到一个任务)。这是预期的吗?我之后应该重新分配我的RDD,或者当我使用map reduce函数时,Spark会为我做吗?
答案 0 :(得分:20)
看起来你正在处理一个gzip压缩文件。
我认为你使用gzip压缩文件遇到了一个相当典型的问题,因为它们无法并行加载。更具体地说,单个gzip压缩文件无法通过多个任务并行加载,因此Spark将使用1个任务加载它,从而为您提供带有1个分区的RDD。
您需要在加载RDD后对其进行显式重新分区,以便可以在其上并行运行更多任务。
例如:
val file = sc.textFile("/path/to/file.txt.gz").repartition(sc.defaultParallelism * 3)
println(file.count())
关于您的问题的评论,原因设置minPartitions
在这里没有帮助,因为a gzipped file is not splittable,因此Spark将始终使用1个任务来读取文件。
如果在阅读常规文本文件时设置minPartitions
,或者使用像bzip2这样的可拆分压缩格式压缩的文件,您将看到Spark将实际并行部署该数量的任务(最多为数字)您的群集中可用的核心数)来读取文件。