要求する
- Druidのスタンドアロンバージョンを起動する
- 他のkafkaまたはバッチインポートではなく、クライアントを介して一部のデータを直接書き込む
研究計画
- ドルイド+静けさを開始
- Druid + Tranquilityのクイックスタート:http : //druid.io/docs/latest/tutorials/tutorial-tranquility.html
- 静けさの倉庫:https : //github.com/druid-io/tranquility
- 静けさを通してドルイドにデータを書き込む
- サンプルコード:https : //github.com/druid-io/tranquility/blob/master/core/src/test/java/com/metamx/tranquility/example/JavaExample.java
- データスキーマ構成ファイル
- druid:http : //druid.io/docs/0.13.0-incubating/ingestion/ingestion-spec.html
- 静けさ:https://github.com/druid-io/tranquility/blob/master/docs/configuration.md
- Tranquillityの構成は、ドルイドの外部のドルイドのいくつかの構成アイテムをカプセル化します
- 静けさの依存関係の問題を部分的に解決する:https : //groups.google.com/forum/#!topic / druid-user / 5afMWd17sbU
ドルイドのスタンドアロン構成
-
公式ウェブサイトのクイックスタート
-
ドルイドをダウンロード
-
Zookeeperをダウンロードして、名前をzkに変更し、Druidのルートディレクトリに配置します。
curl https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz -o zookeeper-3.4.11.tar.gz tar -xzf zookeeper-3.4.11.tar.gz mv zookeeper-3.4.11 zk
-
ドルイドを開始
bin/supervise -c quickstart/tutorial/conf/tutorial-cluster.conf
静けさ
-
Ctrl + Cドルイドを殺す
-
Tranquillityをダウンロードして、Druidのルートディレクトリで実行します。
curl http://static.druid.io/tranquility/releases/tranquility-distribution-0.8.2.tgz -o tranquility-distribution-0.8.2.tgz
tar -xzf tranquility-distribution-0.8.2.tgz
mv tranquility-distribution-0.8.2 tranquility
- quickstart / tutorial / conf / tutorial-cluster.confファイルを変更し、tranquility-server行の前の#を削除します
# Uncomment to use Tranquility Server
!p95 tranquility-server tranquility/bin/tranquility server -configFile quickstart/tutorial/conf/tranquility/wikipedia-server.json -Ddruid.extensions.loadList=[]
- ドルイド+トランキリティを開始
bin/supervise -c quickstart/tutorial/conf/tutorial-cluster.conf
Mavenプロジェクトのサンプル
-
プロジェクトコード:https : //github.com/qiaojialin/TranquilityExample
-
新しいリソースフォルダーを作成する
-
その中に新しいファイルを作成します
example.json
::{ "dataSources": [ { "spec": { "dataSchema": { "dataSource": "wikipedia", "parser": { "type": "string", "parseSpec": { "format": "json", "timestampSpec": { "column": "timestamp", "format": "auto" }, "dimensionsSpec": { "dimensions": [ "page", "language", "user", "unpatrolled", "newPage", "robot", "anonymous", "namespace", "continent", "country", "region", "city" ], "dimensionExclusions": [], "spatialDimensions": [] } } }, "metricsSpec": [ { "type": "count", "name": "count" }, { "type": "doubleSum", "name": "added", "fieldName": "added" }, { "type": "doubleSum", "name": "deleted", "fieldName": "deleted" }, { "type": "doubleSum", "name": "delta", "fieldName": "delta" } ], "granularitySpec": { "type": "uniform", "segmentGranularity": "DAY", "queryGranularity": "NONE" } }, "tuningConfig": { "type": "realtime", "maxRowsInMemory": 100000, "intermediatePersistPeriod": "PT10m", "windowPeriod": "PT10M" } } } ], "properties": { "zookeeper.connect": "localhost:2181", "druid.selectors.indexing.serviceName": "druid/overlord", "druid.discovery.curator.path": "/druid/discovery", "druidBeam.taskLocator": "overlord", "druidBeam.overlordPollPeriod": "PT5S" } }
-
サンプルコード
import com.google.common.collect.ImmutableMap; import com.metamx.common.logger.Logger; import com.metamx.tranquility.config.DataSourceConfig; import com.metamx.tranquility.config.PropertiesBasedConfig; import com.metamx.tranquility.config.TranquilityConfig; import com.metamx.tranquility.druid.DruidBeams; import com.metamx.tranquility.tranquilizer.MessageDroppedException; import com.metamx.tranquility.tranquilizer.Tranquilizer; import com.twitter.util.FutureEventListener; import org.joda.time.DateTime; import scala.runtime.BoxedUnit; import java.io.InputStream; import java.util.Map; public class JavaExample { private static final Logger log = new Logger(JavaExample.class); public static void main(String[] args) { // Read config from "example.json" on the classpath. final InputStream configStream = JavaExample.class.getClassLoader().getResourceAsStream("example.json"); final TranquilityConfig<PropertiesBasedConfig> config = TranquilityConfig.read(configStream); final DataSourceConfig<PropertiesBasedConfig> wikipediaConfig = config.getDataSource("wikipedia"); final Tranquilizer<Map<String, Object>> sender = DruidBeams.fromConfig(wikipediaConfig) .buildTranquilizer(wikipediaConfig.tranquilizerBuilder()); sender.start(); try { // Send 10000 objects for (int i = 0; i < 10000; i++) { // Build a sample event to send; make sure we use a current date final Map<String, Object> obj = ImmutableMap.<String, Object>of( "timestamp", new DateTime().toString(), "page", "foo", "added", i ); // Asynchronously send event to Druid: sender.send(obj).addEventListener( new FutureEventListener<BoxedUnit>() { @Override public void onSuccess(BoxedUnit value) { log.info("Sent message: %s", obj); } @Override public void onFailure(Throwable e) { if (e instanceof MessageDroppedException) { log.warn(e, "Dropped message: %s", obj); } else { log.error(e, "Failed to send message: %s", obj); } } } ); } } finally { sender.flush(); sender.stop(); } } }
-
依存関係を追加します(この手順は最悪です)
- ジャクソンのスカラーと静けさの両方が2.11であることを確認してください
- jackson-2.9.2は問題ありません、2.9.8は問題あり、他のバージョンは試されていません
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.11</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.metamx</groupId> <artifactId>java-util</artifactId> <version>0.27.9</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>io.druid</groupId> <artifactId>tranquility-core_2.11</artifactId> <version>0.8.2</version> </dependency>
-
上記はクリーンなプロジェクトでテストされました。私の別のプロジェクトでは、どの競合が発生するのかわかりません。もう一度方法が見つからないため、さらに3つの依存関係を追加しました。
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.11</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.2</version> </dependency>
その他の穴
依存関係は最悪ではありません。昨日はデータを書き込むことができましたが、今日は書き込むことができません。さまざまなMessageDroppedExceptionsはインターネットのタイムウィンドウの問題であると言われており、日付を調整することは無意味です。
最大の落とし穴は、Tranquillityがサポートしているのは一定期間のデータ書き込みのみであり、これは非常に不快であるため、諦めてKafkaインデックスサービスに切り替える準備をしました。