Spark:阅读文本文件后的重新分区策略

时间:2015-01-24 15:37:18

标签: scala apache-spark partition

我以这种方式启动了我的群集:

/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会为我做吗?

1 个答案:

答案 0 :(得分:20)

看起来你正在处理一个gzip压缩文件。

引自my answer here

  

我认为你使用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将实际并行部署该数量的任务(最多为数字)您的群集中可用的核心数)来读取文件。