ClickHouse作為我們的重要數(shù)據(jù)倉庫棍掐,接收了大量用于統(tǒng)計(jì)、分析的日志拷况。
那么這些數(shù)據(jù)是怎么進(jìn)到ClickHouse的作煌?
在我們內(nèi)部,ELK架構(gòu)用的是比較多的赚瘦,準(zhǔn)確的來講粟誓,是EHK,我們用Hangout替代了傳統(tǒng)的Logstash起意。
因此鹰服,在Hangout的基礎(chǔ)上,我們開發(fā)了針對(duì)ClickHouse的數(shù)據(jù)寫入插件,很輕松的完成海量數(shù)據(jù)的日志接入悲酷。
本文作者@rickyChe套菜,新浪大數(shù)據(jù)開發(fā)工程師,原文地址:Hangout with ClickHouse
當(dāng)我們部門發(fā)現(xiàn)了ClickHouse這么一個(gè)優(yōu)秀數(shù)據(jù)存儲(chǔ)倉庫后设易,經(jīng)過了一段時(shí)間的摸索測試逗柴,就把線上大部分與數(shù)據(jù)分析相關(guān)的業(yè)務(wù)遷移到了ClickHouse上。這篇文章將會(huì)介紹我們?nèi)绾瓮ㄟ^Kafka接入Nginx日志到ClickHouse中顿肺。當(dāng)然戏溺,其他的應(yīng)用日志也可以參照以下邏輯將數(shù)據(jù)接入ClickHouse。
我們最初使用Python腳本清洗日志寫入ClickHouse挟冠,但是這樣開發(fā)和維護(hù)都有一定的成本于购。后來我們使用Hangout作為我們的數(shù)據(jù)清洗工具,Hangout是一個(gè)通用的日志分析工具知染,功能類同Logstash肋僧,可以把不同種類的日志處理后寫入其他的地方,比如Kafka控淡、Elasticsearch嫌吠、ClickHouse。
Prerequisites
我們假設(shè)Nginx日志已經(jīng)推送到了Kafka掺炭。
-
Hangout已經(jīng)提供了大量的插件支持我們的日志處理辫诅,下面是為了完成一個(gè)完整的配置需要另外下載的插件:
- Hangout-output-clickhouse: 專門為ClickHouse開發(fā)的Hangout輸出插件https://github.com/RickyHuo/hangout-output-clickhouse
下面是我們安裝Hangout以及Hangout-output-clickhouse插件的具體步驟:
mkdir hangout
cd hangout
wget https://github.com/childe/hangout/releases/download/0.3.0/hangout-dist-0.3.0-release-bin.zip
unzip hangout-dist-0.3.0-release-bin.zip
cd modules
wget https://github.com/RickyHuo/hangout-output-clickhouse/releases/download/0.0.2/hangout-output-plugins-clickhouse-0.0.2-jar-with-dependencies.jar
Configuration Example: Nginx Logs
Log Sample
001.cms.msina..sinanode.com\`[27/Dec/2017:16:01:03 +0800]\`-\`"GET /n/front/w636h3606893220.jpg/w720q75apl.webp HTTP/1.1"\`"SinaNews/201706071542.1 CFNetwork/758.1.6 Darwin/15.0.0"\`200\`[127.0.0.1]\`-\`"-"\`0.021\`10640\`-\`127.0.0.1\`l.sinaimg.cn\`-
Hangout配置包括三個(gè)部分:inputs、filters和outputs
Input
- 如下所示涧狮,是一個(gè)從Kafka讀取數(shù)據(jù)流的配置
inputs:
- Kafka:
codec: plain
encoding: UTF8 # defaut UTF8
topic:
comos-proxy: 10
consumer_settings:
group.id: hangout_bip_cms
zookeeper.connect: localhost:2181
auto.commit.interval.ms: "60000"
socket.receive.buffer.bytes: "1048576"
fetch.message.max.bytes: "1048576"
Filters
- 在Filters部分炕矮,這里有一系列轉(zhuǎn)化的步驟,包括正則解析者冤、時(shí)間轉(zhuǎn)換肤视、類型轉(zhuǎn)換等
filters:
- Grok:
match:
- '%{NOTSPACE:_hostname}`\[%{HTTPDATE:timestamp}\]`%{NOTSPACE:upstream}`"%{NOTSPACE:_method}\s%{NOTSPACE:_uri}\s%{NOTSPACE:httpversion}"`%{QS:_ua}`%{NUMBER:_http_code}`\[%{IP:_remote_addr}\]`%{NOTSPACE:unknow1}`%{QS:_reference}`%{NUMBER:_request_time}`%{NUMBER:_data_size}`%{NOTSPACE:unknow3}`%{IP:_http_x_forwarded_for}`%{NOTSPACE:_domain}`%{DATA:unknow4}$'
remove_fields: ['message']
- Date:
src: timestamp
formats:
- 'dd/MMM/yyyy:HH:mm:ss Z'
remove_fields: ['timestamp']
target: utc_date
- Convert:
fields:
_request_time:
to: float
- Add:
fields:
date: "${(utc_date)?substring(0, 10)}"
datetime: "${(utc_date)?substring(0, 10) + ' ' + (utc_date)?substring(11, 19)}"
hour: "${(utc_date)?substring(11, 13)}"
- Convert:
fields:
hour:
to: integer
minute:
to: integer
_data_size:
to: integer
Outputs
- 最后我們將處理好的結(jié)構(gòu)化數(shù)據(jù)寫入ClickHouse
outputs:
- com.sina.bip.hangout.outputs.Clickhouse:
host: localhost:8123
database: cms
table: cms_msg_all
fields: ['date', 'datetime','hour', '_hostname', '_domain', '_data_size', '_uri', '_request_time', '_ua', '_http_code', '_remote_addr', '_method', '_reference', '_url']
replace_include_fields: ['_uri', '_url']
bulk_size: 300
ClickHouse Schema
- 當(dāng)然, ClickHouse存儲(chǔ)這些數(shù)據(jù)的前提是我們已經(jīng)建立好了這些數(shù)據(jù)表涉枫。具體建表操作如下:
CREATE TABLE cms.cms_msg
(
date Date,
datetime DateTime,
hour Int8,
_uri String,
_url String,
_request_time Float32,
_http_code String,
_hostname String,
_domain String,
_http_x_forwarded_for String,
_remote_addr String,
_reference String,
_data_size Int32,
_method String,
_rs String,
_rs_time Float32,
_ua String
) ENGINE = MergeTree(date, (hour, date), 8192)
CREATE TABLE cms.cms_msg_all
(
date Date,
datetime DateTime,
hour Int8,
_uri String,
_url String,
_request_time Float32,
_http_code String,
_hostname String,
_domain String,
_http_x_forwarded_for String,
_remote_addr String,
_reference String,
_data_size Int32,
_method String,
_ua String
) ENGINE = Distributed(bip_ck_cluster, 'cms', 'cms_msg', rand())
Conclusion
- 在這篇文章中邢滑,我們介紹了如何使用Hangout將Nginx日志文件寫入ClickHouse中。Hangout從Kafka中讀取原始日志愿汰,將其轉(zhuǎn)換成為結(jié)構(gòu)化的數(shù)據(jù)困后,因此能被我們的Hangout-output-clickhouse插件讀取寫入ClickHouse中。整個(gè)流程還有很多可以自定義和提升的地方衬廷,Hangout使用請(qǐng)參照Hangout README摇予,Hangout-output-clickhouse的更多功能請(qǐng)參照README。此外吗跋,我們?cè)贑lickHouse數(shù)據(jù)的基礎(chǔ)上使用了SuperSet和Grafana作為我們的數(shù)據(jù)展示和監(jiān)控工具侧戴。