|
Apache Flinkは、ドイツのベルリン工科大学の博士課程および大学院生のグループによって開始されたプロジェクトで、当初はStratosphereと呼ばれていました。2014年、Stratosphereプロジェクトの中核メンバーは大学を離れ、Flinkの開発に専念し、Flinkの主要なコンピューティング分野をストリームコンピューティングに特化しました。同年、彼らはFlinkをApacheに寄贈し、Flinkは瞬く間にApacheのフラッグシッププロジェクトとなりました。 アリババは2015年にFlinkの実験を開始しました。しかし、アリババの事業規模は巨大で、多くの課題に直面していました。当時、Flinkの規模と安定性はまだ実証されておらず、成熟度にも疑問が残りました。これほど大規模な事業規模に対応するには、Flinkをベースに様々な改良を加える必要があり、アリババはBlinkと呼ばれるFlinkの社内バージョンを維持していました。 Blinkベースのコンピューティングプラットフォームは2016年に正式にリリースされました。現在、アリババのテクノロジー部門の大部分がBlinkを使用しています。Blinkは、アリババの複雑なビジネスシナリオに合わせて継続的に改良・開発されてきました。パフォーマンス、リソース利用率、使いやすさなど、社内ユーザーから提起された様々な問題に対処するため、的を絞った改善が行われてきました。 Blinkは現在、主にアリババ社内のストリームコンピューティングに使用されていますが、数多くのバッチコンピューティングアプリケーションにも導入されています。例えば、検索・推奨アルゴリズムプラットフォームでは、ストリームコンピューティングとバッチ処理の両方にBlinkを活用しています。Blinkは、ストリームとバッチを統合したサンプル生成と特徴抽出プロセスを実装するために使用されており、数千億の特徴を処理し、毎秒数億件のメッセージを処理できます。このバッチ処理シナリオでは、1つのジョブで400TBを超えるデータを処理しており、リソースを節約するために、バッチ処理ジョブはストリームコンピューティングジョブとオンライン検索エンジンと同じマシンで実行されています。ストリーム処理とバッチ処理の統合はアリババで大きな成功を収めており、この成功とアリババ社内で得られた経験をコミュニティと共有したいと考えています。 Blinkのオープンソースの背景Flinkを選んだ当初から、私たちはコミュニティと緊密に連携してきました。ここ数年、AlibabaによるFlinkの改善をコミュニティに継続的にフィードバックしてきました。2016年以降、ストリームコンピューティングのためのSQL機能の大部分に加え、ランタイムの安定性とパフォーマンスの最適化のための重要な設計をいくつかフィードバックしてきました。しかし、Blink自体は非常に速いペースで進化と反復を繰り返しているのに対し、コミュニティには独自のペースがあり、変更をタイムリーにフィードバックすることが困難な場合が多くあります。コミュニティにとって、主要な機能やリファクタリングは、オープンソースプロジェクトの品質をより確実にするために、承認前に合意を得る必要がありますが、このためフィードバック速度が比較的遅くなるという問題もあります。 数年にわたる開発と反復を経て、私たちとコミュニティの間の溝はかなり大きくなってきました。Blinkには、高性能バッチ処理機能など、コミュニティ版にはない優れた新機能がいくつかあります。この間、Blinkの様々な新機能に関する問い合わせが増え、Blinkをできるだけ早くオープンソース化してほしいという声がますます大きくなってきました。私たちは、オープンソース化の方法を検討してきました。一つのアプローチは、これまで通り、様々な機能や最適化を細分化し、コミュニティと一つ一つ議論しながら、徐々にFlinkにプッシュバックしていくことですが、これは明らかに誰もが望んでいることではありません。もう一つのアプローチは、まず可能な限り多くのコードをオープンソース化し、コミュニティ開発者ができるだけ早く試用できるようにすることです。この2つ目のアプローチは、コミュニティの多くのユーザーからすぐに支持を得ることができました。そのため、2018年半ばからオープンソース化の準備に着手しました。そして6ヶ月間の努力を経て、ついにBlinkのほとんどの機能を完成させ、オープンソース化しました。 Blinkのオープンソースアプローチコードを寄付することで、他の方々にも興味のある機能を試していただけるようにしています。Blinkは独立したオープンソースプロジェクトとして運営されることはありません。常にFlinkの一部です。オープンソース化後、できるだけ早くBlinkをFlinkに統合する方法を見つけたいと考えています。Blinkをオープンソース化する唯一の目的は、Flinkをより良くすることです。 Apache Flinkはコミュニティプロジェクトであり、BlinkをFlinkに統合する最適な方法と、コミュニティが推奨する貢献方法について、コミュニティと議論する必要があります。これまでFlinkコミュニティから幅広い意見を募り、オープンソースのBlinkコードをFlinkのブランチとしてApache Flinkプロジェクトに直接プッシュすることが最適なアプローチであることに全員が同意しました。さらに、BlinkをFlinkマスターに迅速に統合するための解決策についてもコミュニティと協議し、計画を進めています(詳細はFlinkコミュニティ内のFLIP32に関する議論をご覧ください)。 この統合は非常に短期間で完了する見込みです。これにより、機械学習などの新機能をFlinkマスターに直接プッシュできるようになります。FlinkとBlinkはまもなく完全に統合されると考えています。その後、Alibabaは本番環境でFlinkを直接使用し、同時にコミュニティによるFlinkのメンテナンスを支援します。 このオープンソースBlinkリリースの主な機能と最適化このオープンソースの Blink コードは、Flink バージョン 1.5.1 に基づいており、多数の新機能と、パフォーマンスと安定性に関するさまざまな最適化が含まれています。 主な貢献には、ストリーム コンピューティングで Alibaba が蓄積した新機能とパフォーマンスの最適化、高性能バッチ SQL の完全なセット (すべての TPC-H/TPC-DS を実行し、Hive のメタデータとデータを読み取ることができる)、使いやすさの向上に重点を置いたいくつかの機能 (より効率的なインタラクティブ プログラミングのサポート、Zeppelin とのより緊密な統合、より優れた Flink Web エクスペリエンスとパフォーマンスなど) が含まれます。 今後も、AI、IoT、その他の新興分野におけるFlinkの機能強化と最適化に継続的に貢献していきます。今回のBlinkリリースの詳細については、BlinkコードのルートディレクトリにあるREADME.mdファイルをご覧ください。以下では、Blinkの主な新機能と最適化についてモジュールごとにご紹介します。 ランタイムバッチ処理をより適切にサポートし、Alibaba の大規模な生産シナリオで発生するさまざまな課題に対処するために、Blink はランタイム アーキテクチャ、効率、安定性を大幅に改善しました。 アーキテクチャの面では、Blink はまず Pluggable Shuffle Architecture を導入します。これにより、開発者はさまざまなシャッフル戦略を実装して、さまざまなコンピューティング モデルや新しいハードウェアのニーズに適応できます。さらに、Blink は新しいスケジューリング アーキテクチャを導入し、開発者はコンピューティング モデルの特性に基づいてさまざまなスケジューラをカスタマイズできます。パフォーマンスを最適化するために、Blink ではオペレーターをより柔軟に連結して、不要なデータ転送のオーバーヘッドを回避できます。Pipeline Shuffle モードでは、ZeroCopy を使用してネットワーク層のメモリ消費を削減します。BroadCast Shuffle モードでは、Blink は大量の不要なシリアル化およびデシリアル化のオーバーヘッドを最適化して排除します。さらに、Blink はまったく新しい JM FailOver メカニズムを提供します。JM に障害が発生した場合、新しい JM がジョブを再開するのではなく、ジョブ全体を引き継ぐため、JM FailOver がジョブに与える影響が大幅に軽減されます。 さらに、BlinkはKubernetesのサポートも開発しました。Kubernetes上のスタンドアロンモードの起動方法とは異なり、Flink FLIP6アーキテクチャに基づくBlinkは、ジョブのリソース要件に応じてTaskExecutorを実行するPodを動的に割り当て/解放することで、リソースの弾力性を実現し、リソース利用率を向上させます。 SQL/テーブルAPISQL/TableAPI アーキテクチャのリファクタリングとパフォーマンスの最適化は、Blink のこのオープンソース バージョンの主な貢献です。 まず、SQLエンジンのアーキテクチャに大幅な調整を加えました。最適化レイヤー(クエリオプティマイザー)と演算子レイヤー(クエリエグゼキューター)を含む、全く新しいクエリプロセッサ(QP)を導入しました。これにより、これら2つのレイヤーにおけるストリーム処理とバッチ処理の設計作業の大部分を最大限に再利用できるようになります。さらに、SQLおよびテーブルAPIプログラムは、最終実行時にDataStream APIおよびDataSet APIに変換されるのではなく、実行可能なDAG上に直接構築されます。これにより、物理実行演算子の設計が基盤となるAPIへの依存度が低くなり、柔軟性が向上し、より柔軟なコード生成が可能になります。 唯一の影響は、このバージョンのSQLおよびTable APIはDataSet APIとの間で変換できないことですが、DataStream APIとの間で変換する機能は引き続き保持されます(DataStreamをテーブルとして登録したり、TableをDataStreamに変換してからさらに操作を実行したり)。今後、データセットの機能をDataStreamおよびTable APIに段階的に実装する予定です。その時点で、DataStreamはSQLおよびTable APIと同様に、境界付き処理と境界なし処理の両方を記述できるAPIになります。 アーキテクチャの再構築に加えて、Blink の実装においても大幅な再構築が行われました。 まず、Blink はバイナリ データ構造 BinaryRow を導入します。これにより、データ ストレージのオーバーヘッドと、データのシリアル化およびデシリアル化の計算オーバーヘッドが大幅に削減されます。 第二に、演算子実装レベルにおいて、BlinkはCodeGenテクノロジーをより広範囲に導入しました。演算子が処理する必要があるデータの種類が事前にわかっているため、より的確で効率的な実行コードをQPレイヤー内で直接生成できます。Blinkの演算子はリソースを動的に割り当てて使用することで、リソース利用率を向上させ、効率性を向上させます。さらに重要なのは、これらの演算子はリソースを適切に制御し、OutOfMemoryエラーを防止できることです。 さらに、ストリームコンピューティングのシナリオ向けに、Blink は miniBatch 実行モードを追加しました。集計や結合など、状態との頻繁なやり取りや部分的なリダクションが必要となるシナリオでは、miniBatch を使用することで I/O を大幅に削減でき、パフォーマンスを桁違いに向上させることができます。前述の重要なリファクタリングと機能に加えて、Blink は完全な SQL DDL、emit 戦略を備えたストリームコンピューティング DML、いくつかの重要な SQL 関数、そして数多くのパフォーマンス最適化戦略も実装しています。 前述のアーキテクチャと実装のリファクタリングにより、BlinkのSQL/テーブルAPIは機能とパフォーマンスの両面で完全な変革を遂げました。バッチ処理において、BlinkのバッチSQLはTPC-HとTPC-DSを完全に実行できるようになり、パフォーマンスが大幅に向上しました。 上のグラフは、オープンソース版のBlinkとSpark 2.3.1のTPC-DSのベンチマークパフォーマンス比較を示しています。バーの高さは合計実行時間を表し、低いほどパフォーマンスが優れていることを示しています。TPC -DSにおいてBlinkがSparkを大幅に上回るパフォーマンス優位性を持っていることは明らかで、この優位性はデータ量が増えるにつれてさらに高まります。実際のシナリオでは、この優位性はSparkの3倍以上であり、ストリーム処理パフォーマンスでも同様の向上を実現しています。当社の典型的なオンラインジョブの多くでは、パフォーマンスが3~5倍向上しています。データの偏りや、一部の難しいTPC-Hクエリが発生するシナリオでは、ストリーム処理パフォーマンスが数十倍も向上することさえあります。 TableAPIは、標準のリレーショナルSQL APIに加えて、機能面でSQLのスーパーセットです。そのため、SQLに追加されたすべての新機能について、TableAPIにも対応するAPIが追加されました。さらに、TableAPIにいくつかの新機能が導入されました。重要な機能の1つはキャッシュです。バッチコンピューティングのシナリオでは、ユーザーは必要に応じて中間結果をキャッシュできるため、不要な重複計算を回避でき、インタラクティブなプログラミングエクスペリエンスが大幅に向上します。今後、TableAPIにはさらに便利な機能が追加される予定です。多くの新機能がすでにコミュニティで議論され、受け入れられています。たとえば、行全体を操作するための演算子map/flatMap/aggregate/flatAggregate(Flink FLIP29)がTableAPIに追加されました。 ハイブの互換性オープンソース版は、メタデータ層とデータ層の両方でFlinkとHiveのシームレスな統合と接続を実現します。国内外を問わず、多くの企業がバッチ処理にHiveを使用しています。これらのユーザーは、このオープンソース版Blinkを使用することで、Flink SQLを使用してHiveデータを直接クエリできるため、HiveエンジンとFlinkエンジン間のシームレスな切り替えを真に実現できます。 メタデータ統合を可能にするため、Flinkカタログ実装をリファクタリングし、メモリベースのカタログであるFlinkInMemoryCatalogと、HiveメタストアをブリッジするHiveCatalogという2つの新しいカタログを追加しました。HiveCatalogを使用すると、FlinkジョブはHiveのメタデータを読み取ることができます。データ統合を容易にするために、HiveTableSourceを実装しました。これにより、FlinkジョブはHiveの通常テーブルとパーティションテーブルから直接データを読み取ることができます。そのため、このバージョンでは、ユーザーはFlink SQLを使用して既存のHiveメタデータとデータを読み取ってデータ処理を行うことができます。今後、Hive固有のクエリ、データ型、Hive UDFのサポートなど、FlinkとHiveの互換性をさらに強化していきます。 FlinkのZeppelinより優れた視覚化とインタラクティブなエクスペリエンスを提供するために、Zeppelin の Flink サポートを徹底的に改善しました。これらの変更の一部は Flink に反映され、一部は Zeppelin にも反映されています。これらの変更がすべて Flink および Zeppelin コミュニティにロールバックされる前に、この Zeppelin イメージ(詳細は Blink コードの docs/quickstart/zeppelin_quickstart.md を参照)を使用して、これらの機能をテストおよびご利用いただけます。 このZeppelinのテストバージョンは、Flinkの様々なランタイムモードをユーザーインターフェースにシームレスに統合・統合します。ユーザーは、テキストベースのSQLとテーブルAPIを使用して、Flinkの静的および動的テーブルを簡単にクエリできます。さらに、Flinkのストリーム処理の特性に対応するため、このバージョンのZeppelinは優れたセーブポイントのサポートも提供しており、ユーザーはインターフェース上でジョブを一時停止し、セーブポイントから再開することができます。 データ可視化に関しては、従来のデータ分析インターフェースに加え、ストリームコンピューティングフリッパーや時系列可視化などの機能を追加しました。ユーザーによる試用を容易にするため、このバージョンのZeppelinには3つのFlinkチュートリアル例が組み込まれています。1つはストリーミングETLの例、他の2つはそれぞれFlink BatchとFlink Streamの基本的な例です。 フリンクウェブFlink Web では、使いやすさとパフォーマンスの面で数多くの改善が行われ、リソースの使用、ジョブのチューニング、ログのクエリなどの分野で多数の新機能が追加され、ユーザーによる Flink ジョブの保守と操作が容易になりました。 リソース使用状況に関しては、クラスター、タスクマネージャー、ジョブという3つの新しいリソース情報レベルが追加され、リソース要求と使用状況が一目でわかるようになりました。ジョブのトポロジとデータフローはオペレーターレベルまで遡って追跡できます。VertexにはInQueueやOutQueueなどの複数のメトリクスが追加され、データのバックプレッシャー、フィルタリング、スキューの追跡が容易になりました。TaskManagerとJobManagerのログ機能が大幅に強化され、ジョブ、Vertex、サブタスクなど、複数のディメンションから対応するログにリンクできるようになりました。複数のログファイルアクセスポイントに加え、ページ分割表示、クエリ機能、ログのハイライト表示も提供されます。 さらに、最新のAngular 7.0を使用してFlink Webを全面的にリファクタリングした結果、ページパフォーマンスが2倍以上に向上しました。大規模なデータセットであっても、ページのフリーズや遅延は発生しなくなりました。また、ページ全体のインタラクションロジックを最適化し、関連情報のほとんどを1ページでクエリ・比較できるようにすることで、不要なページリダイレクトを大幅に削減しました。 今後の計画Blinkは完全なオープンソース化に向けた第一歩を踏み出しました。今後はコミュニティと協力し、Blinkの機能とパフォーマンスの最適化をできるだけ早くFlinkに統合していきます。 このオープンソース版は、Blinkの長年のストリームコンピューティングにおける経験を活かしつつ、バッチ処理にも大きな進歩をもたらします。今後もFlinkコミュニティに様々な機能を提供していきます。数ヶ月ごとに大きな技術的進歩が見られると期待しています。次のハイライトは機械学習のサポートとなるでしょう。 機械学習を効果的にサポートするには、エンジンの機能、性能、使いやすさの向上など、一連のタスクを完了する必要があります。これらの作業の大部分はすでに完了しており、多くの機能はアリババの社内サービスで既に利用可能です。技術革新や新機能に加えて、Flinkの使いやすさとそれを取り巻くエコシステムも重要です。この分野では、多言語サポート(Python、Goなど)、Flinkクラスタ管理、ノートブック、機械学習プラットフォームなど、いくつかのプロジェクトを立ち上げています。これらのプロジェクトの中には、Flink自体の一部となりコミュニティに貢献するものもあれば、そうでないものもあります。しかし、いずれもFlinkをベースにしており、Flinkエコシステムにとって貴重な追加要素となります。また、Flinkとは独立したプロジェクトのオープンソース化も真剣に検討しています。 つまり、Blinkはオープンソースリリースの初日から、Flinkコミュニティに完全に統合されています。私たちの誠実さと決意を、すべての開発者の皆様にご理解いただければ幸いです。今後、機能面とエコシステムの両面でFlinkコミュニティへの投資を強化し、運用にもリソースを投入することで、Flinkが中国国内および世界中で広く利用されるよう努めてまいります。より多くの皆様にご参加いただき、Apache Flinkオープンソースコミュニティをさらに発展させていただければ幸いです。 |