Azure #CosmosDB を使用したラムダ アーキテクチャ: 高性能かつ低 TCO で DevOps の負担を軽減

執筆者: Denny Lee (Principal Program Manager, Azure CosmosDB)

このポストは、2018 年 1 月 31 日に投稿された Lambda Architecture using Azure #CosmosDB: Faster performance, Low TCO, Low DevOps の翻訳です。

 

image

バッチ処理とリアルタイム処理、両方の取り込みとクエリを実行可能な Azure Cosmos DB は、TCO を抑えながらラムダ アーキテクチャを実装できるスケーラブルなデータベース ソリューションです。ラムダ アーキテクチャでは、大規模なデータ セットを効率よく処理することが可能です。また、バッチ処理ストリーム処理サービス レイヤーによって、ビッグ データのクエリのレイテンシを最小化します。

ラムダ アーキテクチャの実装時に以下のテクノロジを組み合わせると、リアルタイムのビッグ データ分析処理をさらに効率化することができます。

マルチレイヤー設計に基づいたオリジナルのラムダ アーキテクチャの基礎と、シンプルに再設計されたアーキテクチャの詳細については、こちらの記事をご覧ください。

ラムダ アーキテクチャとは?

image

上の図は、ラムダ アーキテクチャの基本原理を示しています。

  1. すべてのデータは、バッチ レイヤーとスピード レイヤーの両方にプッシュされます。
  2. バッチ レイヤーでは、マスター データ セット (変更できない追加専用の生データ) を保持し、バッチ ビューの事前計算を実行します。
  3. サービス レイヤーでは、バッチ ビューの高速クエリを実行します。
  4. スピード レイヤーでは、直近データのみを処理して、(バッチ レイヤーからサービス レイヤーまでの) 処理時間を短縮します。
  5. すべてのクエリの結果は、バッチ ビューとリアルタイム ビューの結果を統合して表示するか、個別に取得することができます。

スピード レイヤー

スピード レイヤーでは、Azure Cosmos DB Change Feed を利用して、バッチ レイヤーの状態を保ちながら Change Feed API で Azure Cosmos DB の変更ログを取得します。

image

レイヤーに関する重要なポイントは以下のとおりです。

  1. すべてのデータは Azure Cosmos DB のみにプッシュされるため、マルチキャストの問題は発生しません。
  2. バッチ レイヤーでマスター データ セット (変更できない追加専用の生データ セット) を保持し、バッチ ビューの事前計算を実行します。
  3. サービス レイヤーについては、次のセクションで説明します。
  4. スピード レイヤーでは、HDInsight (Apache Spark) を使用して Azure Cosmos DB Change Feed を読み取ります。このため、データを保持しながらクエリと処理を同時に実行できます。
  5. すべてのクエリの結果は、バッチ ビューとリアルタイム ビューの結果を統合して表示するか、個別に取得することができます。

サンプル コードは、こちらのドキュメントを参照してください。

バッチ レイヤーとサービス レイヤー

新しいデータは、マスター データ セット (変更できない追加専用の生データ) が存在する Azure Cosmos DB に読み込まれます (このとき、スピード レイヤー用に Change Feed が使用されます)。その後、次の図のように、バッチ レイヤーからサービス レイヤーに送るデータの事前計算を HDInsight (Apache Spark) で実行します。

image

このレイヤーでの重要なポイントは以下のとおりです。

  1. すべてのデータは Azure Cosmos DB のみにプッシュされます (マルチキャストの問題は発生しません)。
  2. バッチ レイヤーには、Azure Cosmos DB に保持されるマスター データ セット (変更できない追加専用の生データ) が存在します。HDInsight Spark を使用して、集計を事前計算し、計算済みバッチ ビューに保存することができます。
  3. サービス レイヤーは、マスター データ セットと計算済みバッチ ビューのコレクションを含む Azure Cosmos DB データベースです。
  4. スピード レイヤーについては、次のセクションで説明します。
  5. すべてのクエリの結果は、バッチ ビューとリアルタイム ビューの結果を統合して表示するか、個別に取得することができます。

サンプル コードはこちらのドキュメントをご確認ください。また、以下の完全なサンプル コードは azure-cosmosdb-spark/lambda/samples (英語) を参照してください。

スピード レイヤー

前述のとおり、Azure Cosmos DB Change Feed ライブラリを使用すると、バッチ レイヤーとスピード レイヤーの間の操作を簡素化することができます。このアーキテクチャでは、Apache Spark (HDInsight 経由) を使用し、データに対して構造化されたストリーミング クエリを実行します。構造化されたストリーミング クエリの結果を一時的に保存しておき、他のシステムからデータにアクセスすることも可能です。

image

そのために、構造化されたストリーミング クエリの結果の保存先となる Azure Cosmos DB コレクションが別途作成されます。これにより、Apache Spark 以外のシステムからこの情報にアクセスできるようになります。また、Azure Cosmos DB の Time-to-Live (TTL) 機能を使用して、設定した期間が経過したら自動的にドキュメントを削除するように設定することができます。Azure Cosmos DB の TTL 機能の詳細については、ドキュメント「TTL を使って Azure Cosmos DB コレクションのデータの有効期限が自動的に切れるようにする」を参照してください。

Azure CosmosDB を使用したラムダ アーキテクチャ: 高性能かつ低 TCO で DevOps の負担を軽減

ここまで説明したように、Azure Cosmos DB、Azure Cosmos DB Change Feed ライブラリ、Apache Spark on HDInsight、Azure Cosmos DB 用のネイティブな Spark コネクタなどを使用することで、オリジナルのラムダ アーキテクチャ (バッチ レイヤー、サービス レイヤー、スピード レイヤー) を簡素化することができます。

image

さらに、操作だけでなくデータ フローも簡素化されます。

  1. すべてのデータは Azure Cosmos DB にプッシュされて処理されます。
  2. バッチ レイヤーでは、マスター データ セット (変更できない追加専用の生データ) を保持し、バッチ ビューの事前計算を実行します。
  3. サービス レイヤーでは、バッチ ビューの高速クエリを実行します。
  4. スピード レイヤーでは直近データのみを処理して、(バッチ レイヤーからサービス レイヤーまでの) 処理時間を短縮します。
  5. バッチ ビューとリアルタイム ビューのすべてのクエリの結果が統合されて表示されます。

 

次のステップ

Spark - Azure Cosmos DB コネクタをまだお持ちでない場合は、GitHub の azure-cosmosdb-spark リポジトリ (英語) からダウンロード可能です。また、その他の資料は以下のリポジトリから入手できます。

Apache Spark SQL、DataFrame、Dataset に関するガイドはこちらのページ (英語)、Apache Spark on Azure HDInsight についてはこちらのページを参照してください。この記事の詳細については、こちらのドキュメントを参照してください。今回は、大企業から個人の開発者まで、だれでも Azure Cosmos DB を使用してわずか数分でビッグ データ用のラムダ アーキテクチャを構築できる方法をお伝えしました。Azure Cosmos DB は、こちらのページからすぐにお試しいただけます。サインアップやクレジット カード情報の登録などは必要ありません。Azure Cosmos DB の機能や最新情報については、Twitter アカウント (#CosmosDB@AzureCosmosDB) をフォローしてください。

- Azure Cosmos DB チーム.