Sparkランドには、作業が異なるノードにファームアウトされ、同時に実行される方法を取り巻く、いくつかの類似したまだ異なる概念があります。具体的には次のとおりです。
sparkDriverCount
)numWorkerNodes
)で利用可能なワーカーノードの数numExecutors
)の数dataFrame
)dataFrame
(numDFRows
)の行数dataFrame
(numPartitions
)上のパーティションの数numCpuCoresPerWorker
)I 信じるすべてのSpark=クラスターにはone-and-only-one Spark Driverそれから0+ワーカーノードです。それについて間違っているなら、私を修正することから始めてください!私はそれについて多かれ少なかれ正しいと仮定して、ここでいくつかの変数をロックしましょう。Spark 1つのドライバーと4つのワーカーノード、および各ワーカーNodeには4つのCPUコアがあります(合計16のCPUコア)。
sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16
それをセットアップとして考えると、いくつかのことをどのように決定するのか疑問に思っています。具体的には:
numWorkerNodes
とnumExecutors
の関係は何ですか?労働者とエグゼキューターの比率は既知/一般に受け入れられていますか? numExecutors
(またはその他の入力)が与えられたnumWorkerNodes
を決定する方法はありますか?numDFRows
とnumPartitions
の既知の/一般に受け入れられている/最適な比率はありますか? dataFrame
のサイズに基づいてパーティションの「最適な」数をどのように計算しますか?numPartitions = numWorkerNodes * numCpuCoresPerWorker
、それに対する真実?つまり、CPUコアごとに1つのパーティションが必要であると規定されています。はい、 spark アプリケーションには 唯一無二のドライバー があります。
numWorkerNodes
とnumExecutors
の関係は何ですか?
ワーカーは複数のエグゼキューターをホストできます。ワーカーはクラスターのマシン/ノードであり、エグゼキューターはそのワーカーで実行されるプロセス(コアで実行)であると考えることができます。
したがって、「numWorkerNodes <= numExecutors」です。
彼らに食料はありますか?
個人的には、私のラップトップがドライバーであり、まったく同じラップトップの仮想マシンがワーカーであった偽のクラスターで働いていました。 and > 10000ノードの産業クラスターでは、 spark が面倒を見ているように見えるので、それを気にする必要はありませんでした。
私はただ使用します:
--num-executors 64
スクリプトを起動/送信し、 spark がわかると、召喚する必要があるワーカーの数がわかります(もちろん、他のパラメーターとマシンの性質も考慮に入れて)。
したがって、個人的に、私はそのような比率を知りません。
numDFRows
とnumPartitions
の既知の/一般に受け入れられている/最適な比率はありますか?
私はそれを認識していませんが、経験則として、#executor.coresによる#executorsの積に依存し、3または4を掛けることができます。もちろん、これは発見的。 pyspark では、次のようになります。
sc = SparkContext(appName = "smeeb-App")
total_cores = int(sc._conf.get('spark.executor.instances')) * int(sc._conf.get('spark.executor.cores'))
dataset = sc.textFile(input_path, total_cores * 3)
DataFrame
のサイズに基づいてパーティションの「最適な」数をどのように計算しますか?
それは素晴らしい質問です。もちろん、答えるのは難しく、データ、クラスターなどに依存しますが、 here で説明したように。
パーティションが少なすぎると、特に bigdata を処理しているときに膨大なデータのチャンクが発生するため、アプリケーションにメモリストレスがかかります。
パーティションが多すぎると、 hdfs から生成される必要があるすべてのメタデータがパーティションの数が増えるにつれて大幅に増加するため、 hdfs に大きなプレッシャーがかかります。一時ファイルなどを維持します)。 *
したがって、必要なのは、スイートスポットをパーティション数に対して見つけることです。これは、アプリケーションの微調整の一部の1つです。 :)
「経験則」は:
numPartitions = numWorkerNodes * numCpuCoresPerWorker
、本当ですか?
ああ、私はこれを見る前に上記の経験則を書いていました。したがって、これはすでに回答されていますが、 worker と executor の違いを考慮してください。
* 今日はこれに失敗しました: Pythonを介してSparkでビッグデータを準備 、使用するパーティションが多すぎる場合 アクティブなタスクはSpark UIで負の数です 。