一、网站流量日志分析项目
目标
常规大数据项目的业务流程
电商
金融
游戏
医疗
整合之前学习的技术内容实现业务需求
业务流程
数据采集:将数据存储到大数据系统中
数据源
-》文件
-》DB
-》数据流
注意:数据流:不以任何文件的形式存在,不进行存储。
而直接将数据作为数据流传输发送到目标路径中去。
目标
-》目标
-》hdfs
-》hive
-》hbase
-》采集工具(数据采集框架)
-》shell:一般不用 >>集群中负载比较高的话,效率会很低。
-》sqoop:rdbms -> hdfs
注意:有局限性
1、只适用于MySql导入到hdfs并且效率也不高
2、只能适用于DB(rdbms),文件和数据流无法采集了
-》Flume:基于各种数据源的数据流采集工具
-》kafka:消息中间件
-》自己在应用后台嵌入自己开发的采集架构
-》数据分析
-》数据可视化
二、Flume的特点及其介绍
特点
collecting, aggregating, and moving
收集 聚合 移动
组件: source channel sink
-》on streaming data flows
基于实时数据流的应用
注意:一个Agent就是一个业务程序
-》组件功能
-》source:负责读取数据,将数据转化为数据流,发送数据给channel
-》channel:负责临时存储数据
-》sink:负责从channel中取数据,并将取到的数据发送给目标地
-》flume的版本
Flume-og:老版本
Flume-ng:新一代
1.5-1.7
-》flume底层
注意:source会将 数据变成数据流,但是不会将数据流直接发送出去,而是将数据封装成event对象
-》将每一条数据封装成event对象>>文件中一行会变成一个event对象
-》event对象:
-》head:可以存放key=value的属性<<Flume三大高级组件的时候回用到
-》body:这一条数据的所有字节
三、Flume的安装部署测试
Flume的安装
tar -zxvf flume-ng-1.6.0-cdh5.7.6.tar.gz -C /opt/cdh-5.7.6/
mv apache-flume-1.6.0-cdh5.7.6-bin flume-1.6.0-cdh5.7.6-bin
修改配置
flume-env.sh
export JAVA_HOME=/opt/modules/jdk1.8.0_91
配置环境变量:
让flume读取到hdfs的地址
-》第一种:在env或者全部环境变量中配置HADOOP_HOME
-》第二种:在编写应用程序时,指定完整的hdfs路径
hdfs://hostname:8020/flume
注意:hdfs的端口号是8020
实际开发中第三种方法用的最多(做hdfs做HA时候就不适用了)
-》第三种:将core-site和hdfs-site拷贝到flume的conf目录(hdfs做了HA)
cp ../hadoop-2.6.0-cdh5.7.6/etc/hadoop/core-site.xml ../hadoop-2.6.0-cdh5.7.6/etc/hadoop/hdfs-site.xml conf/
需要添加相应的依赖jar包
-》报错:NOCLASSDEFOUND
-》第一种:将hadoop的classpath追加到flume的classpath中(不推荐)
注意:flume可以这么做,因为flume不包含任何属于Hadoop的jar包
注意:但是与hive和hbase集成,这些框架有Hadoop的jar包,这时候就
会jar包会产生冲突,推荐使用第二种
-》第二种:
将需要用到的jar包放入即可
资料中整理好的jar包(精简版):
将jar包放入flume 框架lib中:
Flume测试
编写agent配置
source
channel
sink
运行agent文件
语法:Usage: bin/flume-ng <command> [options]...
bin/flume-ng agent
--conf 指定flume的配置文件目录
--name agent的名字
--conf-file 指定agent文件的地址
-Dflume.root.logger=INFO,console 将info的日志打印到控制台中
注意:
-》一个文件中可以有多个agent,每个agent有自己的名字
-》一个agent就是一个数据采集的程序
source,channel,sink
测试1:动态采集hive的日志文件,将采集到的数据打印到logger中
source:负责读hive日志文件,将数据发送给channel
channel:file(文件)/mem(内存)
sink:从channel取数据,将数据发送给logger
[root@bigdata-training01 flume-1.6.0-cdh5.7.6-bin]# mkdir case
[root@bigdata-training01 flume-1.6.0-cdh5.7.6-bin]# cd case /
[root@bigdata-training01 case]# cp ../conf/flume-conf.properties.template hive-mem-log.properties
配置hive-mem-log.properties
a1.sources = s1
a1.channels = c1
a1.sinks = k1
--在source过程中通过执行命令来读取文件
# define the source
a1.sources.s1.type = exec
--source过程中执行的命令是什么
a1.sources.s1.command=tail -F /opt/cdh-5.7.6/hive-1.1.0-cdh5.7.6/logs/hive.log
--channel过程中数据写入内中
# define the channel
a1.channels.c1.type = memory
--sink过程中将数据写入日志中去
#define the sink
a1.sinks.k1.type = logger
#bond
--source将数据发送到c1这个channel
a1.sources.s1.channels = c1
--sinks在c1这个channel中取数据
a1.sinks.k1.channel = c1
测试
bin/flume-ng agent --conf conf/ --name a1 --conf-file case/hive-mem-log.properties -Dflume.root.logger=INFO,console
注意:采集过来的数据是event对象
2021-06-13 18:19:20,571 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 32 30 32 31 2D 30 35 2D 32 33 20 31 33 3A 31 37 2021-05-23 13:17 }
2021-06-13 18:19:20,638 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 32 30 32 31 2D 30 35 2D 32 33 20 31 33 3A 31 37 2021-05-23 13:17 }
2021-06-13 18:19:20,643 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 32 30 32 31 2D 30 35 2D 32 33 20 31 33 3A 31 37 2021-05-23 13:17 }
注意:还没有往hive中写数据,这里已经有数据
原因:使用了tail-F /opt/cdh-5.7.6/hive-1.1.0-cdh5.7.6/logs/hive.log,这条命令会将最后的十条数据先读过来
在hive中操作后,flume中会实时的采集数据:
在hive中操作后,flume中会实时的采集数据:
测试2:动态采集hive的日志文件,将采集到的数据打印到hdfs中
[root@bigdata-training01 flume-1.6.0-cdh5.7.6-bin]# cp case/hive-mem-log.properties case/hive-mem-hdfs.properties
配置hive-mem-hdfs.properties
#define agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
# define the source
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /opt/cdh-5.7.6/hive-1.1.0-cdh5.7.6/logs/hive.log
# define the channel
a1.channels.c1.type = memory
#define the sink
--sink过程中将数据写入hdfs中
a1.sinks.k1.type = hdfs
--写入hdfs的文件地址
a1.sinks.k1.hdfs.path = /flume2
#bond
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
测试
?更改目标为hdfs
[root@bigdata-training01 flume-1.6.0-cdh5.7.6-bin]# bin/flume-ng agent --conf conf/ --name a1 --conf-file case/hive-mem-hdfs.properties -Dflume.root.logger=INFO,console
大量执行show databases产生日志: