一、数据采集
1.1 环境
- Zookeeper集群
- kafka集群
- flume集群
1.2 zookeeper环境搭建
1.2.1 zookeeper的基本概念
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。
1.2.2 zookeeper的集群规划
服务器 hadoop102 | 服务器 hadoop103 | 服务器 hadoop104 | |
---|---|---|---|
Zookeeper | Zookeeper | Zookeeper | Zookeeper |
具体安装:大数据-zookeeper学习
**注:**群起脚本记得放在/usr/bin下面,然后给执行权限就可以了
- 启动
zk.sh start
- 停止
zk.sh stop
- 查看状态
zk.sh status
1.3 kafka环境搭建
1.3.1 Kafka 集群安装
服务器 hadoop102 | 服务器 hadoop103 | 服务器 hadoop104 | |
---|---|---|---|
Kafka | Kafka | Kafka | Kafka |
**注:**群起脚本记得放在/usr/bin下面,然后给执行权限就可以了
- 启动
kafka.sh start
- 停止
kafka.sh stop
1.3.2 Kafka 常用命令
- 查看 Kafka Topic 列表
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --list
- 创建 Kafka Topic
进入到/opt/module/kafka/目录下创建日志主题
bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka \
--create --replication-factor 1 --partitions 1 --topic topic_log
- 删除 Kafka Topic
bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka \
--delete --topic topic_log
- Kafka 生产消息
bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic topic_log
- Kafka 消费消息
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --from-beginning --topic topic_log
- 查看 Kafka Topic 详情
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka \
--describe --topic topic_log
1.3.3 项目经验之Kafka 压力测试
- Kafka 压测
用 Kafka 官方自带的脚本,对 Kafka 进行压测。Kafka 压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络 IO)。一般都是网络 IO 达到瓶颈。
- kafka-consumer-perf-test.sh
- kafka-producer-perf-test.sh
- Kafka Producer 压力测试
(1)在/opt/module/kafka/bin 目录下面有这两个文件。我们来测试一下
./kafka-producer-perf-test.sh --topic test --record-size 100 --num-records 100000 --throughput -1 \
> --producer-props bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
说明:
- record-size 是一条信息有多大,单位是字节。
- num-records 是总共发送多少条信息。
- throughput 是每秒多少条信息,设成 -1,表示不限流,可测出生产者最大吞吐量。
(2)Kafka 会打印下面的信息
参数解析:本例中一共写入 10w 条消息,吞吐量为 4.05MB/sec,每次写入的平均延迟为1121 毫秒,最大的延迟为 1498 毫秒。
- Kafka Consumer 压力测试
Consumer 的测试,如果这四个指标(IO,CPU,内存,网络)都不能改变,考虑增加分区数来提升性能。
./kafka-consumer-perf-test.sh --broker-list hadoop102:9092,hadoop103:9092,hadoop104:9092 --topic test --fetch-size 10000 \
> --messages 10000000 -threads 1
参数说明:
–zookeeper 指定 zookeeper 的链接信息
–topic 指定 topic 的名称
–fetch-size 指定每次 fetch 的数据的大小
–messages 总共要消费的消息个数
1.3.4 项目经验之Kafka 机器数量计算
Kafka 机器数量(经验公式)=2*(峰值生产速度副本数/100)+1
先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署 Kafka 的数量。比如我们的峰值生产速度是 50M/s。副本数为 2。
Kafka 机器数量=2(50*2/100)+ 1=3 台
1.3.5 项目经验值Kafka 分区数计算
- 创建一个只有 1 个分区的 topic
- 测试这个 topic 的 producer 吞吐量和 consumer 吞吐量。
- 假设他们的值分别是 Tp 和 Tc,单位可以是 MB/s。
- 然后假设总的目标吞吐量是 Tt,那么分区数=Tt / min(Tp,Tc)
例如:producer 吞吐量=20m/s;consumer 吞吐量=50m/s,期望吞吐量 100m/s;分区数=100 / 20 =5 分区 https://blog.csdn.net/weixin_42641909/article/details/89294698
分区数一般设置为:3-10 个
1.4 采集日志 Flume
1.4.1 flume集群规划
服务器 hadoop102 | 服务器 hadoop103 | 服务器 hadoop104 | |
---|---|---|---|
Flume(采集日志) | Flume收集 | Flume收集 | Flume消费 |
解压到:/opt/module/flume
1.4.2 日志采集Flume 配置
-
配置分析
注: Flume 直接读 log 日志的数据,log 日志的格式是 app.yyyy-mm-dd.log。 -
Flume 的具体配置如下:
(1)在/opt/module/flume/conf 目录下创建 file-flume-kafka.conf 文件
vim file-flume-kafka.conf
#为各组件命名
a1.sources = r1
a1.channels = c1
#描述 source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
# 这个是生成日志的文件夹
a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*
a1.sources.r1.positionFile = /opt/module/flume/taildir_position.json
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.wcx.flume.interceptor.LogInterceptor$Builder
#描述 channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092
a1.channels.c1.kafka.topic = topic_log
a1.channels.c1.parseAsFlumeEvent = false
#绑定 source 和 channel 以及 sink 和 channel 的关系
a1.sources.r1.channels = c1
**注意:**com.atguigu.flume.interceptor.ETLInterceptor 是自定义的拦截器的全类名。需要根据用户自定义的拦截器做相应修改
源码:gitee
- 打包
- 需要先将打好的包放入到 hadoop102 的/opt/module/flume/lib 文件夹下面。
- 分发 Flume 到 hadoop103、hadoop104
- 分别在 hadoop102、hadoop103 上启动 Flume
1.4.3 日志采集Flume 启动停止脚本
- 在/usr/bin 目录下创建 flume.sh 脚本
vim flume.sh
脚本内容:
#! /bin/bash
case $1 in
"start") {
for i in hadoop102 hadoop103;
do
echo " --------启动 $i 采集 flume-------"
ssh $i "nohup /opt/module/flume/bin/flume-ng agent --conf-file /opt/module/flume/conf/file-flume-kafka.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume/log1.txt 2>&1 &"
done
};;
"stop") {
for i in hadoop102 hadoop103;
do
echo " --------停止 $i 采集 flume-------"
ssh $i "ps -ef | grep file-flume-kafka | grep -v grep |awk '{print \$2}' | xargs -n1 kill -9 "
done
};;
esac
- 说明 1:nohup,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup
就是不挂起的意思,不挂断地运行命令。 - 说明 2:awk 默认分隔符为空格
- 说明 3:xargs 表示取出前面命令运行的结果,作为后面命令的输入参数。
- 脚本使用
- flume启动
flume.sh start
- flume停止
flume.sh stop
二、数据采集
2.1 Flume消费Kafka中的数据
2.1.1 Flume 配置分析
2.1.2 Flume 的具体配置
- 在 hadoop104 的/opt/module/flume/conf 目录下创建 kafka-flume-hdfs.conf 文件
vim kafka-flume-hdfs.conf
## 组件
a1.sources = r1
a1.channels = c1
a1.sinks = k1
## source1
a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.r1.batchSize = 5000
a1.sources.r1.batchDurationMillis = 2000
a1.sources.r1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.sources.r1.kafka.topics = topic_log
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.wcx.flume.interceptor.TimeStampInterceptor$Builder
## channel1
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint/behavior1
a1.channels.c1.dataDirs = /opt/module/flume/data/behavior1/
a1.channels.c1.maxFileSize = 2146435071
a1.channels.c1.capacity = 1000000
a1.channels.c1.keep-alive = 6
## sink1
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_log/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix = log-
a1.sinks.k1.hdfs.round = false
a1.sinks.k1.hdfs.rollInterval = 10
a1.sinks.k1.hdfs.rollSize = 134217728
a1.sinks.k1.hdfs.rollCount = 0
## 控制输出文件是原生文件。
a1.sinks.k1.hdfs.fileType = CompressedStream
a1.sinks.k1.hdfs.codeC = lzop
## 拼装
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2.1.3 日志消费Flume 启动停止脚本
- 在 /usr/bin 创建 flume-c.sh
vim flume-c.sh
- 在脚本中写入内容:
#! /bin/bash
case $1 in
"start") {
for i in hadoop104;
do
echo " --------启动 $i 消费 flume-------"
ssh $i "nohup /opt/module/flume/bin/flume-ng agent --conf-file /opt/module/flume/conf/kafka-flume-hdfs.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume/log2.txt 2>&1 &"
done
};;
"stop") {
for i in hadoop104;
do
echo " --------停止 $i 消费 flume-------"
ssh $i "ps -ef | grep kafka-flume-hdfs | grep -v grep|awk '{print \$2}' | xargs -n1 kill"
done
};;
esac
- 增加脚本执行权限
chmod 777 flume-c.sh
- 集群启动脚本
flume-c.sh start
- 集群停止脚本
flume-c.sh stop
2.1.4 项目经验之Flume 内存优化
- 问题描述:如果启动消费 Flume 抛出如下异常
- 解决方案步骤:
(1)在 hadoop102 服务器的/opt/module/flume/conf/flume-env.sh 文件中增加如下配置
(2)同步配置到 hadoop103、hadoop104 服务器
xsync flume-env.sh
- Flume 内存参数设置及优化
JVM heap 一般设置为 4G 或更高
-Xmx 与-Xms 最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁 fullgc。
-Xms 表示 JVM Heap(堆内存)最小尺寸,初始分配;-Xmx 表示 JVM Heap(堆内存)最大允许的尺寸,按需分配。如果不设置一致,容易在初始化时,由于内存不够,频繁触发 full gc。
2.2 采集通道启动/停止脚本
2.2.1 数据通道测试
- 资源包上传
这个上传的jar包,用于生成行为日志:
- 这个是生成日志的文件夹
a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*
所以只需要在这个目录下生成日志就会被flume采集,会将数据放在kafka中,然后通过hadoop104上面的flume会去读取kafka中的数据,然后写到hdfs中:
a1.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_log/%Y-%m-%d
- 测试
采集的日志最后会到hdfs的目录下,然后测:
- 修改 application.properties
logging.level.root=info
#业务日期
mock.date=2020-06-18
#启动次数
mock.startup.count=100
#设备最大值
mock.max.mid=50
#会员最大值
mock.max.uid=500
#商品最大值
mock.max.sku-id=10
#页面平均访问时间
mock.page.during-time-ms=20000
#错误概率
mock.error.rate=3
#日志发送延迟
mock.log.sleep=100
#商品详情来源 用户查询,商品推广,智能推荐, 促销活动
mock.detail.source-type-rate=40:25:15:20
- 日志生成脚本:lg.sh
#!/bin/bash
for i in hadoop102 hadoop103;
do
echo "============= $i ============"
ssh $i "cd /opt/module/applog/; java -jar gmall2020-mock-log-2020-04-01.jar >/dev/null 2>&1 &"
done
- 启动flume
- 生成日志
执行脚本 lg.sh
lg.sh
2020-06-18那天的数据就上传成功了;
整个日志采集就完成了
总结
整个日志采集都是为了进行用户的行为分析,比如在哪个页面做了哪些事情,经常在什么时候登录系统等,而采集的日志,整个流程都是为了将日志上传到hdfs,给后续hive使用
感谢大家阅、互相学习;
感谢尚硅谷提供的学习资料;
有问题评论或者发邮箱;
gitee:很多代码仓库;
[email protected]