2016-04-17 9 views
10

私はspark.task.cpusパラメータをよく理解していません。実行者の中では、「タスク」は「スレッド」または「プロセス」に対応しています。 "spark.task.cpus"を2に設定したとします。SparkのタスクごとのCPU数

  1. スレッドは2つのCPUを同時にどのように利用できますか?ロックを必要とせず、同期の問題を引き起こすことはできませんでしたか?

  2. 私はlaunchTask()のdeploy/executor/Executor.scalaの機能を見ていますが、ここでは「タスクごとのCPUの数」という概念はありません。 Sparkは最終的にスタンドアロンモードのタスクに複数のCPUを割り当てますか?あなたには、いくつかの特定のタスクが独自の内部(カスタム)並列性を有することが知られている場合には、クラスタ内の私の知識spark.task.cpusの最高に

答えて

10

は、タスクの並列処理を制御します。より詳細には

は、我々はspark.cores.maxがどのように多くのスレッド(別名コア)、アプリケーションのニーズを定義することを知っています。 spark.task.cpus = 1を終了すると、#spark.cores.max個の同時スパークタスクが同時に実行されます。

あなたは、あなたのタスクは、それに応じspark.task.cpusを設定することで(多分あなたのタスクのそれぞれが2つのスレッドを生成、などの外部ツールとの相互作用)並列化そのものであることを知っているならば、あなたが良い「市民」になるspark.task.cpusを変更するだけでしょう。今あなたがspark.cores.max = 10とspark.task.cpus = 2を持っているなら、Sparkは10/2 = 5の並行タスクしか作成しません。あなたのタスクに内部的に2つのスレッドが必要であるとすれば、実行スレッドの総数は決して10を超えません。これは、あなたが最初の契約(spark.cores.maxで定義)を上回ることは決してありません。

+4

実行時には実際には実行されませんが(ハード制限より多くのリソース利用のヒント) – zero323

+0

タスクを内部的に並列化できる方法を示す例はありますか? @ zero323、CPUS_PER_TASKは非常に高いレベルのスケジューリング用のもので使用され、実行プログラムに渡されることはありません。だから、私の質問は、 "タスクがspark.task.cpusコアを取得したことを確認するにはどうすればよいのですか?" – smz

+1

最も簡単な方法です(それほど有用ではありません): 'rdd.mapPartitions(_。toVector.par.map(foo))'。あなたの2番目の質問に答えるために、私たちは単純に答えません。これは、4つのexecutorコアを宣言し、 'spark.task.cpus'が2の場合、2つのタスクしか開始できないということだけです。しかし、物理的なコア割り当てや同様のものがあります。 Sparkの 'core'は単なるスレッドです。 – zero323

関連する問題