NiFi是一個易於使用,功能強大且可靠的系統來處理和分發資料。
本文講述如何用NiFi將Http的Json資料傳到Druid。國外的一篇文章講到如何用NiFi將推文傳到Druid,https://community.hortonworks.com/articles/177561/streaming-tweets-with-nifi-kafka-tranquility-druid.html,資料來源稍有不同,但是走下來的流程大同小異,國情的原因我們使用自己Http來源代替:)
1、系統和環境
系統環境
- centos7
- jdk1.8.0_131
Http資料來源
關鍵軟體
- NiFi.1.2.0漢化版
- Druid.0.12.0
- tranquility.0.8.0
2、攝取步驟
軟體安裝
略。網上可查,問題不大。
整體流程圖
資料來源
2.1、之所以選用IPProxyTool,一是資料返回json,二是較短時間可以產生新的資料。如果有更好的模擬資料,可以替換這個資料來源。
schedule的tab頁改為10s,即10s後同步一次資料。
2.1、轉換json
使用AttributesToJSON提取相關的json欄位。
2.2、提取json
EvaluateJsonPath只提取json陣列中第一個json物件。Druid不接受json陣列,相關Druid資料格式支援http://druid.io/docs/0.12.1/ingestion/data-formats.html
2.3、扁平化json
ReplaceText將格式化的json轉為單行的json。Druid不能識別格式化的json,相關Druid資料格式支援http://druid.io/docs/0.12.1/ingestion/data-formats.html
2.4、輸出資料到kafka
2.5、kafka建立新的主題
cd /opt/kafka
# 啟動kafka
./bin/kafka-server-start.sh config/server.properties
./kafka-topics.sh --create \
--zookeeper localhost:2181 \
--replication-factor 1 \
--partitions 1 \
--topic proxypool
2.6、建立Druid流任務json
{
"dataSources" : {
"proxypool" : {
"spec" : {
"dataSchema" : {
"dataSource" : "proxypool",
"parser" : {
"type" : "string",
"parseSpec" : {
"timestampSpec" : {
"column" : "save_time",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"dimensionsSpec" : {
"dimensions" : [
"ip",
"port",
"https",
"anonymity",
"id"
]
},
"format" : "json"
}
},
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "day",
"queryGranularity" : "none"
},
"metricsSpec" : [
{
"name" : "count",
"type" : "count"
},
{
"name" : "speed",
"type" : "doubleSum",
"fieldName" : "speed"
}
]
},
"ioConfig" : {
"type" : "realtime"
},
"tuningConfig" : {
"type" : "realtime",
"maxRowsInMemory" : "100000",
"intermediatePersistPeriod" : "PT10M",
"windowPeriod" : "PT720000M"
}
},
"properties" : {
"task.partitions" : "1",
"task.replicants" : "1",
"topicPattern" : "proxypool"
}
}
},
"properties" : {
"zookeeper.connect" : "localhost:2181",
"druid.discovery.curator.path" : "/druid/discovery",
"druid.selectors.indexing.serviceName" : "druid/overlord",
"commit.periodMillis" : "15000",
"consumer.numThreads" : "2",
"kafka.zookeeper.connect" : "localhost:2181",
"kafka.group.id" : "tranquility-kafka"
}
}
複製這個json到:
cp proxypool-kafka.json /opt/druid/conf-quickstart/tranquility/
2.7、安裝tranquility
cd /opt/druid/conf-quickstart/tranquility
curl -O http://static.druid.io/tranquility/releases/tranquility-distribution-0.8.0.tgz
tar xzvf tranquility-distribution-0.8.0.tgz
tranquility-distribution-0.8.0
cd tranquility-distribution-0.8.0/
bin/tranquility kafka -configFile ../proxypool-kafka.json
在NiFi右鍵執行,Druid就能間隔10s攝取Http的資料了:)
轉換json的步驟可以視情況去掉(例如非json陣列或者非格式化的json)