Kekeの日記

エンジニア、読書なんでも

Apache DruidのコンセプトとOSXで起動するまで

image.png

本記事

今回はApache DruidをmacOSにインストールして、実際にSQLでデータを入れたりしてみようと思います。

1. Apache Druidとは

公式サイトを直訳すると、

Apache Druidとはイベント駆動開発のための高パフォーマンスを持つ解析データストア

です。

1.1 概要

Druidは非常に大きなストリームを格納し、クエリし、解析するのに優れているようです。

また、Druidは集約や検索などで走るsub-secondクエリにも最適化されています。

image.png

1.2 開発された目的

最初はDruidはアドトック解析レポートを作るためにスケーラブルに、可視化でき、マルチテナントのため作られ、また、パターンや異常を検出するため作られました。

1.3 ユースケース

ユースケースとしてあげられているのが

  • 解析のパフォーマンスを上げたいとき:
  • 問題の診断
  • 共通項を探す
  • 効率をあげる

例えば、以下のような項目です。

  • ユーザーのクリックログ
  • アプリケーションのパフォーマンスメトリックス
  • ネットワークフローによって生成されたデータ

などです。

1.4 ソフトウェアデザイン

以下の項目がDruidのコアなデザインとなっています。

  • 列志向型データベース
  • ネイティブサーチインデックス
  • ストリームとバッジの取得
  • 柔軟なスキーマ
  • 時間最適なパーティション
  • SQLサポート
  • 水平方向スケーリング
  • 簡単な操作性

1.5 テクノロジー

image.png

Druidは以下の思想を持つ分散データストアである。

1.5.1 統合

Druidは様々なオープンソースデータ技術に対して親和性が高い。

その間の中間データストアとして機能する。

image.png

1.5.2 取得

Druidはバッジでもストリームでも取得することができる。

Apache Kafkaなどからのデータや、HDFSなどからのバッジ向けステレージにも使うことができる。

image.png

1.5.3 ストレージ

1.5.3.1 セグメント

Segmentを最初に説明します。

Druidはデータのインデクスを時間によってパーティションが分けて、保存していきます。

基本の設定では、一つのセグメントは、一定時間ごとに作成されます。

また、データのストラクチャは以下のようになります。 重要なのは、Timestamp, Dimensions, Metricsです。

image.png

1.5.3.2 列志向型ストレージ

他の解析的なストレージのように、Druidはデータをカラムで保持する。

列の型によって、異なる圧縮方式を取っていて、効率がいいです。

検索エンジンのように、Druidはインデックスを作成して、高速化を実現している。

また、他のデータベースと違って、Druidはオプションでデータをあらかじめ集約することができ、このステップはroll-upと呼ばれ、ストレージを劇的に効率化できる。

image.png

1.5.4 クエリ

クエリはHTTP RequestによるJSONを渡すか、SQLで実行できる。

image.png

1.5.5 アーキテクチャ

1.5.5.1 概念

Druidで重要な処理概念は以下の通りです。

これらは、別々のサーバーでも共有サーバーでもホストすることができる。

名前  概要
Historical historicalデータに対して格納したり、クエリなどの処理をするワーカーである。deep storageからセグメントをダウンロードしてきて、セグメントについてクエリをする。書き込みはしない。
MiddleManager クラスタに入ってくる新しいデータの処理をする。 外部のソースからデータを読み込んで、Druidセグメントをパブする役割を持つ。
Broker クライアントからクエリを受け取って、HistoricalMiddelManagerに転送する。ブローカーがサブクレリの結果を取得すると、それらをマージしてクライアントに戻す。
Coordinator historicalプロセルを監視している。セグメントをどこのサーバーに配置したり、効率よく分散するようにする責任を持つ。
Overload MiddleManagerプロセスとDruidに入ってくるデータを監視している。MiddleManagerのデータ取得タスクや、セグメントパブリッシュの責任を持つ。
Router 図中にはないが、Broker, OverloadなどのAPIのルーティングである。

image.png

また、処理概念とは別に、三つの外部依存性がある。

名前  概念
Deep storage すべてのDruidサーバーからアクセスできる共有ファイルストレージ。Amazon S3やHDFSなどのような分散ファイルストレージである。
Metadata store メタデータを格納していて、一般的にRDBである。

Druidは分散データベースである。 ハードウェアが別でも一緒でもクエリを投げることができる。

クエリの様子を以下のように示す。

image.png

1.5.5.2 データソースとセグメント

DruidのデータはRDBに似ているテーブルに保存されます。

データはチャンクと呼ばれる一定時間でセグメントにパーティション化される。

それぞれのセグメントはたくさんの行を含む単一のファイルである。

  image.png

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でコンソールを確認できます。