本文借助Filebeat、Kafka、CLickHouse将日志流式转换为关系型数据库表。
环境:Ubuntu 18.04 (WSL)
1. 安装kafka-2.8.0单机版
1.1 环境搭建
版本要求:jdk至少在1.8.0以上。本机安装版本为jdk-11。
下载方式:压缩包及解压缩,本机安装在/usr/local目录下
国内镜像:https://mirrors.huaweicloud.com/java/jdk/
配置文件:
- sudo vim /etc/profile 或者在root权限下 vim /etc/profile
- 配置profile
export JAVA_HOME=/usr/local/jdk-11
export PATH=$PATH:$JAVA_HOME/bin
- jdk-11没有jre包,无需额外配置
- source /etc/profile 配置完成后刷新,每次切换用户都需刷新
- java – version检查安装是否成功
1.2 安装kafka
下载方式:压缩包及解压缩。本机安装在/app目录下。
tar zxvf kafka_2.13-2.8.0.tgz #解压
mv kafka_2.13-2.8.0 kafka_2.8.0 #改名
pwd #检查路径
1.3 启动kafka
无需启动zookeeper直接运行kafka
- 随机生成id
cd /app/kafka_2.8.0 #进入解压后的kafka所在目录
./bin/kafka-storage.sh random-uuid
返回 xtzWWN4bTjitpL3kfd9s5g
2. 用返回的字符串替换uuid
./bin/kafka-storage.sh format -t <uuid> -c ./config/kraft/server.properties
返回 Formatting /tmp/kraft-combined-logs
3. 启动kafka
./bin/kafka-server-start.sh ./config/kraft/server.properties
没有报错则启动成功
4. 关闭kafka
jps查看kafka的进程号,kill -9 <kafka 进程号>
1.4 创建topic
- 创建topic
./bin/kafka-topics.sh --create --topic foo --bootstrap-server localhost:9092
返回 created topic foo. 则说明创建成功。
2. 生产者产生消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic foo
可以在>后输入需要的消息,如下
3. 消费者消费消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic foo --from-beginning
返回消息如下
2. Filebeat安装
下载方式:压缩包及解压缩。本机安装在/app目录下。
2.1 修改filebeat.yml文件配置
进入filebeat目录下
- input配置调整 vim filebeat.yml
修改input的输入路径,其中
enabled: true
paths:
/app/logs/test.log
#在app目录下创建文件夹logs,并生成test.log测试
2.output配置
同时注释其他几种输出形式,如elasticsearch。
output.kafka:
enable: true
hosts: ["localhost:9092"]
topic: foo
其中topic:需要和kafka中建立的topic保持一致。
2.2 启动filebeat
./filebeat -e -c filebeat.yml
没有报错即启动成功,filebeat实时滚动。
3 安装clickhouse
本机已下载clickhouse软件。可参考
https://clickhouse.tech/docs/zh/getting-started/install/
2.1 启动clickhouse
切换成sudo su用户或者
sudo service clickhouse-server start
clickhouse-client
2.2 创建消费表
CREATE TABLE datarest_kafka (
CONTENT String
) ENGINE = Kafka SETTINGS kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'foo',
kafka_group_name = 'test-consumer-group',
kafka_format = 'TabSeparated',
kafka_num_consumers = 1;
注:表引擎采用kafka
kafka_broker_list:kafka 的连接地址和端口。
kafka_topic_list:kafka 的 topic 名。
kafka_group_name:kafka 的组名。
kafka_format:表示用于解析消息的数据格式,消息发送端必须按此格式发送消息。
kafka_num_consumers = 1; 消费者数量
结果:查一次消费表,则消费一次内容,消费表中的内容消失。数据被存储到存储表中。
2.3 创建存储表
CREATE TABLE datarest (
timestamp String,
message String,
id String
) ENGINE = MergeTree ORDER BY xxHash64(id) SAMPLE BY xxHash64(id);
具体的sql查询语句根据读取的日志内容修改。
2.4 创建视图
CREATE MATERIALIZED VIEW datarest_view TO datarest
AS SELECT JSONExtractString(CONTENT,'@timestamp') as timestamp,JSONExtractString(CONTENT,'message') as message, JSONExtractString(JSONExtractRaw(CONTENT,'host'),'id') as id
FROM datarest_kafka;
具体的sql查询语句根据读取的日志内容修改。
结果:在test.log输入内容,最后可以在clickhouse中查询到格式化的json形式。