今日のビジネスでは、意思決定を行うために正確かつタイムリーなデータが必要です。時系列データに基づいて構築されたデータ駆動型のアプリケーションとダッシュボードは、あらゆる企業に存在します。システムやアプリケーションのメトリクスから、天気、株価、ネットワーク テレメトリ、IoT センサーに至るまで、多くのビジネス データは時系列であり、ビジネスに関する洞察を提供するために、すべて複雑な時系列分析と視覚化に依存しています。
Clickhouse (Clickhouse と MinIO の詳細については、「ClickHouse とMinIO の統合」を参照)、Snowflake、Amazon の TimeStream と RedShift、Apache Druid など、この種の分析用に構築されたデータベースが多数あります。一般的なワークフローには、リアルタイムでストリーミングされるかデータ レイクから取得されるデータの収集、それを変換してデータベースに取り込み、データベースに対して実行される SQL クエリを使用してアプリケーションとダッシュボードを構築することが含まれます。
このブログ投稿では、 Apache Druid 、特にディープ ストレージとして MinIO を使用して Druid を実行する方法に焦点を当てています。詳細については後ほど説明しますが、簡単に言うと、Druid はデータを S3 ディープ ストレージに保存し、クエリの実行時に必要に応じてローカル メモリとの間でデータを交換します。 MinIO をインストールし、Druid をインストールし、いくつかの構成ファイルを編集して Druid に MinIO を使用するよう指示し、デモ データをインポートしてApache Supersetを使用して視覚化します。
オープンソース製品を使用して、高性能の分析および視覚化スタックをいかに迅速に構築できるかに驚くことを覚悟してください。
Druid は最速のデータ ストアの 1 つであり、データ ウェアハウス、時系列データベース、検索システムの利点を組み合わせて構築されました。 Druid は、これら 3 つのシステムの主要な特性を取り込み層、ストレージ形式、クエリ層、およびコア アーキテクチャに組み合わせることで、非常に高速なクエリ応答を実現します。 Druid は通常、Apache Kafka、Apache Flink などの他のオープン ソース テクノロジーとともにデプロイされ、ストレージまたは処理レイヤーとエンド ユーザーの間に位置し、分析ワークロードのクエリ レイヤーとして機能します。 Druid の仕組みの詳細については、 「Apache Druid 101」を参照してください。
Druid はクラウドネイティブであり、マイクロサービスベースのアーキテクチャに依存しています。 Druid の各コア サービス (取り込み、クエリ、調整) は、コンテナーまたは汎用ハードウェア上で個別にデプロイおよびスケーリングできます。さらに、Druid サービスは、他のサービスに影響を与えることなく、独立して失敗しても再起動または更新できます。
Druid にはいくつかのプロセス タイプがあります。
コーディネータープロセスは、クラスター上のデータの可用性を管理します。
オーバーロードプロセスは、データ取り込みワークロードの割り当てを制御します。
ブローカープロセスは、外部クライアントからのクエリを処理します。
ルーターのプロセスはオプションです。彼らはリクエストをブローカー、コーディネーター、オーバーロードにルーティングします。
履歴プロセスには、クエリ可能なデータが保存されます。
MiddleManagerプロセスはデータを取り込みます。
これらのプロセスは通常、次の 3 つの異なるサーバーまたはノード タイプにグループでデプロイされます。
Druid には、ディープ ストレージ、メタデータ ストレージ、ZooKeeper という 3 つの主要な外部依存関係があります。簡単に言うと、メタデータはセグメントの使用状況とタスク情報を追跡するために使用され、通常は PostgreSQL または MySQL によって処理されます。 Zookeeper は、内部サービスの検出と調整に使用されます。
これは MinIO ブログなので、ディープ ストレージに焦点を当てます。ディープ ストレージは、すべての Druid サーバーからアクセスできる共有ファイル システムで、データが取り込まれた後に保存されます。単一サーバー展開では、これは単なるローカル ドライブです。クラスター化された展開では、ディープ ストレージは、S3 や MinIO、HDFS、またはネットワーク マウントされたファイル システムなどの分散オブジェクト ストアの形式になります。
ディープ ストレージは、Druid がプロセス間でデータを転送し、データをバックアップする方法です。 Druid はデータをセグメントと呼ばれるファイルに保存します。深いストレージからセグメントを取得してローカル ドライブとメモリにキャッシュする内部マッピングがあります。待ち時間を最小限に抑えるために、クエリはディープ ストレージに格納されているセグメントではなく、ローカルのセグメントに対して実行されます。ディープストレージにより、Druid の弾力性のあるフォールトトレラントな設計が可能になります。 Druid は、データ ノードがダウンして復旧した場合にディープ ストレージからブートストラップすることで耐久性を提供します。 1 つの注意点は、Druid で作業するデータ用に、データ ノードとディープ ストレージに十分な空き領域が必要であることです。
Druid は、ディープ ストレージのオブジェクト ストレージに S3 API を使用します。 MinIO などの S3 API 互換オブジェクト ストレージを使用すると、どこでも Druid を自由に実行できます。これは、パフォーマンスとセキュリティを向上させるために実行するとよいでしょう。 MinIO は、優れた S3 互換性、リアルタイム OLAP の要件を満たすパフォーマンス、そしておそらく何よりも大規模なパフォーマンスを実現する能力を備えているため、Druid にとって優れたディープ ストレージです。 MinIO は、必要なデータ保護とライフサイクル管理も提供します。
Druid、MinIO、Superset は Linux 上で直接実行することも、Docker や Kubernetes 上のコンテナ内で実行することもできます。 Druid を立ち上げて実行する方法を示す優れたリソースがすでにいくつか公開されているため、何らかの理由でこのブログ投稿に満足できない場合は、Linux、Docker 用のApache Druid クイックスタート· Docker およびクラスター化された Apache用のApache Druidを参照してください。 Kubernetes 用のラップトップ上の Druid® 。
まだ MinIO を実行していない場合は、インストール手順を参照してください。このプロセスについては、「 MinIO クイックスタート ガイド 」で詳しく説明されています。
たとえば、Linux では、MinIO をダウンロードして実行します (root パスワードは自由に変更して、覚えておいてください)。
wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
ブラウザを起動し、前に設定した root ユーザーとパスワードを使用してhttp://<your-IP-address>:9000
ある MinIO サーバーに接続します。
初めてログインすると、「バケット」ページが表示されます。
バケットdruidbucket
を作成します。
現実の世界では、おそらく Druid データへのアクセスを保護したいと思うでしょうが、私たちのラボではその必要はありません。 ([ID] メニューで) サービス アカウントを作成し、 druidbucket
へのアクセスのみを許可するようにユーザー ポリシーを編集し、以下の Druid 設定でサービス アカウントのアクセス キーと秘密キーを使用します。
Druid をテストする最も簡単な方法は、Docker を使用することです。 Docker · Apache Druid の手順に従い、このdocker-compose.yamlを使用します。これにより、各 Druid サービス、Zookeeper、PostgresSQL のコンテナが作成されます。この方法では、 環境ファイルを使用して Druid 構成を指定します。 このファイルを、 Druid のコンテナを保存した場所にダウンロードします。以下の手順 (MinIO 用の Druid の構成) では、環境ファイルを編集して変数を標準のDruid 構成ファイルに渡すか、コンテナ内で構成ファイルを直接編集できます。
docker-compose up
で Druid を起動します。クラスターが起動したら、ブラウザーを開いてhttp://localhost:8888
に移動し、Druid コンソールを使用します。
次に、ディープ ストレージに MinIO を使用するように Druid を構成します。このステップでは、Druid 構成ファイル (または上記の Docker 環境ファイル) を編集して MinIO を参照し、Druid を再起動する必要があります。このプロセスについては、「Minio をディープ ストレージとして使用するように Druid を構成する方法 - DZone Big Data」で詳しく説明されています。ここでは、簡単な参照のために短縮版を含めています。
Druid のインストール方法に応じて、 conf/druid/_common/common.runtime.properties
ファイルで、 "druid-s3-extensions"
をdruid.extensions.loadList
に追加します。拡張子を名前で追加し、引用符で囲み、カンマで区切ります。次に例を示します。
druid.extensions.loadList=["druid-parser-route", "druid-s3-extensions"]
上記の参照記事によると、深層ストレージ用の S3 拡張機能はボンネットの下の Jets3t に依存しています。クラスパス上にjets3t.properties
ファイルを作成する必要があります。この例では、次の内容を使用して、 conf/druid/_common
ディレクトリ内に新しいjets3t.properties
を作成します。
s3service.s3-endpoint=localhost s3service.s3-endpoint-http-port=9000 s3service.disable-dns-buckets=true s3service.https-only=false
ここで、「ディープ ストレージ」セクションのローカル ストレージの構成をコメント アウトし、Minio に適切な値を追加します。私の場合、Druid と同じマシン上で MinIO を実行しているため、S3 エンドポイント URL にはローカルホストとポートが含まれています。別のマシンまたはコンテナーで実行している場合は、環境内の MinIO に対応するようにこの行を変更する必要があります。
この後、「ディープ ストレージ」セクションは次のようになります。
# # Deep storage # # For local disk (only viable in a cluster if this is a network mount): # druid.storage.type=local # druid.storage.storageDirectory=var/druid/segments # For HDFS: # druid.storage.type=hdfs # druid.storage.storageDirectory=/druid/segments # For S3: druid.storage.type=s3 druid.storage.bucket=druidbucket druid.storage.baseKey=druid/segments druid.s3.accessKey= <insert your MinIO accessKey> druid.s3.secretKey= <insert your MinIO secretKey> druid.s3.protocol=http druid.s3.enabePathStyleAccess=true druid.s3.endpoint.signingRegion=us-east-1 druid.s3.endpoint.url=http://localhost:9000/
また、インデックス サービスのログを Minio に保存するように Druid を設定します。見つけやすくするために、すべてを 1 か所に保存することをお勧めします。Druid は、ログを複数の場所で検索しなくても十分に複雑です。 conf/druid/_common/common.runtime.properties
の「インデックス作成サービス ログ」セクションを適切な値で更新します。
この後、「インデックス作成サービス ログ」セクションは次のようになります。
# Indexing service logs # For local disk (only viable in a cluster if this is a network mount): # druid.indexer.logs.type=file # druid.indexer.logs.directory=var/druid/indexing-logs # For HDFS: # druid.indexer.logs.type=hdfs # druid.indexer.logs.directory=/druid/indexing-logs # For S3: druid.indexer.logs.type=s3 druid.indexer.logs.s3Bucket=druidbucket druid.indexer.logs.s3Prefix=druid/indexing-logs
わかりました!これで、Druid に加える設定変更がすべてカバーされます。ファイルを保存し、クラスターを再起動します。 Druid を操作すると、 druidbucket
に書き込まれたセグメントとインデックスが表示されます。
Apache Superset は、Druid で頻繁に使用される強力な視覚化ツールです。 Superset は、高速、軽量、機能満載のクラウドネイティブ ビジネス インテリジェンス アプリケーションで、何よりも無料です。 Superset の直感的なインターフェイスにより、インタラクティブなダッシュボードの作成が比較的簡単になります。スーパーセットは、ほとんどの SQL データベースに対してすぐに使用できるサポートを提供します。スーパーセットは、データベース、OpenID、LDAP、OAuth などの認証バックエンドと統合して、視覚化を保護します。
クラウドネイティブ ソフトウェアとして、Superset は拡張性と可用性が高くなります。大規模な分散環境にスケールアウトできるように設計されています。
私たちは実稼働環境でのスケーリングよりも Superset を使い始めることに興味があるため、 Docker Compose を使用してできる限り簡単なインストールを実行します。これは、Linux または Mac OSX で Superset を試す最も速い方法です。
Docker をまだインストールしていない場合は、 Docker の手順に従ってください。 Docker をインストールしたら、 Docker Compose をインストールしてください。
ターミナル ウィンドウを開き、スーパーセット リポジトリのクローンを作成します。
$ git clone https://github.com/apache/superset.git
これにより、現在のディレクトリにスーパーセット フォルダーが作成されます。そのディレクトリに移動し、次のコマンドを実行します (完了までに数分かかる場合があります)。
$ docker-compose -f docker-compose-non-dev.yml pull $ docker-compose -f docker-compose-non-dev.yml up
端末上で大量の初期化テキストが通過するのがわかります。次のような表示が表示されたら、スーパーセットの準備は完了です。
superset_app | Loaded your LOCAL configuration at [/app/docker/pythonpath_dev/superset_config.py] superset_app | 127.0.0.1 - - [12/May/2022:23:59:35 +0000] "GET /health HTTP/1.1" 200 2 "-" "curl/7.74.0"
ブラウザを開いてhttp://localhost:8088
に移動し、Superset にアクセスします。デフォルトのユーザー名「admin」とパスワード「admin」でログインします。
Superset にログインした後、Druid に接続する必要があります。右上の「+」をクリックしてデータベースを追加します。
ドロップダウン リストから [Apache Druid] を選択します。次に、接続に名前を付け、SQLALCHEMY URI に次のように入力します。必要に応じて IP アドレスを更新するか、localhost に置き換えてください。認証を要求することで Druid API を保護していた場合は、ユーザー名とパスワードも入力することになります。
druid://10.0.0.10:8888/druid/v2/sql
接続をテストして機能することを確認し、[完了] をクリックします。
うわー!これで、環境内で Druid、MinIO、および Superset が実行されました。
Druid、SuperSet、MinIO の三者連携により、リアルタイム データを完全かつタイムリーに表示できます。クリックストリーム分析 (Web およびモバイル分析)、リスク/不正分析、ネットワーク テレメトリ分析 (ネットワーク パフォーマンスの監視)、サプライ チェーン分析 (製造指標) を目的として、この組み合わせに基づいて Web スケールのデータドライブ アプリケーションを構築している組織が数多くあります。アプリケーションのパフォーマンス指標。
このクラウドネイティブの分析および視覚化スタックは柔軟性と拡張性があり、スケーラブルでパフォーマンスに優れているため、ユーザーを満足させるアプリケーションを構築できます。リアルタイム データを監視、分析、視覚化する機能を提供します。列の任意の組み合わせでスライス、ダイス、フィルター、グループ化を実行できるため、ビジネスの要求に合わせてデータに基づいた最終的なアクション指向の意思決定を行うことができます。
私たちが構築した機能の一部をデモンストレーションするために、Wikipedia の長期的な編集のチュートリアル データ ファイルを Druid にロードし、SuperSet で編集を視覚化します。これは、ディープ ストレージとして MinIO によってサポートされていることを忘れないでください。 Wikipedia の編集については、「クイックスタート · Apache Druid」で詳しく説明されています。
Druid は、取り込みタスク仕様を JSON で Overlord サーバーに送信することでデータを読み込みます。 Web GUI を使用して取り込み仕様を構築することも、自分で作成してスケジュールすることもできます。取り込み仕様を構築して調整したら、JSON を再利用できるため、タスクを繰り返す必要がありません。運用環境では、チームは頻繁に取り込みをスケジュールし、自動化します。
ブラウザを開き、 http://localhost:8888で Druid Web インターフェイスをロードします。
ウィンドウの上部で、「データのロード」をクリックします。ここから、[サンプル データ] を選択し、右側のドロップダウンから [Wikipedia Edits] を選択して、青い [サンプルの読み込み] ボタンをクリックします。
Web GUI では、ソースからデータを読み取り、それをディープ ストレージ上のセグメントに保存する取り込み仕様を構築する手順を説明します。取り込みはデータの分割と並べ替えに使用されるタイムスタンプに基づいて行われ、データはディメンションとメトリクスの列として保存されます。取り込み時のパフォーマンスを最適化する方法の詳細については、 「Apache Druid のデータ モデリングとクエリ パフォーマンス」を参照してください。
チュートリアル データを使用する場合は、取り込みワークフローをクリックしてデフォルトを受け入れるか、[JSON 仕様の編集] をクリックしてから [送信] をクリックします。必要に応じて (または必要な場合)、生のファイルを JSON として調べて解析することができます。 Druid は、 __time
と呼ばれる独自の時間列を作成して、データを整理およびセグメント化します。 Druid にとって時間は非常に重要であるため、形式に関係なくタイムスタンプを処理する方法を理解するのが非常に得意です。さらに、データを変換し、データを分割してセグメントのサイズを設定することでクエリのパフォーマンスを最適化できます。最後に、スレッドとメモリ使用率の観点から取り込みジョブを調整し、スケジュールを設定して実行できます。
GUI からタスクを表示します。
これは非常に小規模な取り込みジョブであるため、ほぼすぐに終了します。
ここから、Druid のデータに対してクエリを実行し、超高速の応答を得ることができます。 Web GUI または API を介してクエリを実行できます。 Druid は、大量のデータに対して優れたクエリ パフォーマンスを大規模に提供できるため、多くのダッシュボードの背後にあります。
Superset にログインしたブラウザに戻り、もう一度ホーム画面右上の「+」をクリックします。次に、「チャート」をクリックします。
画面の下部で個別の SQL クエリを実行できます。ダッシュボードは個々のクエリのグループです。反復的なクエリに対する応答は、パフォーマンスを向上させるためにスーパーセットにキャッシュされます。
データセットdruid.wikipedia
を選択し、ビジュアライゼーションを選択します。スーパーセットには、多数の時系列の視覚化が含まれています。 [時系列チャート] を選択し、[新しいチャート] をクリックします。
最初は何も結果が得られませんが、騙されないでください。まず、「フィルターなし」に設定して時間範囲を削除します。時間粒度の設定が「日」では高すぎるため、「5 分」に変更します。ここでは、サンプル データの 5 分間に発生した Wikipedia 編集数のグラフを表示しています。
スーパーセットを使用して結果をフィルタリングおよびグループ化できます。グラフを保存するには、画面上部の「保存」をクリックし、グラフに名前を付けて保存します。
ここまでで、Druid と MinIO をインストールし、最初のデータ セットを取り込み、最初のスーパーセット チャートを生成するための基本的な手順を学習しました。次のステップとしては、 「スーパーセットでのデータの探索」について詳しく学ぶことが役立ちます。
このブログ投稿では、クラウドネイティブ アプリケーションのグループを紹介しました。分析用の Apache Druid、視覚化用の Apache Superset、S3 ディープ ストレージ用の MinIO です。このシンプルなデモは、クラウドネイティブの分析および視覚化スタックの構築の始まりであり、ML 用の Apache Spark またはデータ サイエンス用の Jupyter を使用して拡張できます。
このデモをお読みいただきありがとうございます。ご質問がある場合は、[email protected] に電子メールを送信するか、 MinIO Slack チャネルに参加して質問してください。
ここでも公開されています。