Apache DruidのコンセプトとOSXで起動するまで
本記事
今回はApache DruidをmacOSにインストールして、実際にSQLでデータを入れたりしてみようと思います。
1. Apache Druidとは
公式サイトを直訳すると、
Apache Druidとはイベント駆動開発のための高パフォーマンスを持つ解析データストア
です。
1.1 概要
Druidは非常に大きなストリームを格納し、クエリし、解析するのに優れているようです。
また、Druidは集約や検索などで走るsub-second
クエリにも最適化されています。
1.2 開発された目的
最初はDruidはアドトック解析レポートを作るためにスケーラブルに、可視化でき、マルチテナントのため作られ、また、パターンや異常を検出するため作られました。
1.3 ユースケース
ユースケースとしてあげられているのが
- 解析のパフォーマンスを上げたいとき:
- 問題の診断
- 共通項を探す
- 効率をあげる
例えば、以下のような項目です。
- ユーザーのクリックログ
- アプリケーションのパフォーマンスメトリックス
- ネットワークフローによって生成されたデータ
などです。
1.4 ソフトウェアデザイン
以下の項目がDruidのコアなデザインとなっています。
- 列志向型データベース
- ネイティブサーチインデックス
- ストリームとバッジの取得
- 柔軟なスキーマ
- 時間最適なパーティション
- SQLサポート
- 水平方向スケーリング
- 簡単な操作性
1.5 テクノロジー
Druidは以下の思想を持つ分散データストアである。
1.5.1 統合
Druidは様々なオープンソースデータ技術に対して親和性が高い。
その間の中間データストアとして機能する。
1.5.2 取得
Druidはバッジでもストリームでも取得することができる。
Apache Kafkaなどからのデータや、HDFSなどからのバッジ向けステレージにも使うことができる。
1.5.3 ストレージ
1.5.3.1 セグメント
Segment
を最初に説明します。
Druidはデータのインデクスを時間によってパーティションが分けて、保存していきます。
基本の設定では、一つのセグメントは、一定時間ごとに作成されます。
また、データのストラクチャは以下のようになります。 重要なのは、Timestamp, Dimensions, Metricsです。
1.5.3.2 列志向型ストレージ
他の解析的なストレージのように、Druidはデータをカラムで保持する。
列の型によって、異なる圧縮方式を取っていて、効率がいいです。
検索エンジンのように、Druidはインデックスを作成して、高速化を実現している。
また、他のデータベースと違って、Druidはオプションでデータをあらかじめ集約することができ、このステップはroll-up
と呼ばれ、ストレージを劇的に効率化できる。
1.5.4 クエリ
クエリはHTTP Request
によるJSONを渡すか、SQLで実行できる。
1.5.5 アーキテクチャ
1.5.5.1 概念
Druidで重要な処理概念は以下の通りです。
これらは、別々のサーバーでも共有サーバーでもホストすることができる。
名前 | 概要 |
---|---|
Historical |
historical データに対して格納したり、クエリなどの処理をするワーカーである。deep storage からセグメントをダウンロードしてきて、セグメントについてクエリをする。書き込みはしない。 |
MiddleManager |
クラスタに入ってくる新しいデータの処理をする。 外部のソースからデータを読み込んで、Druidセグメントをパブする役割を持つ。 |
Broker |
クライアントからクエリを受け取って、Historical とMiddelManager に転送する。ブローカーがサブクレリの結果を取得すると、それらをマージしてクライアントに戻す。 |
Coordinator |
historical プロセルを監視している。セグメントをどこのサーバーに配置したり、効率よく分散するようにする責任を持つ。 |
Overload |
MiddleManager プロセスとDruidに入ってくるデータを監視している。MiddleManager のデータ取得タスクや、セグメントパブリッシュの責任を持つ。 |
Router |
図中にはないが、Broker , Overload などのAPIのルーティングである。 |
また、処理概念とは別に、三つの外部依存性がある。
名前 | 概念 |
---|---|
Deep storage |
すべてのDruidサーバーからアクセスできる共有ファイルストレージ。Amazon S3やHDFSなどのような分散ファイルストレージである。 |
Metadata store |
メタデータを格納していて、一般的にRDBである。 |
Druidは分散データベースである。 ハードウェアが別でも一緒でもクエリを投げることができる。
クエリの様子を以下のように示す。
1.5.5.2 データソースとセグメント
DruidのデータはRDBに似ているテーブルに保存されます。
データはチャンクと呼ばれる一定時間でセグメントにパーティション化される。
それぞれのセグメントはたくさんの行を含む単一のファイルである。
1.5.6 オペレーション
Druidは以下のようなプロセスをデータの損失なしで行うことができる。
- データレプリケーション
- 独立したプロセス
- 自動的にデータをバックアップ
- ローリングアップデート
- 水平スケーラブル
- 操作が簡単
2. 環境構築
2.1 Apache Druidをインストール
macにHomebrewを使ってインストールします。
$ brew install druid
一般的にDRUID_HOME
は/usr/local/Cellar/druid/0.12.2/libexec
のようになります。
以下のようなファイル構成になります。
. ├── bin ├── conf ├── conf-quickstart ├── extensions ├── hadoop-dependencies ├── lib └── quickstart
また、/bin
以下の実行スクリプトは以下の通りです。
bin/ ├── broker.sh ├── coordinator.sh ├── generate-example-metrics ├── historical.sh ├── init ├── jconsole.sh ├── middleManager.sh ├── node.sh └── overlord.sh
2.2 Zookeeperを起動する
以下のコマンドでZookeeperを起動します。
$ brew services start zookeeper
起動を確認してください。
$ brew services list | grep zookeeper zookeeper started keisukeyamashita /Users/keisukeyamashita/Library/LaunchAgents/homebrew.mxcl.zookeeper.plist
3. Druidを起動してみる
3.1 初期化する
まず初期化します。 するといくつかディレクトリが作成されます。
bin/init
3.2 Druidプロセスを実行する
java `cat conf-quickstart/druid/historical/jvm.config | xargs` -cp "conf-quickstart/druid/_common:conf-quickstart/druid/historical:lib/*" io.druid.cli.Main server historical java `cat conf-quickstart/druid/broker/jvm.config | xargs` -cp "conf-quickstart/druid/_common:conf-quickstart/druid/broker:lib/*" io.druid.cli.Main server broker java `cat conf-quickstart/druid/coordinator/jvm.config | xargs` -cp "conf-quickstart/druid/_common:conf-quickstart/druid/coordinator:lib/*" io.druid.cli.Main server coordinator java `cat conf-quickstart/druid/overlord/jvm.config | xargs` -cp "conf-quickstart/druid/_common:conf-quickstart/druid/overlord:lib/*" io.druid.cli.Main server overlord java `cat conf-quickstart/druid/middleManager/jvm.config | xargs` -cp "conf-quickstart/druid/_common:conf-quickstart/druid/middleManager:lib/*" io.druid.cli.Main server middleManager
またhttp://localhost:8090/console.htmlでコンソールを確認できます。