Apache Flink は、ストリーム処理とバッチ処理の両方で独自の機能を提供するオープンソースのデータ処理フレームワークで、高性能でスケーラブルなイベントドリブン型のアプリケーションとアーキテクチャを構築するための一般的なツールです。
業界唯一のフルマネージド型・クラウドネイティブの Apache Flink® + Kafka をサービスとして利用することで、高品質で再利用可能なデータストリームを簡単に構築し、Confluent を使用して完全なデータストリーミングと分析を実現できます。
Apache Flink は、無制限および制限付きデータストリーム上でのステートフル計算のためのフレームワークおよび分散処理エンジンです。Flink は、すべての一般的なクラスター環境で実行し、あらゆる規模でメモリ内速度で計算を実行するように設計されています。開発者は Java や SQL などの API を使って Flink 用のアプリケーションを構築し、これはフレームワークによって Flink クラスター上で実行されます。
Apache Spark や Kafka Streams のような他の一般的なデータ処理システムはデータストリーミングまたはバッチ処理に限定されていますが、Flink は両方をサポートしています。これにより、金融、電子商取引、電気通信などの業界の企業にとって、バッチ処理とストリーム処理の両方を1つの統合プラットフォームで実行できる多用途のツールとなっています。企業は、不正検出、パーソナライズされた推奨、株式市場分析、機械学習などの最新のアプリケーションに Apache Flink を使用できます。
Kafka Streams はアプリケーションの一部として実行されるライブラリですが、Flink は独立してデプロイされるスタンドアロンのストリーム処理エンジンです。Apache Flink は、何らかの方法でデプロイされた Flink クラスター内でアプリケーションを実行し、フォールトトレランス、1回限りの配信、高スループット、低レイテンシなど、分散ストリーム処理システムが直面する難しい問題の解決策を提供します。これらのソリューションには、チェックポイント、セーブポイント、状態管理、時間セマンティクスが含まれます。
Flink のアーキテクチャは、ストリーム処理とバッチ処理の両方に対応するように設計されています。無制限のデータストリームと制限付きデータセットを処理できるため、リアルタイムのデータ処理とデータ分析が可能になります。Flink は、複雑なイベント処理シナリオでもデータの整合性と一貫したスナップショットを保証します。
以下の図は、Flink コンポーネントと Flink ランタイムフローを示しています。プログラムコードまたは SQL クエリは演算子グラフにまとめられ、クライアントからジョブマネージャーに送信されます。ジョブマネージャーはジョブをオペレーターに分割し、オペレーターはタスクマネージャーを実行しているノード上でタスクとして実行されます。これらのタスクがストリーミングデータを処理し、Hadoop 分散ファイルシステム (HDFS) や Apache Kafka などのさまざまなデータソースとやり取りします。
堅牢なアーキテクチャと広範な機能セットを備えた Apache Flink は、人気の選択肢です。その機能には、高度な状態管理、セーブポイント、チェックポイント、イベント時間処理のセマンティクス、ステートフル処理のための1回のみの一貫性保証などがあります。
Flinkのステートフルストリーム処理により、ユーザーは連続データストリームに対する分散計算を定義できます。これにより、ウィンドウ結合、集計、パターンマッチングなどのイベントストリームに対する複雑なイベント処理分析が可能になります。
Flink は、制限付きストリームと無制限ストリームの両方を処理でき、バッチ処理とストリーム処理を同じ傘下に統合します。このため、両方のタイプのデータを処理する必要があるリアルタイムストリーミングアプリケーションなど、さまざまなデータ処理のニーズに対応できます。
Flink は、事実上あらゆる規模でステートフルアプリケーションを実行できるように設計されています。複数のマシンに分散された何千ものタスクに並列化されたデータを処理し、大規模なデータセットを効率的に扱えます。このため、レイテンシとスループットの損失を最小限に抑えながら、数千ノードまでスケールアップする必要があるアプリケーションに最適です。
Flink には、さまざまな抽象化レベルでストリームを処理するための階層化 API も備わっており、開発者は、一般的なストリーム処理のユースケースだけでなく、非常に特殊なストリーム処理のユースケースにも柔軟に対応できます。
Flink には、メッセージングおよびストリーミングシステム、データストア、検索エンジン、さらに Apache Kafka、OpenSearch、Elasticsearch、DynamoDB、HBase などのファイルシステム、JDBC クライアントを提供する任意のデータベース向けのコネクターがあります。
Flink は、高レベルのストリーミング SQL およびテーブル API、低レベルのデータストリーム API、細かい制御のための ProcessFunction API など、さまざまなプログラミングインターフェイスも提供します。こうした柔軟性により、開発者はそれぞれの問題に適切なツールを使用でき、無制限のストリームと制限付きデータセットの両方がサポートされます。
また、Java、Scala、Python、Kotlin などの他の JVM 言語を含む複数のプログラミング言語もサポートしているため、開発者の間で人気があります。
Flink は汎用データプロセッサとして構築されていますが、無制限のストリームをネイティブにサポートしているため、ストリームプロセッサとして人気を博しています。Flink と Kafka の目的は若干異なりますが、Flink の一般的なユースケースはKafka のユースケースと非常に似ています。通常、Kafka はイベントストリーミングを提供し、Flink はそのストリームからのデータを処理するために使用されます。Flink と Kafka は、一般的に次の目的で一緒に使用されます。
バッチ処理:Flink は境界のあるデータセットの処理に非常に優れており、データが有限でチャンクで処理される従来のバッチ処理タスクに適しています。
ストリーム処理:Flink はバインドされていないデータストリームを処理するように設計されています。これにより、リアルタイムの継続的なデータ処理が可能になり、リアルタイムの分析や監視を必要とするアプリケーションに最適です。
イベントドリブン型アプリケーション:イベントストリームを処理する Flink の機能は、詐欺や異常検知システム、クレジットカード取引システム、ビジネスプロセス監視などのイベントドリブン型アプリケーションを構築するための貴重なツールとなります。
ステートフルなアプリケーションの更新 (セーブポイント):Flink のステートフル処理とセーブポイントにより、ステートフルなアプリケーションの更新と維持が可能になり、障害発生時でも一貫性と継続性が確保されます。
ストリーミングアプリケーション:Flink は、単純なリアルタイムデータ処理から複雑なイベント処理やパターン検出まで、幅広いストリーミングアプリケーションをサポートしています。
データ分析 (バッチ、ストリーミング):Flinkはバッチとストリーミングの両方のデータを処理できるため、データ分析に適しています。これには、リアルタイムのデータ分析と履歴データの処理が含まれます。
Apache Flink のアーキテクチャは複雑で、習得が難しく、熟練した実践者にとっても理解、操作、デバッグが困難な場合があります。Flink の開発者やオペレーターは、カスタムウォーターマーク、シリアル化、型の進化などの複雑さに苦労することがよくあります。
Flink では、おそらく分散システムの大半よりも少しだけ、ハードウェアの選択やジョブの特性を考慮したパフォーマンスチューニングなど、デプロイメントやクラスター操作に関して困難を伴う傾向にあります。一般的な懸念事項には、バックプレッシャー、低速ジョブ、不当に大きな状態からのセーブポイントの復元など、パフォーマンスの問題の根本原因についての推論が含まれます。その他の一般的な問題には、チェックポイントの失敗の修正や、メモリ不足エラーなどのジョブの失敗のデバッグなどがあります。
Flink を使用する組織では、ストリーム処理ジョブの開発とストリーム処理フレームワークの運用維持に専念する専門家のチームが必要になる傾向があり、こうした理由から、従来、Flink は複雑で高度なストリーム処理のニーズを持つ大規模な組織にとってのみ経済的に導入可能でした。
Kafka Streams は、特に入力データと出力データが Kafka Cluster に保存されている場合にストリーム処理に使用される一般的なクライアントライブラリです。これは Kafka の一部であるため、Kafka の利点をネイティブに活用します。
ksqlDB は SQL のシンプルさを Kafka Streams に重ね合わせることでストリーム処理の優れた出発点を提供し、その対象者を広げます。
Kafka ユーザーと Confluent の顧客は、さまざまな理由から、ストリーム処理のニーズを満たすために Apache Flink を利用することがよくあります。例えば、複雑なストリーム処理においては、中間状態が大きくなりがちですが、ここに Kafka を使用するのは必ずしも有意義とならない場合があります。これは、中間状態が十分に大きくなると、それ自体として Kafka Cluster の運用に必要なリソースと計画に影響を及ぼすためです。また、異なる場所にある複数の Kafka Cluster からのストリーム、Kafka 内のストリームと Kafka 外のストリームなどを処理する必要がある場合もあります。
Flink は独自の分散システムであり、固有の複雑さと運用上の微妙な違いがあるため、特に Kafka Streams や Apache Spark などの他のストリーム処理技術が利用可能な場合、Apache Flink を使用する利点が随伴して発生する複雑さやコストを上回るかどうかは不明でした。
しかし、クラウドによってその前提は変わり、Apache Flink の完全な採用が可能となります。Apache Flink をフルマネージド型のサービスとして提供することで、Confluent Cloud が Kafka にもたらすメリットを Flink にも、もたらすことができます。インスタンスタイプやハードウェアプロファイルの選択、ノード設定、状態バックエンドの選択、スナップショットの管理、セーブポイントなど、Apache Flink を複雑で高コストなものとする運用の複雑さとニュアンスが自動的に処理されるため、開発者は Flink 固有のニュアンスではなく、アプリケーションロジックのみに集中できます。
これにより、Flink の機能が Confluent Cloud に導入されるだけでなく、ストリーム処理に Flink を使用する意味があるかどうかの経済性の計算前提も変わり、組織のストリーミング成熟度の早い段階で、より多くのユースケースに Flink を使用できるようになります。また、開発者は自分に合ったストリーム処理レイヤーを選択できるため、ニーズが変わったり複雑さが増したりしても、1つのプラットフォームを使い続けることができます。
Flink には成熟した堅牢な SQL インターフェイスが備わっているため、ストリーム処理を採用するエンドユーザーだけでなく、Apache Flink を採用する Confluent にとっても、ここから対応を始めるのが理にかなっています。
Introducing the second issue of the Confluent Chronicles comic book! Trust us, this isn’t your typical eBook. Inside you’ll find a fun and relatable approach to learn about the challenges of streaming processing, the basics of Apache Flink, and why Flink and Kafka are better together.