web-dev-qa-db-ja.com

Spark=ワーカー、コア、およびDataFrameサイズに基づいたパーティションの最適数の決定

Sparkランドには、作業が異なるノードにファームアウトされ、同時に実行される方法を取り巻く、いくつかの類似したまだ異なる概念があります。具体的には次のとおりです。

  • Spark Driverノード(sparkDriverCount
  • Sparkクラスター(numWorkerNodes)で利用可能なワーカーノードの数
  • Spark= executor(numExecutors)の数
  • すべてのワーカー/エグゼキューターが同時に操作しているDataFrame(dataFrame
  • dataFramenumDFRows)の行数
  • dataFramenumPartitions)上のパーティションの数
  • 最後に、各ワーカーノードで使用可能なCPUコアの数(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

それをセットアップとして考えると、いくつかのことをどのように決定するのか疑問に思っています。具体的には:

  • numWorkerNodesnumExecutorsの関係は何ですか?労働者とエグゼキューターの比率は既知/一般に受け入れられていますか? numExecutors(またはその他の入力)が与えられたnumWorkerNodesを決定する方法はありますか?
  • numDFRowsnumPartitionsの既知の/一般に受け入れられている/最適な比率はありますか? dataFrameのサイズに基づいてパーティションの「最適な」数をどのように計算しますか?
  • 他のエンジニアから、一般的な「経験則」は次のとおりだと聞いたことがあります:numPartitions = numWorkerNodes * numCpuCoresPerWorker、それに対する真実?つまり、CPUコアごとに1つのパーティションが必要であると規定されています。
19
smeeb

はい、 spark アプリケーションには 唯一無二のドライバー があります。

numWorkerNodesnumExecutorsの関係は何ですか?

ワーカーは複数のエグゼキューターをホストできます。ワーカーはクラスターのマシン/ノードであり、エグゼキューターはそのワーカーで実行されるプロセス(コアで実行)であると考えることができます。

したがって、「numWorkerNodes <= numExecutors」です。

彼らに食料はありますか?

個人的には、私のラップトップがドライバーであり、まったく同じラップトップの仮想マシンがワーカーであった偽のクラスターで働いていました。 and > 10000ノードの産業クラスターでは、 spark が面倒を見ているように見えるので、それを気にする必要はありませんでした。

私はただ使用します:

--num-executors 64

スクリプトを起動/送信し、 spark がわかると、召喚する必要があるワーカーの数がわかります(もちろん、他のパラメーターとマシンの性質も考慮に入れて)。

したがって、個人的に、私はそのような比率を知りません。


numDFRowsnumPartitionsの既知の/一般に受け入れられている/最適な比率はありますか?

私はそれを認識していませんが、経験則として、#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で負の数です

20
gsamaras