Spark Streamingの一般的なビッグデータインタビューの質問

1. SparkStreamingはどのようにしてKafkaのデータを消費しますか、それらの違いは何ですか?

1.レシーバーに基づく

  • このメソッドは、Receiverを使用してデータを取得します。Receiverは、Kafkaの高レベルのコンシューマAPIを使用して実装されます。Kafkaからレシーバーによって取得されたデータは、spark executorのメモリに格納されます(データが突然増加した場合、大量のバッチが蓄積されます。メモリオーバーフローの問題が発生するのは簡単です)、その後、スパークストリーミングプロセスによってジョブが開始するデータ
  • ただし、デフォルトの構成では、このメソッドは、基になるレイヤーの障害が原因でデータを失う可能性があります。高可用性メカニズムを有効にし、データ損失をゼロにしたい場合は、スパークストリーミングの先読みログメカニズム(先読みログ、WAL)を有効にする必要がありますこのメカニズムは、受信したKafkaデータを分散ファイルシステム(hdfsなど)の先読みログに同期的に書き込みます。したがって、基盤となるノードに障害が発生した場合でも、先読みログのデータをリカバリに使用できます

2.直接ベースのアプローチ

  • Receiverに基づいていないこの直接的な方法は、spark1.3で導入され、より堅牢なメカニズムを確保しています。Receiverを使用してデータを受信する代わりに、このメソッドはKafkaに定期的にクエリを実行して各トピックを取得します+各バッチのオフセットの範囲を定義するパーティションの最新のオフセットジョブ処理データが開始すると、KafkaのシンプルなコンシューマーAPIを使用して、指定されたKafkaのオフセット範囲のデータを取得します

利点は次のとおりです。

  • 並列読み取りを簡素化する:複数のパーティションを読み取る場合、複数の入力DStreamを作成してから、それらに対してユニオン操作を実行する必要はありません。Sparkは、kafkaパーティションと同じ数のRDDパーティションを作成し、kafkaからデータを並列に読み取ります。したがって、 kafkaパーティションとRDDパーティションの間には1対1のマッピング関係があります
  • 高パフォーマンス:データ損失をゼロにしたい場合は、受信者ベースの方法でWALメカニズムをオンにする必要があります。この方法は、データが実際に2回コピーされ、Kafka自体に信頼性の高いメカニズムがあるため、実際には非効率的です。データがコピーされ、ここでWALにコピーされます。直接的な方法に基づくと、Receiverに依存せず、WALメカニズムを開く必要がありません。データがKafkaにコピーされている限り、Kafkaのコピーを通じて復元できます
  • 1回限りのトランザクションメカニズム

3. 2つの比較

  • レシーバーメソッドに基づいて、Kafkaの高レベルAPIを使用して消費キーパーで消費されたオフセットを保存します。これは、Kafkaデータを消費する従来の方法です。このメソッドは、WALメカニズムと組み合わせて、データ損失なしで高い信頼性を保証できますが、ただし、データが1回だけ処理される保証はなく、2回処理される可能性があります。sparkとzookeeperは同期されない場合があるため
  • 直接的な方法に基づいて、Kafkaの単純なAPIを使用して、SparkStreaming自体が消費オフセットを追跡し、それをcheckpoint.sparkに保存する必要があります。同期する必要があるため、データは1回だけ消費されます。
  • 在实际生产环境中大都用Direct方式

2. Sparkストリーミングウィンドウ関数の原理

  • ウィンドウ関数は、最初に定義されたSparkStreaming計算バッチサイズに基づいて再度カプセル化することです。データの複数のバッチが計算されるたびに、計算の完了後に次の計算タスクを設定するために、スライディングステップパラメーターを同時に渡す必要があります。一度にカウントを開始する場所
  • 図では、time1はSparkStreamingによって計算されたバッチサイズです。破線のボックスと大きな実線のボックスはウィンドウのサイズであり、バッチの整数倍でなければなりません。破線のボックスと大きな実線のボックスの間の距離(バッチがいくつ離れているか)は、スライドするステップサイズです。
    ここに画像の説明を挿入

Three。Sparkストリーミングのフォールトトレランスの原則

スパークストリーミングの特徴の1つは、高いフォールトトレランスです。

  • まず最初に、spark rddにはフォールトトレラントメカニズムがあります。各rddは不変の分散および再計算されたデータセットであり、入力データがフォールトトレラントである限り、すべてのrddパーティションエラーが発生するため、この確定的な操作の系統を記録しますまたは利用できない場合、すべて変換操作を通じて元の入力データを使用して再計算できます
  • 先行書き込みログは通常、データ操作の耐久性を確保するためにデータベースとファイルシステムで使用されます。通常、先行書き込みログは、操作を永続的で信頼性の高いログファイルに書き込み、その操作をデータに適用します。操作で例外が発生しました。ログファイルを読み取って操作を再適用できます
  • さらに、受信したデータの正当性は、データがログに事前に書き込まれた後にのみ受信者によって確認されます。キャッシュされているがまだ保存されていないデータは、ドライバーの再起動後にデータソースから再度送信できます。これら2つのメカニズムにより、データがゼロになることが保証されます。失われ、すべてのデータがログから復元されるか、データソースによって再送信されます

おすすめ

転載: blog.csdn.net/sun_0128/article/details/107974157