|
はじめに: 昨年 12 月の Flink Forward China Summit で約束したとおり、Alibaba の社内 Flink バージョンである Blink は、2019 年 1 月末に正式にオープンソース化されます。本日、ついにその瞬間を迎えました。
Blinkの紹介Apache Flinkは、ドイツのベルリン工科大学でStratosphereという名称で始まったプロジェクトです。2014年、Stratosphereプロジェクトのコアメンバーが大学を離れ、Flinkの開発に着手し、その主要なコンピューティング分野をストリーム処理に絞り込みました。同年、彼らはFlinkをApache Software Foundationに寄贈し、Flinkは瞬く間にApacheのトップレベルプロジェクトへと成長しました。現在、Flinkは業界最高峰のビッグデータ・ストリーム処理エンジンとして広く認知されています。 アリババは2015年にFlinkの実験を開始しました。しかし、アリババの事業規模は巨大で、多くの課題に直面していました。当時、Flinkの規模と安定性はまだ実証されておらず、成熟度にも疑問が残りました。これほど大規模な事業規模に対応するには、Flinkをベースに様々な改良を加える必要があり、アリババはBlinkと呼ばれるFlinkの社内バージョンを維持していました。 Blinkベースのコンピューティングプラットフォームは、2016年に正式にリリースされました。現在までに、アリババの技術部門の大部分がBlinkを使用しています。Blinkは、アリババの複雑なビジネスシナリオの中で継続的に改良されてきました。パフォーマンス、リソース利用率、使いやすさに関して、社内ユーザーから提起されたさまざまな問題に対処するため、的を絞った改良が行われてきました。Blinkは現在、アリババ社内でストリームコンピューティングで最も広く使用されていますが、多数のバッチコンピューティングアプリケーションにも導入されています。たとえば、検索および推奨アルゴリズムプラットフォームでは、Blinkはストリームコンピューティングとバッチ処理の同時実行に使用されています。Blinkは、サンプル生成と特徴抽出のための統合ストリームおよびバッチ処理の実装に使用されており、数千億の特徴を処理し、毎秒数億のメッセージを処理できます。このバッチ処理シナリオでは、1つのジョブで400TBを超えるデータを処理し、リソースを節約するために、バッチ処理ジョブはストリームコンピューティングジョブおよびオンライン検索エンジンと同じマシンで実行されます。このように、ストリームとバッチ処理の統合は Alibaba で大きな成功を収めており、この成功と Alibaba の社内経験をコミュニティと共有できることを願っています。 Blinkのオープンソースの背景Flinkを選んだ最初の日から、私たちはコミュニティと緊密に協力してきました。過去数年間、AlibabaのFlinkへの改善を一貫してコミュニティにプッシュバックしてきました。2016年以降、ストリームコンピューティングのSQL機能のほとんどと、ランタイムの安定性とパフォーマンスのためのいくつかの重要な設計改善をプッシュバックしてきました。しかし、Blink自体は非常に速いイテレーションを行っているのに対し、コミュニティには独自のペースがあり、変更をタイムリーにプッシュバックできないことがよくあります。コミュニティにとって、主要な機能やリファクタリングは、オープンソースプロジェクトの品質をより確実にするために、受け入れ前にコンセンサスを得る必要がありますが、これはまた、プッシュ速度が比較的遅くなることにもつながります。数年にわたる開発とイテレーションを経て、私たちとコミュニティの間のギャップはかなり大きくなってきました。 Blink には、高性能バッチ処理機能など、コミュニティ版にはない優れた新機能がいくつかあります。この間、Blink のさまざまな新機能について数多くの問い合わせがあり、Blink をできるだけ早くオープンソース化してほしいという要望が強くなってきています。私たちは、オープンソース化の方法を検討してきました。1 つのアプローチは、これまでと同様に、さまざまな機能と最適化を分解し、コミュニティで 1 つ 1 つ議論しながら、徐々に Flink にプッシュバックしていくことです。しかし、これは明らかに誰もが望んでいることではありません。もう 1 つのアプローチは、可能な限り多くのコードをオープンソース化し、コミュニティ開発者ができるだけ早く試用できるようにすることです。この 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をベースに、多数の新機能とさまざまなパフォーマンスおよび安定性の最適化が組み込まれています。主な貢献としては、アリババがストリームコンピューティングで蓄積してきた新機能とパフォーマンスの最適化、完全な高性能バッチSQL実装(すべてのTPC-H/TPC-DSコードの実行とHiveメタデータおよびデータの読み取りが可能)、そして主にユーザビリティの向上に重点を置いた機能(より効率的なインタラクティブプログラミングのサポート、Zeppelinとの緊密な統合、FlinkのWebエクスペリエンスとパフォーマンスの向上など)などがあります。私たちは、AI、IoT、その他の新興分野でFlinkの機能と最適化を継続的に提供していきます。このバージョンのBlinkの詳細については、BlinkコードベースのルートディレクトリにあるREADME.mdファイルを参照してください。以下では、Blinkの主な新機能と最適化をモジュールごとに紹介します。 ランタイムバッチ処理をより適切にサポートし、アリババの大規模生産シナリオで発生するさまざまな課題に対処するため、Blink はランタイムのアーキテクチャ、効率、安定性を大幅に改善しました。アーキテクチャ的には、Blink はまずプラグ可能なシャッフル アーキテクチャを導入しました。これにより、開発者はさまざまなシャッフル戦略を実装して、さまざまな計算モデルや新しいハードウェア要件に適応できるようになりました。さらに、Blink は新しいスケジューリング アーキテクチャを導入し、開発者は計算モデルの特性に基づいてさまざまなスケジューラをカスタマイズできるようになりました。パフォーマンスを最適化するために、Blink では演算子をより柔軟に連結して、不要なデータ転送のオーバーヘッドを回避できます。パイプライン シャッフル モードでは、ZeroCopy を使用してネットワーク層のメモリ消費を削減します。ブロードキャスト シャッフル モードでは、Blink は大量の不要なシリアル化およびデシリアル化のオーバーヘッドを最適化して排除します。 さらに、Blink は全く新しい JM フェイルオーバー メカニズムを提供します。JM に障害が発生した場合、新しい JM がタスク全体を引き継ぎ、JM フェイルオーバーがタスクに与える影響を大幅に軽減します。最後に、Blink は Kubernetes のサポートも開発しました。Kubernetes のスタンドアロン モードの起動方法とは異なり、Flink FLIP6 アーキテクチャに基づく Blink は、タスクのリソース要件に応じて TaskExecutor を実行する Pod を動的に割り当て/解放することで、リソースの弾力性を実現し、リソース使用率を向上させます。 SQL/テーブルAPIBlinkの今回のオープンソースリリースにおける主要な貢献は、SQL/Table APIアーキテクチャのリファクタリングとパフォーマンス最適化です。まず、SQLエンジンアーキテクチャに大幅な調整を加え、最適化レイヤー(クエリオプティマイザー)と演算子レイヤー(クエリエグゼキューター)を含む全く新しいクエリプロセッサ(QP)を導入しました。これにより、これら2つのレイヤーにおけるストリーム処理とバッチ処理の設計作業の大部分を最大限に再利用できるようになります。 さらに、SQLおよびTableAPIプログラムは、最終実行時にDataStreamおよびDataSet APIに変換されません。代わりに、実行可能なDAG上に直接構築されます。これにより、基盤となるAPIに完全に依存しないため、物理実行演算子の設計における柔軟性が向上します。実行コードも柔軟にコード生成できます。唯一の影響は、このバージョンのSQLおよびTableAPIはDataSet APIとの間で相互に変換できないことですが、DataStream APIとの間で変換する機能は保持されます(DataStreamをテーブルとして登録したり、TableをDataStreamに変換してからさらに操作する)。今後、DataStreamおよびTableAPIにDataSet機能を段階的に実装する予定です。その時点で、DataStreamはSQLやTableAPIと同様に、境界付き処理と境界なし処理の両方を記述できるAPIになります。 Blinkは、アーキテクチャの再構築に加え、実装においても大幅なリファクタリングを実施しました。まず、バイナリデータ構造BinaryRowを導入し、データストレージのオーバーヘッドと、シリアル化およびデシリアル化の計算オーバーヘッドを大幅に削減しました。次に、オペレータ実装レベルでは、CodeGenテクノロジを幅広く採用しています。オペレータが処理する必要があるデータのタイプが事前にわかっているため、QP層内でより的確で効率的な実行コードを直接生成できます。 Blinkの演算子はリソースを動的に割り当て、活用することで、リソース利用率を向上させ、効率性を向上させます。さらに重要なのは、これらの演算子は優れたリソース制御を提供し、OutOfMemoryエラーを防止できることです。さらに、ストリーム処理シナリオ向けに、Blinkはミニバッチ実行モードを組み込んでいます。集計や結合など、状態との頻繁なやり取りが必要で、部分的なreduce操作を伴うことが多いシナリオでは、ミニバッチによってI/Oが大幅に削減され、パフォーマンスが桁違いに向上します。これらの重要なリファクタリングと機能に加えて、Blinkは完全なSQL DDL、emit戦略を備えたストリーム処理DML、いくつかの重要なSQL機能、そして数多くのパフォーマンス最適化戦略も実装しています。 前述のアーキテクチャと実装のリファクタリングにより、Blink の SQL/Table 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に追加されたすべての新機能に対応するAPIをTableAPIにも追加しました。さらに、TableAPIにはいくつかの新機能が導入されました。重要な機能の1つはキャッシュです。バッチコンピューティングのシナリオでは、ユーザーは必要に応じて中間結果をキャッシュできるため、不要な重複計算を回避できます。これにより、インタラクティブなプログラミングエクスペリエンスが大幅に向上します。今後、TableAPIにはさらに便利な機能を追加していく予定です。多くの新機能が既にコミュニティで議論され、受け入れられています。例えば、TableAPIには行全体を操作するための演算子(map、flatMap、aggregate、flatAggregate(Flink FLIP29)など)が追加されました。 ハイブの互換性オープンソース版のBlinkは、メタデータ層とデータ層で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 と Table API を使用して、Flink の静的テーブルと動的テーブルを簡単にクエリできます。 さらに、Flinkのストリーム処理の特性を考慮し、このバージョンのZeppelinはセーブポイントのサポートも充実しています。ユーザーはインターフェース上でジョブを一時停止し、セーブポイントから再開することができます。データ可視化に関しては、従来のデータ分析インターフェースに加えて、ストリーム処理フリッパーや時系列可視化などの機能を追加しました。ユーザーが簡単に試用できるよう、このバージョンのZeppelinには、StreamingETL用とFlink Batch用、そしてFlink Stream用のそれぞれ2つの基本的なサンプルを含む、3つのFlinkチュートリアルサンプルが組み込まれています。 フリンクウェブFlink Webは、使いやすさやパフォーマンスなど、いくつかの領域で大幅に改善されました。リソース使用量、ジョブチューニング、ログクエリなど、多数の新機能が追加され、ユーザーによるFlinkジョブの管理と保守が容易になりました。リソース使用量に関しては、クラスター、タスクマネージャー、タスクの3つのレベルでリソース情報を追加し、リソースの割り当てと使用状況を明確に把握できるようになりました。ジョブのトポロジとデータフローはオペレーターレベルまで遡って追跡できます。InQueueやOutQueueなどのVertexメトリックが追加され、データのバックプレッシャー、フィルタリング、スキューの追跡が容易になりました。TaskManagerとJobManagerのログ機能も大幅に強化されました。ジョブ、Vertex、サブタスクなど、複数のディメンションからログをリンクできるようになり、複数のログファイルへのアクセス、ページ分割されたクエリ、ログの強調表示が可能になります。 さらに、最新のAngular 7.0を使用してFlink Webを全面的にリファクタリングした結果、ページパフォーマンスが2倍以上に向上しました。大規模なデータセットであっても、ページのフリーズや遅延は発生しなくなりました。また、ページ全体のインタラクションロジックを最適化し、関連情報のほとんどを1ページでクエリ・比較できるようにすることで、不要なページリダイレクトを大幅に削減しました。 今後の計画Blinkは完全なオープンソース化に向けた第一歩を踏み出しました。コミュニティと協力し、Blinkの機能とパフォーマンスの最適化をできるだけ早くFlinkに統合していきます。このオープンソース版は、Blinkの長年のストリームコンピューティングの経験を活かし、バッチ処理においても大きな成果をもたらします。今後も、Flinkコミュニティに他の機能を提供していきます。数ヶ月ごとに、コミュニティに重要な技術的ハイライトが貢献されることを期待しています。次のハイライトは機械学習のサポートです。機械学習のサポートを実現するには、エンジンの機能、パフォーマンス、使いやすさの向上など、一連の作業が必要です。この作業の大部分はすでに完了しており、多くの機能がAlibabaの社内サービスで既に利用可能です。 技術革新や新機能に加え、Flinkの使いやすさとエコシステムも非常に重要です。この分野では、多言語サポート(Python、Goなど)、Flinkクラスタ管理、ノートブック、機械学習プラットフォームなど、複数のプロジェクトを立ち上げています。これらのプロジェクトの中には、Flink自体の一部となりコミュニティに貢献するものもあれば、そうでないものもあります。いずれにしても、いずれもFlinkをベースとしており、Flinkエコシステムにとって貴重な存在です。また、Flinkとは独立したプロジェクトのオープンソース化も真剣に検討しています。つまり、オープンソース化の初日から、BlinkはFlinkコミュニティに完全に統合されており、すべての開発者の皆様に私たちの真摯な姿勢と強い意志を感じていただければ幸いです。 今後、私たちは機能面とエコシステムの両面において、Flinkコミュニティへの投資を強化していきます。また、Flinkコミュニティの運営にも尽力し、中国および世界中でFlinkが広く普及するよう尽力していきます。Apache Flinkオープンソースコミュニティのさらなる発展に、より多くの方々がご参加くださることを心より願っております。 |