1. Flume是什么
在完整的离线大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架。
- Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统;
- Flume支持在日志系统中定制各类数据发送方,用于收集数据;
- Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
2. Flume的架构
- Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
- Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成。
- 每一个agent相当于一个数据传递员,内部有三个组件:
- source
- 采集组件,用于跟数据源对接,以获取数据
- channel
- 传输通道组件,缓存数据,用于从source将数据传递到sink
- sink
- 下沉组件,数据发送给最终存储系统或者下一级agent中
- source
3. Flume采集系统结构图
3.1 简单结构
- 单个agent采集数据
3.2 复杂结构
- 2个agent串联
- 多个agent串联
- 多个channel
4. Flume实战
4.1 采集文件到控制台
(1)需求描述
监控一个文件如果有新增的内容就把数据采集之后打印控制台,通常用于测试/调试目的。
(2)flume配置文件开发
在flume的安装目录下创建一个文件夹myconf, 后期存放flume开发的配置文件。
mkdir /kkb/install/flume-1.6.0-cdh5.14.2/myconf
vim tail-memory-logger.conf
#Name the components on this agent
#定义一个agent,分别指定source、channel、sink别名
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#配置source
#指定source的类型为exec,通过Unix命令来传输结果数据
a1.sources.r1.type = exec
#监控一个文件,有新的数据产生就不断采集走
a1.sources.r1.command = tail -F /install/flumeData/tail.log
#指定source的数据流入的channel中
a1.sources.r1.channels = c1
#配置channel
#指定channel的类型为memory
a1.channels.c1.type = memory
#指定channel的最多可以存放数据的容量
a1.channels.c1.capacity = 1000
#指定在一个事务中source写数据到channel或者sink从channel取数据最大条数
a1.channels.c1.transactionCapacity = 100
#配置sink
a1.sinks.k1.channel = c1
#类型是日志格式,结果会打印在控制台
a1.sinks.k1.type = logger
(3)启动agent
进入到node01上的/install/flume-1.6.0-cdh5.14.2目录下执行如下命令:
bin/flume-ng agent -n a1 -c myconf -f myconf/tail-memory-logger.conf -Dflume.root.logger=info,console
其中:
-n表示指定该agent名称(-n也可以写成-name)
-c表示配置文件所在的目录
-f表示配置文件的路径名称
-D表示指定key=value键值对---这里指定的是启动的日志输出级别
如图 表示启动成功:
(4)在flumeData目录下创建的tail.log文件,输入内容1,2,3,4,5,6,7,8,9;可以看到控制台输出如图:
4.2 采集文件到HDFS
(1)需求描述
监控一个文件如果有新增的内容就把数据采集到HDFS上。
(2)结构示意图
(3)flume配置文件开发
编辑配置文件file2Hdfs.conf
vim file2Hdfs.conf
其内容如下:
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1#配置source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /install/flumeData/tail.log
a1.sources.r1.channels = c1#配置channel
a1.channels.c1.type = file
#设置检查点目录--该目录是记录下event在数据目录下的位置
a1.channels.c1.checkpointDir=/data/flume_checkpoint
#数据存储所在的目录
a1.channels.c1.dataDirs=/data/flume_data
#配置sink
a1.sinks.k1.channel = c1
#指定sink类型为hdfs
a1.sinks.k1.type = hdfs
#指定数据收集到hdfs目录
a1.sinks.k1.hdfs.path = hdfs://node01:8020/tailFile/%Y-%m-%d/%H%M
#指定生成文件名的前缀
a1.sinks.k1.hdfs.filePrefix = events-#是否启用时间上的”舍弃” -->控制目录
a1.sinks.k1.hdfs.round = true
#时间上进行“舍弃”的值
# 如 12:10 -- 12:19 => 12:10
# 如 12:20 -- 12:29 => 12:20
a1.sinks.k1.hdfs.roundValue = 10
#时间上进行“舍弃”的单位
a1.sinks.k1.hdfs.roundUnit = minute# 控制文件个数
#60s或者50字节或者10条数据,谁先满足,就开始滚动生成新文件
a1.sinks.k1.hdfs.rollInterval = 60
a1.sinks.k1.hdfs.rollSize = 50
a1.sinks.k1.hdfs.rollCount = 10#每个批次写入的数据量
a1.sinks.k1.hdfs.batchSize = 100#开始本地时间戳--开启后就可以使用%Y-%m-%d去解析时间
a1.sinks.k1.hdfs.useLocalTimeStamp = true#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream
(4)启动hdfs后,创建tailFile文件夹
hdfs dfs mkdir -p /tailFile
(5)启动agent
进入到node01上的/install/flume-1.6.0-cdh5.14.2目录下执行如下命令:
bin/flume-ng agent -n a1 -c myconf -f myconf/file2Hdfs.conf -Dflume.root.logger=info,console
此时hdfs上产生如图文件:
当执行完成后,文件后缀中的tmp会消失掉
4.3 采集目录到HDFS
(1)需求描述
一个目录中不断有新的文件产生,需要把目录中的文件不断地进行数据收集保存到HDFS上。
(2)结构示意图
(3)flume配置文件开发
在myconf目录中创建配置文件并添加如下内容:
vim dir2Hdfs.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1# 配置source
##注意:不能往监控目中重复丢同名文件
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /install/flumeData/files #files文件夹需手动创建
# 是否将文件的绝对路径添加到header
a1.sources.r1.fileHeader = true
a1.sources.r1.channels = c1
#配置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#配置sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://node01:8020/spooldir/%Y-%m-%d/%H%M
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 60
a1.sinks.k1.hdfs.rollSize = 50
a1.sinks.k1.hdfs.rollCount = 10
a1.sinks.k1.hdfs.batchSize = 100
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream
(4)启动agent
进入到node01上的/install/flume-1.6.0-cdh5.14.2目录下执行如下命令:
bin/flume-ng agent -n a1 -c myconf -f myconf/dir2Hdfs.conf -Dflume.root.logger=info,console
通过上传工具向files文件夹上传文件,刷新,发现后缀成为COMPL,如图:
再查看hdfs,Hdfs上多了个spooldir目录
4.4 两个agent级联
(1)需求描述
第一个agent负责监控某个目录中新增的文件进行数据收集,通过网络发送到第二个agent当中去,第二个agent负责接收第一个agent发送的数据,并将数据保存到hdfs上面去。
(2)结构示意图
(3)将node01中的flume同步到node02
scp -r /install/flume node02:$PWD
(4)创建node01上的flume配置文件
vim dir2avro.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1# 配置source
##注意:不能往监控目中重复丢同名文件
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /kkb/install/flumeData/files
a1.sources.r1.fileHeader = true
a1.sources.r1.channels = c1
#配置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100#配置sink
a1.sinks.k1.channel = c1
#AvroSink是用来通过网络来传输数据的,可以将event发送到RPC服务器(比如AvroSource)
a1.sinks.k1.type = avro#node02 注意修改为自己的hostname
a1.sinks.k1.hostname = node02
a1.sinks.k1.port = 4141
(5)创建node02上的flume配置文件
vim avro2Hdfs.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1#配置source
#通过AvroSource接受AvroSink的网络数据
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
#AvroSource服务的ip地址
a1.sources.r1.bind = node02
#AvroSource服务的端口
a1.sources.r1.port = 4141#配置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100#配置sink
a1.sinks.k1.channel = c1
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node01:8020/avro-hdfs/%Y-%m-%d/%H-%M
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 60
a1.sinks.k1.hdfs.rollSize = 50
a1.sinks.k1.hdfs.rollCount = 10
a1.sinks.k1.hdfs.batchSize = 100
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream
(6)启动agent:先启动node02上的flume,然后在启动node01上的flume。
- 在node02上的flume安装目录下执行:
bin/flume-ng agent -n a1 -c myconf -f myconf/avro2Hdfs.conf -Dflume.root.logger=info,console
- 在node01上的flume安装目录下执行:
bin/flume-ng agent -n a1 -c myconf -f myconf/dir2avro.conf -Dflume.root.logger=info,console
- 最后在node01上的/install/flumeData/files目录下创建一些数据文件,最后去HDFS上查看数据。
hdfs上的数据如图: