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

Spark: Repartition strategy after reading text file

我是这样启动集群的:

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

您似乎正在使用 gzip 文件。

引用自my answer here

I think you've hit a fairly typical problem with gzipped files in that they cannot be loaded in parallel. More specifically, a single gzipped file cannot be loaded in parallel by multiple tasks, so Spark will load it with 1 task and thus give you an RDD with 1 partition.

您需要在加载 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个任务来读取文件。

如果您在读取常规文本文件或使用 bzip2 等可拆分压缩格式压缩的文件时设置 minPartitions,您会看到 Spark 实际上会并行部署该数量的任务(最多集群中可用的内核数)来读取文件。