Hangout with ClickHouse

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/huochen1994/article/details/78913626

Hangout with ClickHouse

當我們部門發現了ClickHouse這麼一個優秀數據存儲倉庫後,經過了一段時間的摸索測試,就把線上大部分與數據分析相關的業務遷移到了ClickHouse上。這篇文章將會介紹我們如何將Kafka中的Nginx日誌接入到ClickHouse中,並以此介紹我們的數據接入經驗。當然,其他的應用日誌也可以參照以下邏輯將數據接入ClickHouse。

我們最初使用Python腳本清洗日誌寫入ClickHouse,但是這樣開發和維護都有一定的成本並且寫入性能無法達到預期。後來我們使用Hangout作爲我們的數據清洗工具,Hangout是一個通用的日誌處理工具,功能類同Logstash,可以把不同種類的日誌處理後寫入其他的地方,比如Kafka、Elasticsearch、ClickHouse。

Prerequisites

我們假設Nginx日誌已經推送到了Kafka。

Hangout已經提供了大量的插件支持我們的日誌處理,下面是爲了完成一個完整的配置需要另外下載的插件:

下面是我們安裝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配置包括三個部分:inputs、filters和outputs

Input

如下所示,是一個從Kafka讀取數據流的配置

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部分,這裏有一系列轉化的步驟,包括正則解析、時間轉換、類型轉換等

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

最後我們將處理好的結構化數據寫入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

當然, ClickHouse存儲這些數據的前提是我們已經建立好了這些數據表。具體建表操作如下:

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中讀取原始日誌,將其轉換成爲結構化的數據,因此能被我們的Hangout-output-clickhouse插件讀取寫入ClickHouse中。整個流程還有很多可以自定義和提升的地方,Hangout使用請參照Hangout README,Hangout-output-clickhouse的更多功能請參照README。此外,我們在ClickHouse數據的基礎上使用了SuperSet和Grafana作爲我們的數據展示和監控工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章