辅助框架之Flume日志采集

1. Flume是什么

在完整的离线大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架。

  • Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统;
  • Flume支持在日志系统中定制各类数据发送方,用于收集数据
  • Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

2. Flume的架构

  • Flume 的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
  • Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成。
  • 每一个agent相当于一个数据传递员,内部有三个组件:
    • source
      • 采集组件,用于跟数据源对接,以获取数据
    • channel
      • 传输通道组件,缓存数据,用于从source将数据传递到sink
    • sink
      • 下沉组件,数据发送给最终存储系统或者下一级agent中

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上的数据如图:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值