Kafkaトピックのパーティショニング-> sparkストリーミングリソースの使用率について、さらに明確にしたいユースケースがいくつかあります。
sparkスタンドアロンモードを使用しているので、設定しているのは「エグゼキュータの総数」と「エグゼキュータメモリ」だけです。私の知る限り、ドキュメントによると、Sparkストリーミングに並列処理を導入する方法は、パーティション化されたKafkaトピックを使用することです-> Sparkを使用すると、RDDはkafkaと同じ数のパーティションになります-kafka直接ストリーム統合。
したがって、トピックに1つのパーティションと1つのエグゼキューターコアがある場合、そのコアはKafkaから順番に読み取られます。
私が持っている場合はどうなりますか:
トピック内の2つのパーティションと1つのエグゼキュータコアのみ?そのコアは最初に1つのパーティションから読み取り、次に2番目のパーティションから読み取るので、トピックをパーティション化してもメリットはありませんか?
トピックの2つのパーティションと2つのコア?次に、1つのエグゼキュータコアが1つのパーティションから読み取り、2番目のコアが2番目のパーティションから読み取りますか?
1 kafkaパーティションと2つのエグゼキュータコア?
ありがとうございました。
基本的なルールは、スケーリングできるということです最大 Kafkaパーティションの数。パーティションの数よりも大きい_spark.executor.cores
_を設定すると、一部のスレッドはアイドル状態になります。パーティションの数より少ない場合、Sparkは、一方のパーティションからスレッドを読み取り、次にもう一方のパーティションからスレッドを読み取ります。
2つのパーティション、1つのエグゼキュータ:1つのパーティションから読み取り、次に他のパーティションから読み取ります。 (Sparkが、切り替える前にそれぞれから読み取る量を決定する方法がわかりません)
2p、2c:並列実行
1p、2c:1つのスレッドがアイドル状態です
ケース#1の場合、エグゼキュータよりも多くのパーティションを使用しても問題ありません。これにより、パーティションを再作成しなくても後でスケールアウトできるためです。秘訣は、パーティションがエグゼキュータの数で均等に分割できるようにすることです。 Sparkは、パイプラインの次のステップにデータを渡す前に、パーティションを処理する必要がありますallしたがって、「残りの」パーティションがある場合、処理が遅くなる可能性があります。たとえば、5つのパーティションと4つのスレッド=>処理には、2つのパーティション(一度に4つ)の時間がかかり、1つのスレッドが5番目のパーティションを単独で実行します。
また、reduceByKey()
などの関数でデータパーティションの数を明示的に設定することにより、パイプライン全体でパーティション/ RDDの数を同じに保つと、処理スループットが向上する可能性があることにも注意してください。