web-dev-qa-db-ja.com

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

私が最初にすることは、大きなテキストファイルを読んで、それを数えることです。

val file = sc.textFile("/path/to/file.txt.gz")
println(file.count())

これを行うと、ノードの1つだけが実際にファイルを読み取ってカウントを実行していることがわかります(タスクが1つしかないため)。それは期待されていますか?後でRDDを再パーティション化する必要がありますか、またはmap reduce関数を使用するときに、Sparkは私のためにそれを行いますか?

13
Stephane

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を設定しても役に立たない理由は、 gzip圧縮されたファイルが分割可能ではないため 、Sparkは常に1つのタスクを使用してファイルを読み取ります。

通常のテキストファイル、またはbzip2のような分割可能な圧縮形式で圧縮されたファイルを読み取るときにminPartitionsを設定すると、Sparkは実際にその数のタスクをデプロイすることがわかります並行して(クラスターで使用可能なコアの数まで)ファイルを読み取ります。

20
Nick Chammas