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

Ste*_*ane 13 scala partition apache-spark

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

/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
Run Code Online (Sandbox Code Playgroud)

我做的第一件事是阅读一个大文本文件,并计算它:

val file = sc.textFile("/path/to/file.txt.gz")
println(file.count())
Run Code Online (Sandbox Code Playgroud)

执行此操作时,我看到只有一个节点实际上正在读取文件并执行计数(因为我只看到一个任务).这是预期的吗?我之后应该重新分配我的RDD,或者当我使用map reduce函数时,Spark会为我做吗?

Nic*_*mas 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())
Run Code Online (Sandbox Code Playgroud)

关于你的问题的评论,原因设置minPartitions在这里没有帮助是因为gzip文件不可拆分,所以Spark将始终使用1个任务来读取文件.

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