入門
本教程介紹如何將自己的流數據加載到Druid。
在本教程中,我們假設您已經按照快速入門中所述下載了Druid和Tranquility,并將其在本機上運行。并且您不需要事先加載任何數據。
完成后,您可以通過編寫自定義數據提取規范來加載自己的數據集。
編寫數據提取規范
當使用流進行數據加載,推薦使用Stream Push方式。在本教程中使用Tranquility 通過HTTP將數據推送到Druid。
本教程將介紹如何通過HTTP將數據流推送到Druid,但Druid還支持各類批處理和流式加載方法。查看Loading files 和 Loading streams頁面來了解其它方法的更多消息,包括Hadoop、Kafka, Storm、Samza、Spark Streaming和您自己的JVM應用。
你可以按照需求修改conf-quickstart/tranquility/server.json配置文件,來自定義Tranquility Server配置,通過HTTP加載新的數據集。
配置文件中有幾項需要特別關注:
{
"dataSources" : {
"metrics" : {
"spec" : {
"dataSchema" : {
//1.使用的數據集
"dataSource" : "metrics",
"parser" : {
"type" : "string",
"parseSpec" : {
//2.哪個字段是timestamp
"timestampSpec" : {
"column" : "timestamp",
"format" : "auto"
},
"dimensionsSpec" : {
//3.哪些字段需要當成維度處理
"dimensions" : [],
"dimensionExclusions" : [
"timestamp",
"value"
]
},
"format" : "json"
}
},
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "hour",
"queryGranularity" : "none"
},
//4.哪些字段需要當成度量進行處理
"metricsSpec" : [
{
"type" : "count",
"name" : "count"
},
{
"name" : "value_sum",
"type" : "doubleSum",
"fieldName" : "value"
},
{
"fieldName" : "value",
"name" : "value_min",
"type" : "doubleMin"
},
{
"type" : "doubleMax",
"name" : "value_max",
"fieldName" : "value"
}
]
},
"ioConfig" : {
"type" : "realtime"
},
"tuningConfig" : {
"type" : "realtime",
"maxRowsInMemory" : "100000",
"intermediatePersistPeriod" : "PT10M",
"windowPeriod" : "PT10M"
}
},
"properties" : {
"task.partitions" : "1",
"task.replicants" : "1"
}
}
},
"properties" : {
"zookeeper.connect" : "localhost",
"druid.discovery.curator.path" : "/druid/discovery",
"druid.selectors.indexing.serviceName" : "druid/overlord",
"http.port" : "8200",
"http.threads" : "8"
}
}
下面用一個pageviews(瀏覽量)的json作為示例:
{"time": "2000-01-01T00:00:00Z", "url": "/foo/bar", "user": "alice", "latencyMs": 32}
所以對于這個例子上述四個問題的答案是:
- 數據集就是pageviews
- time字段是timestamp
- 可以用url和user作為維度
- 度量可以是計算pageviews計數,和latencyMs字段求和。在數據接收階段求和,也能在查詢的時候快速方便的求平均值。
所以配置文件修改后
{
"dataSources" : {
"metrics" : {
"spec" : {
"dataSchema" : {
//1.使用的數據集
"dataSource" : "pageviews",
"parser" : {
"type" : "string",
"parseSpec" : {
//2.哪個字段是timestamp
"timestampSpec" : {
"column" : "time",
"format" : "auto"
},
"dimensionsSpec" : {
//3.哪些字段需要當成維度處理
"dimensions" : ["url", "user"],
"dimensionExclusions" : [
"timestamp",
"value"
]
},
"format" : "json"
}
},
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "hour",
"queryGranularity" : "none"
},
//4.哪些字段需要當成度量進行處理
"metricsSpec" : [
{
"name": "views",
"type": "count"
},
{
"name": "latencyMs",
"type": "doubleSum",
"fieldName": "latencyMs"
}
]
},
"ioConfig" : {
"type" : "realtime"
},
"tuningConfig" : {
"type" : "realtime",
"maxRowsInMemory" : "100000",
"intermediatePersistPeriod" : "PT10M",
"windowPeriod" : "PT10M"
}
},
"properties" : {
"task.partitions" : "1",
"task.replicants" : "1"
}
}
},
"properties" : {
"zookeeper.connect" : "localhost",
"druid.discovery.curator.path" : "/druid/discovery",
"druid.selectors.indexing.serviceName" : "druid/overlord",
"http.port" : "8200",
"http.threads" : "8"
}
}
重啟服務
停止Tranquility(CTRL-C)并重新啟動,來獲取新的配置文件并生效。
發送數據
發送測試數據如下:
{"time": "2000-01-01T00:00:00Z", "url": "/foo/bar", "user": "alice", "latencyMs": 32}
{"time": "2000-01-01T00:00:00Z", "url": "/", "user": "bob", "latencyMs": 11}
{"time": "2000-01-01T00:00:00Z", "url": "/foo/bar", "user": "bob", "latencyMs": 45}
Druid流處理需要相對當前(準實時)的數據,相而言windowPeriod值控制的是更寬松的時間窗口(也就是流處理會檢查數據timestamp的值,而時間窗口只關注數據接收的時間)。所以需要將2000-01-01T00:00:00Z轉換為ISO8601格式的當前系統時間,你可以用以下命令轉換:
python -c 'import datetime; print(datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"))'
用輸出的時間將上述的json示例的timestamps更新,并且保存到pageviews.json文件里。 通過下面命令將數據發送到Druid:
curl -XPOST -H'Content-Type: application/json' --data-binary @pageviews.json http://localhost:8200/v1/post/pageviews
然后你會看到屏幕輸出如下:
{"result":{"received":3,"sent":3}}
這表明HTTP服務接收了三條事件,并且發送了三條到Druid。因為需要分配Druid給ingestion 任務,所以初次運行可能會消耗幾秒鐘時間。但是后續查詢請求就會變得很快了。
如果你看到是"sent":0,很有可能是時間戳(timestamps)不夠新,再次更新時間戳并且重新發送。
數據查詢
數據發送后就可以馬上進行數據查詢了,詳見Druid查詢
進一步閱讀
想了解更多Druid流處理,詳見streaming ingestion documentation
原文鏈接:http://druid.io/docs/0.9.2/tutorials/tutorial-streams.html