一、数据采集

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 常用命令

  1. 查看 Kafka Topic 列表
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --list
  1. 创建 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
  1. 删除 Kafka Topic
bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka \
--delete --topic topic_log
  1. Kafka 生产消息
bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic topic_log
  1. Kafka 消费消息
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --from-beginning --topic topic_log 
  1. 查看 Kafka Topic 详情
bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka \
--describe --topic topic_log

1.3.3 项目经验之Kafka 压力测试

  1. Kafka 压测
    用 Kafka 官方自带的脚本,对 Kafka 进行压测。Kafka 压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络 IO)。一般都是网络 IO 达到瓶颈。
  • kafka-consumer-perf-test.sh
  • kafka-producer-perf-test.sh
  1. 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 毫秒。
大数据-日志数据采集(三)_hdfs

  1. 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 总共要消费的消息个数

大数据-日志数据采集(三)_hadoop_02

1.3.4 项目经验之Kafka 机器数量计算

Kafka 机器数量(经验公式)=2*(峰值生产速度副本数/100)+1
先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署 Kafka 的数量。比如我们的峰值生产速度是 50M/s。副本数为 2。
Kafka 机器数量=2
(50*2/100)+ 1=3 台

1.3.5 项目经验值Kafka 分区数计算

  1. 创建一个只有 1 个分区的 topic
  2. 测试这个 topic 的 producer 吞吐量和 consumer 吞吐量。
  3. 假设他们的值分别是 Tp 和 Tc,单位可以是 MB/s。
  4. 然后假设总的目标吞吐量是 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消费

大数据-日志数据采集(三)_zookeeper_03
解压到:/opt/module/flume

1.4.2 日志采集Flume 配置

  1. 配置分析
    大数据-日志数据采集(三)_服务器_04
    注: Flume 直接读 log 日志的数据,log 日志的格式是 app.yyyy-mm-dd.log。

  2. 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

  1. 打包
    大数据-日志数据采集(三)_服务器_05
  • 需要先将打好的包放入到 hadoop102 的/opt/module/flume/lib 文件夹下面。
  • 分发 Flume 到 hadoop103、hadoop104
  • 分别在 hadoop102、hadoop103 上启动 Flume

1.4.3 日志采集Flume 启动停止脚本

  1. 在/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 表示取出前面命令运行的结果,作为后面命令的输入参数。
  1. 脚本使用
  • flume启动
flume.sh start
  • flume停止
flume.sh stop

二、数据采集

2.1 Flume消费Kafka中的数据

2.1.1 Flume 配置分析

大数据-日志数据采集(三)_服务器_06

2.1.2 Flume 的具体配置

  1. 在 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 启动停止脚本

  1. 在 /usr/bin 创建 flume-c.sh
vim flume-c.sh
  1. 在脚本中写入内容:
#! /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
  1. 增加脚本执行权限
chmod 777 flume-c.sh
  1. 集群启动脚本
flume-c.sh start
  1. 集群停止脚本
flume-c.sh stop

2.1.4 项目经验之Flume 内存优化

  1. 问题描述:如果启动消费 Flume 抛出如下异常
  2. 解决方案步骤:
    (1)在 hadoop102 服务器的/opt/module/flume/conf/flume-env.sh 文件中增加如下配置
    (2)同步配置到 hadoop103、hadoop104 服务器
xsync flume-env.sh	
  1. Flume 内存参数设置及优化
    JVM heap 一般设置为 4G 或更高
    -Xmx 与-Xms 最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁 fullgc。
    -Xms 表示 JVM Heap(堆内存)最小尺寸,初始分配;-Xmx 表示 JVM Heap(堆内存)最大允许的尺寸,按需分配。如果不设置一致,容易在初始化时,由于内存不够,频繁触发 full gc。

2.2 采集通道启动/停止脚本

2.2.1 数据通道测试

  1. 资源包上传
    大数据-日志数据采集(三)_zookeeper_07
    大数据-日志数据采集(三)_服务器_08
    这个上传的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
  1. 测试
    大数据-日志数据采集(三)_服务器_09
    采集的日志最后会到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
    大数据-日志数据采集(三)_zookeeper_10
  • 生成日志
    执行脚本 lg.sh
lg.sh

大数据-日志数据采集(三)_hadoop_11
2020-06-18那天的数据就上传成功了;
整个日志采集就完成了

总结

整个日志采集都是为了进行用户的行为分析,比如在哪个页面做了哪些事情,经常在什么时候登录系统等,而采集的日志,整个流程都是为了将日志上传到hdfs,给后续hive使用


感谢大家阅、互相学习;
感谢尚硅谷提供的学习资料;
有问题评论或者发邮箱;
gitee:很多代码仓库;
1449697757@qq.com