Druid.io通過NiFi攝取流資料

Gin.p發表於2018-06-23

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資料來源

關鍵軟體

2、攝取步驟

軟體安裝

略。網上可查,問題不大。

整體流程圖

Druid.io通過NiFi攝取流資料

資料來源

2.1、之所以選用IPProxyTool,一是資料返回json,二是較短時間可以產生新的資料。如果有更好的模擬資料,可以替換這個資料來源。
Druid.io通過NiFi攝取流資料
schedule的tab頁改為10s,即10s後同步一次資料。
Druid.io通過NiFi攝取流資料

2.1、轉換json
使用AttributesToJSON提取相關的json欄位。
Druid.io通過NiFi攝取流資料

2.2、提取json
EvaluateJsonPath只提取json陣列中第一個json物件。Druid不接受json陣列,相關Druid資料格式支援http://druid.io/docs/0.12.1/ingestion/data-formats.html
Druid.io通過NiFi攝取流資料

2.3、扁平化json
ReplaceText將格式化的json轉為單行的json。Druid不能識別格式化的json,相關Druid資料格式支援http://druid.io/docs/0.12.1/ingestion/data-formats.html
Druid.io通過NiFi攝取流資料

2.4、輸出資料到kafka
Druid.io通過NiFi攝取流資料

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)

相關文章