2016-12-18 9 views
3

スパークストリーミングの基本的なことを理解したい。私は50個のカフカトピックパーティションと5人のエグゼキュータを持っています。私はDirectAPIを使用しています。のRDDパーティションは50になります。このパーティションは5人のエグゼキュータでどのように処理されるのですか?各エグゼキュータで一度にプロセス1のパーティションを起動するか、エグゼキュータに十分なメモリとコアがあれば、各エグゼキュータで並列に複数のパーティションを処理します。スパークRDDパーティションが処理される方法。エグゼクティブの<いいえ> RDDパーティション

答えて

6

各エグゼキュータに時の処理1パーティションを刺激するか、または executorが十分なメモリとコアを有する場合には、各エグゼキュータに平行に1つの以上 パーティションを処理します。

Sparkは、実行中のジョブで使用可能なコアの総量に応じて各パーティションを処理します。

ストリーミングジョブには、コアが2つのエグゼキュータが10人あるとします。これは、spark.task.cpusが1に設定されていると仮定すると、10 x 2 = 20のパーティションを同時に処理できることを意味します。

実際に詳細を知りたい場合は、CoarseGrainedSchedulerBackendのSpark Standaloneリクエストリソースを見てください。 makeOffers

private def makeOffers() { 
    // Filter out executors under killing 
    val activeExecutors = executorDataMap.filterKeys(executorIsAlive) 
    val workOffers = activeExecutors.map { case (id, executorData) => 
    new WorkerOffer(id, executorData.executorHost, executorData.freeCores) 
    }.toIndexedSeq 
    launchTasks(scheduler.resourceOffers(workOffers)) 
} 

ここでキーシステムにおけるこのような各エグゼキュータが利用されているどのくらいのコアに指示ExecutorDataにエグゼキュータIDからのマッピングを保持し、そのパーティションの好ましい局所に従ってexecutorDataMap、ありますこのタスクを実行する実行者を推測します。ここで

はカフカから消費するアプリをストリーミングライブスパークからの例です:

私たちは、各エグゼキュータはプロセスへのストリーミングを可能にする2つの以上のコアを持って実行している3つのエグゼキュータと5つのパーティションを、持っています各パーティションは同時に実行されます。

+0

「spark.task.cpus」が1に設定されている場合、各パーティションは1つのコア(1つのスレッド)で処理されることを意味します。したがって、私の場合は5つのエグゼキュータ'--executor-cores 10 'を設定すると、すべてのパーティションが同時に処理されます。 – nilesh1212

+0

@ nilesh1212タスクの量は、あなたの 'DirectKafkaInputDStream'のパーティション数に依存しますが、基本的に各タスクは、基礎となるDStreamのRDDの各パーティションに対して要求されます(http:// stackoverflow.com/q/37528047/1870803))。 Kafkaからデータを読み込み、各パーティションがどこで処理されているかを調べる最初の変換に進むことで、これを自分で確認することができます。 –

+0

もし私が間違っていないならば、タスクはパーティションレベルでrdd権限で実行される変換/アクション以外何もありませんか? – nilesh1212

関連する問題