DStreamsとDataFrames:Spark Streamingの2つのフレーバー

この投稿は、ActivisionのソフトウェアアーキテクトであるYaroslav Tkachenkoによって書かれたゲス

Apache Sparkは、最も人気があり、強力な大規模なデータ処理フレームワークの一つです。 これは、バッチワークロード用のHadoopのMapReduceフレームワークの代替として作成されましたが、現在ではSQL、機械学習、およびストリーム処理もサポートしています。 今日はSpark Streamingに焦点を当て、ストリーム処理に利用可能ないくつかのオプションを示したいと思います。

ストリームデータ処理は、動的データが連続的に生成されるときに使用され、ビッグデータのユースケースでよく見られます。 ほとんどの場合、データはほぼリアルタイムで一度に1つのレコードで処理され、データから得られたインサイトは、アラートの提供、ダッシュボードのレンダリング、およびデータ内の新しい傾向に迅速に対応できる機械学習モデルのフィードにも使用されます。

DStreams vs.DataFrames

Spark StreamingはSpark0.7.0でアルファになりました。 これは、離散化されたストリームまたはDストリームのアイデアに基づいています。 各DStreamは一連のRddとして表されるため、低レベルのRDDでバックアップされたバッチワークロードから来ている場合は簡単に使用できます。 DStreamsはその期間にわたって多くの改善を受けましたが、主に非常に低レベルのAPIであるため、さまざまな課題が残っていました。

これらの課題に対する解決策として、Spark Structured StreamingはSpark SQLの上に構築された拡張機能としてSpark2.0で導入されました(そして2.2で安定化されました)。 そのため、Spark SQLコードとメモリの最適化を利用しています。 構造化ストリーミングは、Dataset/DataFrame ApiやSQLのような非常に強力な抽象化も提供します。 RDDを直接扱うことはもうありません!

構造化ストリーミングとDストリームを使用したストリーミングの両方がマイクロバッチングを使用します。 最大の違いは、レイテンシーとメッセージ配信の保証です。構造化ストリーミングは100ミリ秒以上のレイテンシーで正確に一度の配信を提供しますが、DStreamsを使用したストリーミングアプローチは少なくとも一度の配信しか保証しませんが、ミリ秒のレイテンシーを提供することができます。

私は個人的に単純なユースケースのためにSpark Structured Streamingを好みますが、DStreamsを使用したSpark Streamingは、その柔軟性のために、より複雑なトポロジには本当に適しています。 そのため、以下では、Apache Kafkaからデータを消費して処理するために、DStreamsでStreamingを使用し、DataFramesでStreaming(通常はSpark Structured Streamingで使用されます)を使用する方法を示します。 私はScala、Apache Spark2.3、およびApache Kafka2.0を使用します。

また、例のために、Quboleが提供するApache Zeppelinノートブックを使用してジョブを実行します。 Quboleは私が毎日使用するデータプラットフォームです。 HadoopとSparkクラスターを管理し、アドホックなHiveとPrestoクエリを簡単に実行できるようにし、私が喜んで使用する管理されたZeppelinノートブックも提供します。 Quboleでは、SparkとZeppelinの設定とチューニングについてあまり考える必要はありません。

私が持っている実際のユースケースは非常に簡単です:

  • ある種のテレメトリはカフカに書かれています: メタデータと任意のキー/値のペアを持つ小さなJSONメッセージ
  • Kafkaに接続し、それらのメッセージを消費し、逆シリアル化したい
  • 必要に応じて変換を適用したい
  • いくつかの集計を収集する
  • 最後に、私は異常と一般的に悪いデータに興味があります—私はプロデューサーを制御していないので、Null、空の文字列、おそらく間違った日付や特定の形式の他の値のようなものをキャッチしたいです、等。
  • ジョブはしばらく実行され、自動的に終了する必要があります。 通常、Spark Streamingジョブは継続的に実行されますが、分析/デバッグのためにアドホックに実行すると便利な場合があります(または、私の場合は例として、ノート

DStreamsを使用したストリーミング

このアプローチでは、単にRDDsのコレクションであるDStreamsを使用します。

DataFramesを使用したストリーミング

今、私たちは両方の世界の最高を得るためにDataFrames APIとストリーミングを組み合わせることを試みることができます!

結論

どちらのアプローチが良いですか? DStreamは単なるRddのコレクションであるため、通常は低レベルの変換と処理に使用されます。 その上にDataFrames APIを追加すると、SQLのような非常に強力な抽象化が提供されますが、もう少し設定が必要です。 また、単純なユースケースがある場合は、Spark Structured Streamingが一般的にはより良い解決策になるかもしれません!

コメントを残す

メールアドレスが公開されることはありません。

Previous post 10インチ対12インチマイターソー:常に大きい方が良いですか?
Next post West WindsorのHarrison Streetの米国ルート1Northでの致命的な自動車衝突