2016-06-22 2 views
2

カフカからネットワークを介してデータを読み取るスパークストリーミングアプリケーションがあります。クラスタとKafkaサーバは異なる地理にあることに注意することが重要です。カフカからのスパークストリーミングが遅れてバッチ全体が遅くなる

ジョブを完了するまでの平均時間は約8〜10分です(10分間隔で実行しています)。しかし、特定のバッチでは、ジョブの完了時間が芽を立てます。それが撃ち上げられる量は一般的にはランダムです(20分または50分または1時間になる可能性があります)。掘削すると、すべてのタスクが1つを除いてすべて完了することがわかりました。そのため、ターンアラウンドタイム全体が影響を受けます。例えば、ここでそのようなインスタンスからタスク時間ログである:この場合

Tasks

他は入力分割が同じであっても非常に迅速に終了したが、タスク6は、54分をとっています。私はこれをネットワークの問題(遅い/詰まったもの)とみなし、この作業を再開すると時間が大幅に節約できたとの意見があります。

sparkは、遅いタスクを別のノードで再起動して最初に完了したタスクの結果を使用できるように制御できますか?あるいは、私が気付いていないこの問題に対するよりよい解決策が存在するのでしょうか?

+0

アプリ内に複数のジョブがある場合、この設定を有効にすると役立ちます。spark.streaming.concurrentJobs – bistaumanga

+0

@bistaumanga複数のジョブを意味しますか?ストリーミングアプリケーションです。各反復ごとに2つのマップ削減を実行します。 – Sohaib

+0

私は同じアプリケーションで、イベントの数を数えたり、いくつかのグループで数えたり、いくつかのキーの平均を計算したりするなど、同じアプリケーションで複数のことをやっていることを意味します...複数のアクションを持つ – bistaumanga

答えて

1

私は間違いなく私が考える例えば、あなたの場合には、これらのパラメータはかなり適切であろう、spark.speculation.*設定パラメータを見ていると、もっとたくさん積極的にそれらを設定します:

  • spark.speculation = true
  • spark.speculation.interval = 1min(どのくらいの頻度でスパークが推測するには、タスクをチェックします。)
  • spark.speculation.multiplier = 1.1(中央値は、投機のために検討するよりも、タスクがある何回も遅い。)
  • spark.speculation.quantile = 0.5(投機は、特定のステージのために有効になる前に完了していなければならないタスクの割合。)

あなたが設定パラメータhereの完全なリストを見つけることができます。

+0

ありがとう、これは間違いなく面白そうに見えます。私はこれについて読んで、それが私のために働くならば戻ってきます! – Sohaib

関連する問題