Apache Doris入門
Apache Dorisとは
Apache Dorisは、高速なクエリ速度で知られるMPPベースのリアルタイムデータウェアハウスです。大規模データセットに対するクエリでは、サブ秒で結果を返します。高同時実行ポイントクエリと高スループット複合分析の両方をサポートします。レポート分析、アドホッククエリ、統合データウェアハウス、データレイククエリアクセラレーションに使用できます。Apache Dorisをベースに、ユーザーはユーザー行動分析、A/Bテストプラットフォーム、ログ解析、ユーザープロファイル分析、Eコマース注文分析のアプリケーションを構築できます。
Apache Dorisは、以前はPaloとして知られ、当初はBaiduの広告レポート業務をサポートするために作成されました。2017年に正式にオープンソース化され、2018年7月にBaiduによってApache Software Foundationに寄贈され、Apacheメンターの指導の下でインキュベータープロジェクト管理委員会のメンバーによって運営されました。2022年6月、Apache DorisはApacheインキュベーターを卒業し、トップレベルプロジェクトとなりました。現在、Apache Dorisコミュニティには、様々な業界の数百社から700名以上の貢献者が集まっており、月間120名以上のアクティブな貢献者がいます。
Apache Dorisは幅広いユーザーベースを持ちます。世界中の5000社以上の企業の本番環境で使用されており、TikTok、Baidu、Tencent、NetEaseなどの大手企業も含まれています。また、金融、小売、通信から エネルギー、製造業、医療などの業界でも広く使用されています。
使用シナリオ
下図に示すように、様々なデータ統合と処理の後、データソースは通常、リアルタイムデータウェアハウスDorisとオフラインレイクハウス(Hive、Iceberg、Hudiなど)に取り込まれます。これらはOLAP分析シナリオで広く使用されています。

Apache Dorisは以下のシナリオで広く使用されています:
-
リアルタイムデータ分析:
-
リアルタイムレポートと意思決定: Dorisは企業の内部および外部使用向けにリアルタイム更新されるレポートとダッシュボードを提供し、自動化プロセスでのリアルタイム意思決定をサポートします。
-
アドホック分析: Dorisは多次元データ分析機能を提供し、迅速なビジネスインテリジェンス分析とアドホッククエリを可能にし、ユーザーが複雑なデータから迅速に洞察を発見するのを支援します。
-
ユーザープロファイリングと行動分析: Dorisは参加、定着、コンバージョンなどのユーザー行動を分析でき、また人口統計インサイトや行動分析のための群衆選択などのシナリオもサポートします。
-
-
レイクハウス分析:
-
レイクハウスクエリアクセラレーション: Dorisは効率的なクエリエンジンでレイクハウスデータクエリを高速化します。
-
連携分析: Dorisは複数のデータソースにまたがる連携クエリをサポートし、アーキテクチャを簡素化してデータサイロを排除します。
-
リアルタイムデータ処理: Dorisはリアルタイムデータストリームとバッチデータ処理機能を組み合わせ、高同時実行と低レイテンシの複雑なビジネス要件のニーズを満たします。
-
-
SQLベースの可観測性:
- ログとイベント分析: Dorisは分散システムのログとイベントのリアルタイムまたはバッチ分析を可能にし、問題の特定とパフォーマンス最適化を支援します。
全体アーキテクチャ
Apache DorisはMySQLプロトコルを使用し、MySQL構文と高い互換性を持ち、標準SQLをサポートします。ユーザーは様々なクライアントツールを通じてApache Dorisにアクセスでき、BIツールとシームレスに統合できます。Apache Dorisをデプロイする際、ハードウェア環境とビジネスニーズに基づいて、ストレージ・コンピュート統合アーキテクチャまたはストレージ・コンピュート分離アーキテクチャを選択できます。
ストレージ・コンピュート統合アーキテクチャ
Apache Dorisのストレージ・コンピュート統合アーキテクチャは合理化されており、メンテナンスが簡単です。下図に示すように、2種類のプロセスのみで構成されています:
-
Frontend (FE): 主にユーザーリクエストの処理、クエリ解析と計画、メタデータ管理、ノード管理タスクを担当します。
-
Backend (BE): 主にデータストレージとクエリ実行を担当します。データはシャードに分割され、BEノード間で複数のレプリカとして保存されます。

