問題:データを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はそれがデータの操作を並行して実行できるように多くのノードに分散することを決定します。データサイズが小さすぎると、プロセスがさらに遅くなる可能性があります。
デフォルトでは、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)
「入力」パーティションの数は、ファイルシステム構成によって固定されています。
ブロックサイズが128Mの1Goの1ファイルは、10個のタスクを提供します。変更できるかどうかわかりません。
再パーティションは非常に悪い場合があります。多くの入力パーティションがある場合、パーティション間のシャッフル(データトラフィック)が多くなります。
魔法の方法はありません。試してみて、webUIを使用して、生成されたタスクの数を確認する必要があります。