Hangout with ClickHouse

转载自::https://blog.csdn.net/bluetjs/article/details/80325820

https://www.jianshu.com/p/a104ff60f574

ClickHouse作为我们的重要数据仓库,接收了大量用于统计、分析的日志。

那么这些数据是怎么进到ClickHouse的?

在我们内部,ELK架构用的是比较多的,准确的来讲,是EHK,我们用Hangout替代了传统的Logstash。

因此,在Hangout的基础上,我们开发了针对ClickHouse的数据写入插件,很轻松的完成海量数据的日志接入。

本文作者@rickyChe,新浪大数据开发工程师,原文地址: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:
        - <span class="hljs-string">'dd/MMM/yyyy:HH:mm:ss Z'</span>
    remove_fields: [<span class="hljs-string">'timestamp'</span>]
    target: utc_date

- Convert:
    fields:
        _request_time:
            to: <span class="hljs-built_in">float</span>
              
- Add:
    fields:
        date: <span class="hljs-string">"<span class="hljs-variable">${(utc_date)?substring(0, 10)}</span>"</span>
        datetime: <span class="hljs-string">"<span class="hljs-variable">${(utc_date)?substring(0, 10) + ' ' + (utc_date)?substring(11, 19)}</span>"</span>
        hour: <span class="hljs-string">"<span class="hljs-variable">${(utc_date)?substring(11, 13)}</span>"</span>

- Convert:
    fields:
        hour:
            to: <span class="hljs-built_in">integer</span>
        minute:
            to: <span class="hljs-built_in">integer</span>
        _data_size:
            to: <span class="hljs-built_in">integer</span>

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作为我们的数据展示和监控工具。


作者:JackpGao
链接: https://www.jianshu.com/p/a104ff60f574
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值