Flume实时数据采集工具的使用
Flume的开发已经接近极致,可以看到最近两年也没有什么更新,是一款非常实用的实时数据采集工具,可以满足大数据采集的大多数要求(全量采集还是建议用sqoop,别问为什么,问就是你的全量采集你也可以用Flume,前提是你不怕被打,前前提是你的内存还能腾出地儿给别的任务跑)。
具体的使用请往后看,这款工具真的是不用脑子,有手就行,基本上你要考虑的人家都给你考虑到了,要用什么直接去官网cp过来改改就完事了,有人非要杠,开发到极致了还要改,洗洗睡吧你。
1.功能
1.可以将各种不同的数据源的数据实时采集到各种目标中。
2.特点
1.1实时采集,也可以做离线采集
1.2.采集:文件、端口
发送:HDFS、Hive、Hbase、Kafka
1.3.允许自定义开发
1.4.开发相对简单,所有功能基本已经封装好了,只需要开发一个配置文件。
1.5.虽然不是分布式工具,但可以将Flume部署在多台机器上,一起采集,实现分布式采集。
3.应用
应用于实时文件、网络数据流采集场景。
参考:美团的Flume设计架构
Flume的基本组成
step1:Agent
step2:Source
step3:Channel
step4:Sink
step5:Event
**官网:flume.apache.org**
Agent:
一个Agent表示一个Flume程序,实现采集数据源的数据,将 数据采集发送到目标地
将WebServer的日志采集以后写入HDFS
任何一个Agent实现数据采集,都必须由三个基本组件构成
Source、Channel、Sink
Source:
负责监听数据源的数据变化,如果数据源产生新的数据,就立即进行采集
负责实现数据采集
将数据源的每一行数据变成一个Event对象,发送给Channel
Channel:
负责接收Source采集到的数据,供Sink来读取数据
采集数据的临时缓存的
Sink:
负责从Channel中读取采集的数据,将数据写入目标地
最终实现数据发送的组件
Event:
数据流传输的最小的封装的单元,将每一行封装为一个Event
结构
header:类似于一个Map集合存储,默认为空的,可以选择性在header放KV对,一些属性的配置等
body:类似于一个字节数组,存放真正的这条数据的内容
作用:实现每一条数据的封装
Flume的开发规则
step1:开发一个Flume的参数配置文件
需要在配置文件中定义Agent
定义Agent的名称
定义Source:从哪读取数据
定义Channel:将数据缓存在哪
定义Sink:将数据发送到哪
**一个文件可以有多个Agent,具体区分每个Agent通过Agent名称来区分**
**step2:运行flume的agent程序**,运行这个程序所在的文件,指定agent的名称即可
--用法
flume-ng <command> [options]...
--使用
flume-ng agent -c/--conf 指定Flume配置文件目录 --name/-n 指定Agent的名称 --conf-file/-f 指定要运行的文件
Flume开发测试
需求:采集Hive的日志、临时缓存在内存中、将日志写入Flume的日志中并打印在命令行
source:采集一个文件数据
Exec Source:通过执行一条Linux命令来实现文件的动态采集
channel:Flume提供了各种channel用于缓存数据
mem channel:将数据缓存在内存中
sink:Flume提供了很多种sink
Logger Sink:将数据写入日志中
**
开发实例
**
创建测试目录 cd /export/server/flume-1.6.0-cdh5.14.0-bin
mkdir usercase
复制官方示例 cp conf/flume-conf.properties.template usercase/hive-mem-log.properties
开发配置文件
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#define the agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#define the source
a1.sources