本番環境では、災害復旧のために複数のFEノードをデプロイできます。各FEノードはメタデータの完全なコピーを維持します。FEノードは3つの役割に分かれます:
| 役割 | 機能 |
|---|---|
| Master | FE Masterノードはメタデータの読み書き操作を担当します。Masterでメタデータの変更が発生すると、BDB JEプロトコルを介してFollowerまたはObserverノードに同期されます。 |
| Follower | Followerノードはメタデータの読み取りを担当します。Masterノードが故障した場合、Followerノードが新しいMasterとして選択されます。 |
| Observer | Observerノードはメタデータの読み取りを担当し、主にクエリの同時実行性を向上させるために使用されます。クラスターのリーダーシップ選出には参加しません。 |
FEとBEプロセスの両方が水平スケーラブルであり、単一クラスターで数百台のマシンと数十ペタバイトのストレージ容量をサポートできます。FEとBEプロセスは整合性プロトコルを使用して、サービスの高可用性とデータの高信頼性を確保します。ストレージ・コンピュート統合アーキテクチャは高度に統合されており、分散システムの運用複雑性を大幅に削減します。
コンピュート・ストレージ分離
バージョン3.0以降、コンピュート・ストレージ分離デプロイアーキテクチャを選択できます。Apache Dorisのコンピュート・ストレージ分離版は、データストレージスペースとして統合共有ストレージ層を利用します。ストレージとコンピュートを分離することで、ユーザーはストレージ容量とコンピューティングリソースを独立してスケールでき、最適なパフォーマンスとコスト効率を実現できます。下図に示すように、コンピュート・ストレージ分離アーキテクチャは3つの層に分かれます:
-
メタデータ層: メタデータ層は主にリクエスト計画、クエリ解析と計画、メタデータストレージと管理を担当します。
-
コンピュート層: コンピュート層は複数のコンピュートグループで構成され、各グループがビジネスコンピューティングを処理する独立したテナントとして動作できます。各コンピュートグループ内には複数のステートレスBEノードがあり、BEノードはいつでも弾力的にスケールアップ・ダウンできます。
-
ストレージ層: ストレージ層はS3、HDFS、OSS、COS、OBS、Minio、Cephなどの共有ストレージソリューションを使用してDorisのデータファイル(Segmentファイルや転置インデックスファイルを含む)を保存できます。

Apache Dorisのコア機能
-
高可用性: Apache Dorisでは、メタデータとデータの両方が複数のレプリカで保存され、クォーラムプロトコルを介してデータログを同期します。レプリカの過半数が書き込みを完了すると、データ書き込みが成功したと見なされ、少数のノードが故障してもクラスターが利用可能であることを保証します。Apache Dorisは同一地域および地域間災害復旧の両方をサポートし、デュアルクラスターマスタースレーブモードを可能にします。一部のノードで故障が発生した場合、クラスターは自動的に故障ノードを分離し、クラスター全体の可用性が影響を受けることを防ぎます。
-
高互換性: Apache DorisはMySQLプロトコルと高い互換性を持ち、標準SQL構文をサポートし、ほとんどのMySQLとHive関数をカバーします。この高い互換性により、ユーザーは既存のアプリケーションやツールをシームレスに移行・統合できます。Apache DorisはMySQLエコシステムをサポートし、ユーザーがMySQL Clientツールを使用してDorisに接続し、より便利な運用・保守を可能にします。また、BIレポートツールやデータ伝送ツールとのMySQLプロトコル互換性もサポートし、データ分析とデータ伝送プロセスの効率性と安定性を確保します。
-
リアルタイムデータウェアハウス: Apache Dorisをベースに、リアルタイムデータウェアハウスサービスを構築できます。Apache Dorisは秒レベルのデータ取り込み機能を提供し、上流のオンライントランザクションデータベースからの増分変更を数秒以内にDorisにキャプチャします。ベクトル化エンジン、MPPアーキテクチャ、Pipelineエグゼキューションエンジンを活用し、Dorisはサブ秒のデータクエリ機能を提供し、高パフォーマンス・低レイテンシのリアルタイムデータウェアハウスプラットフォームを構築します。
-
統合レイクハウス: Apache Dorisは、データレイクやリレーショナルデータベースなどの外部データソースをベースに統合レイクハウスアーキテクチャを構築できます。Doris統合レイクハウスソリューションは、データレイクとデータウェアハウス間のシームレスな統合と自由なデータフローを可能にし、ユーザーがデータレイクのデータ分析問題を解決するためにデータウェアハウス機能を直接利用し、データレイクのデータ管理機能を十分に活用してデータ価値を向上させることを支援します。
-
柔軟なモデリング: Apache Dorisは、ワイドテーブルモデル、事前集約モデル、スター・スノーフレークスキーマなど、様々なモデリングアプローチを提供します。データインポート時に、FlinkやSparkなどのコンピュートエンジンを通じてデータをワイドテーブルに平坦化してDorisに書き込むか、データを直接Dorisにインポートし、ビュー、マテリアライズドビュー、リアルタイム複数テーブル結合を通じてデータモデリング操作を実行できます。
技術概要
Dorisは効率的なSQLインターフェースを提供し、MySQLプロトコルと完全に互換性があります。そのクエリエンジンはMPP(Massively Parallel Processing)アーキテクチャをベースとしており、複雑な分析クエリを効率的に実行し、低レイテンシのリアルタイムクエリを実現できます。データのエンコーディングと圧縮のための列指向ストレージ技術を通じて、クエリパフォーマンスとストレージ圧縮率を大幅に最適化します。
インターフェース
Apache DorisはMySQLプロトコルを採用し、標準SQLをサポートし、MySQL構文と高い互換性を持ちます。ユーザーは様々なクライアントツールを通じてApache Dorisにアクセスでき、Smartbi、DataEase、FineBI、Tableau、Power BI、Apache Supersetなどを含むがこれらに限定されないBIツールとシームレスに統合できます。Apache DorisはMySQLプロトコルをサポートする任意のBIツールのデータソースとして機能できます。
ストレージエンジン
Apache Dorisは列指向ストレージエンジンを持ち、列単位でデータのエンコーディング、圧縮、読み取りを行います。これにより非常に高いデータ圧縮率を実現し、不要なデータスキャンを大幅に削減するため、IOとCPUリソースをより効率的に使用できます。
Apache Dorisは、データスキャンを最小化するために様々なインデックス構造をサポートします:
-
ソート複合キーインデックス: ユーザーは最大3列を指定して複合ソートキーを形成できます。これにより効果的にデータを削減でき、高同時実行レポートシナリオをより良くサポートします。
-
Min/Maxインデックス: 数値型の等価・範囲クエリで効果的なデータフィルタリングを可能にします。
-
BloomFilterインデックス: 高カーディナリティ列の等価フィルタリングと削減に非常に効果的です。
-
転置インデックス: 任意のフィールドの高速検索を可能にします。
Apache Dorisは様々なデータモデルをサポートし、異なるシナリオに対して最適化を行っています:
-
詳細モデル (Duplicate Key Model): ファクトテーブルの詳細ストレージ要件を満たすように設計された詳細データモデル。
-
主キーモデル (Unique Key Model): ユニークキーを保証し、同一キーを持つデータは上書きされ、行レベルのデータ更新を可能にします。
-
集約モデル (Aggregate Key Model): 同一キーを持つ値列をマージし、事前集約によりパフォーマンスを大幅に向上させます。
Apache Dorisは強整合性単一テーブルマテリアライズドビューと非同期更新複数テーブルマテリアライズドビューもサポートします。単一テーブルマテリアライズドビューはシステムによって自動的に更新・維持され、ユーザーの手動介入は不要です。複数テーブルマテリアライズドビューは、クラスター内スケジューリングまたは外部スケジューリングツールを使用して定期的に更新でき、データモデリングの複雑性を削減します。
クエリエンジン
Apache DorisはMPPベースのクエリエンジンを持ち、ノード間およびノード内での並列実行を行います。大規模テーブル向けの分散shuffle joinをサポートし、複雑なクエリをより良く処理します。

