web-dev-qa-db-ja.com

データをSparkにインポートするときにパーティション/ノードの数を設定する方法

問題:データをSparkに使用してS3からEMRをインポートしたい:

_data = sqlContext.read.json("s3n://.....")
_

Sparkがloadおよびprocessに使用するノードの数を設定する方法はありますか?これはどのように例ですか?データを処理します:

_data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")
_

コンテキスト:データは大きすぎず、Sparkにロードしてクエリを実行するのに時間がかかります。Spark =データをあまりにも多くのノードに分割します。手動で設定できるようにしたいです。RDDと_sc.parallelize_を扱うとき、入力としてパーティションの数を渡すことができることを知っています。また、repartition()が、問題を解決できるかどうかはわかりませんが、変数dataは私の例ではDataFrameです。

パーティションをより正確に定義します。定義1:一般的に「パーティションキー」と呼ばれ、列を選択してインデックスを作成し、クエリを高速化します(これは私が望むものではありません)。定義2:(これが私の関心事である)あなたがデータセットを持っていると仮定すると、Sparkはそれがデータの操作を並行して実行できるように多くのノードに分散することを決定します。データサイズが小さすぎると、プロセスがさらに遅くなる可能性があります。

14
pemfir

デフォルトでは、200セットに分割されます。変更するには、SQLコンテキストsqlContext.sql("set spark.sql.shuffle.partitions=10");でsetコマンドを使用します。ただし、データの特性に基づいて、注意して設定する必要があります。

パーティションを設定するために、データフレームでrepartition()を呼び出すことができます。 Hiveコンテキストを作成した後、またはspark-submit jarに渡すことで、このプロパティをspark.sql.shuffle.partitionsに設定することもできます。

spark-submit .... --conf spark.sql.shuffle.partitions=100

または

dataframe.repartition(100)
6

「入力」パーティションの数は、ファイルシステム構成によって固定されています。

ブロックサイズが128Mの1Goの1ファイルは、10個のタスクを提供します。変更できるかどうかわかりません。

再パーティションは非常に悪い場合があります。多くの入力パーティションがある場合、パーティション間のシャッフル(データトラフィック)が多くなります。

魔法の方法はありません。試してみて、webUIを使用して、生成されたタスクの数を確認する必要があります。

1
Thomas Decaux