Apache Dorisのクエリエンジンは完全にベクトル化されており、すべてのメモリ構造が列指向形式でレイアウトされています。これにより仮想関数呼び出しを大幅に削減し、キャッシュヒット率を向上させ、SIMD命令を効率的に使用できます。Apache Dorisは、ワイドテーブル集約シナリオでベクトル化されていないエンジンより5〜10倍高いパフォーマンスを提供します。

Apache Dorisは適応的クエリ実行技術を使用し、実行時統計に基づいて実行計画を動的に調整します。例えば、実行時フィルターを生成してプローブ側にプッシュできます。具体的には、プローブ側の最低レベルスキャンノードにフィルターをプッシュし、処理するデータ量を大幅に削減してjoinパフォーマンスを向上させます。Apache Dorisの実行時フィルターはIn/Min/Max/Bloom Filterをサポートします。

Apache DorisはPipelineエグゼキューションエンジンを使用し、クエリを複数のサブタスクに分割して並列実行し、マルチコアCPU機能を十分に活用します。クエリスレッド数を制限することで、スレッド爆発問題も同時に解決します。Pipelineエグゼキューションエンジンはデータコピーと共有を削減し、ソートと集約操作を最適化することで、クエリ効率とスループットを大幅に向上させます。
オプティマイザーの面では、Apache DorisはCBO(Cost-Based Optimizer)、RBO(Rule-Based Optimizer)、HBO(History-Based Optimizer)の組み合わせ最適化戦略を採用しています。RBOは定数畳み込み、サブクエリ書き換え、述語プッシュダウンなどをサポートします。CBOはjoin並び替えなどの最適化をサポートします。HBOは履歴クエリ情報に基づいて最適な実行計画を推奨します。これらの複数の最適化対策により、Dorisが様々なタイプのクエリにおいて高パフォーマンスなクエリ計画を列挙できることを保証します。