Flume--总结
数据采集
目的:将各种原始数据采集到大数据平台中
采集工具
- 文件:Flume的主要应用场景
- RDBMS:Sqoop的主要应用
采集方式
- 全量:每次都是将
所有数据
进行采集- 适合于
数据迁移
- 适合于
- 增量:每次都是将
最新的数据
进行采集- 适合于
数据同步
【主要使用这个】
- 适合于
Flume功能及特点
- 实时数据流采集工具
- 功能:实现将数据进行采集
- 特点
- 功能会比较
全面
:提供了各种各样的已经开发好的采集的组件,支持自定义开发组件 - 使用相对
简单
:定义一个配置文件,定义配置即可 性能比较高
:实时性比较高,将数据动态监听,变成数据流,只要数据一更新,就立即会被采集稳定性比较好
:提供了负载均衡和故障转移的架构,保证Flume的运行稳定性
- 功能会比较
Flume架构
架构一:一个agent中可以包含多个source、channel、sink
如果有多个目标地,需要多个sink,每个sink对应一个channel
- 功能
多个数据源要采集到一起
一份数据要发送到多个地方
架构二:Flume的级联架构,两层Flume
- 第一层:负责采集数据,每台机器都有一个Flume,采集这台机器的数据
- 第二层:负责汇总数据,将第一层所有数据进行汇总然后写入目标地
- 功能:避免多台机器并发直接写入目标地,影响目标地的IO
三大基本组件
Source
- 功能:
监听数据源
,采集数据,将数据变成Event数据流,发送给Channel - 常见类型
exec
:动态监听单个文件
数据的变化,一般与tail -f搭配- 数据永远写入一个文件,只有这一个文件在动态的变化
不能监听多个文件
spool dir
:动态监听单个目录
中文件的变化- 采集的数据是多个文件,只要文件一产生就可以立即将文件所有内容进行采集,文件不可以动态变化
- 适合先生成一个临时文件,写完以后,变成日志文件
不能监听每个文件的动态变化
taildir
:动态监听多个文件以及每个文件的动态变化
- 采集的数据是多个文件,每个文件都可以动态变化
- 适合于直接生成一个日志文件,追加的写入这个日志文件
avro
:基于avro协议的网络端口的数据采集- 监听一个
端口
,将端口中的数据进行采集
- 监听一个
Channel
- 功能:
临时缓存数据
- 常见类型
mem
:将数据临时缓存在内存中- 数据量小,性能要求高
file
:将数据临时缓存在磁盘中- 数据量大,性能要求不高
Sink
- 功能:从Channel中取数据,发送到目标地
- 常见类型
hdfs
:用于将数据采集到HDFS上,应用于离线架构- 如何决定HDFS上写入文件的大小
使用HDFS sink代替Hive Sink
- 将写入HDFS的目录作为Hive表的目录
- 如果是以时间分区的方式写入HDFS,在Hive手动关联分区目录
- 方式一:
msck repair table tbname
- 方式二:
alter table add partition
kafka
:用于将数据采集存储到Kafka中,应用于实时架构avro
:基于avro协议的网络端口的数据发送- 将数据发送到某个端口上
三大高级组件
Source Interceptor
- 功能:用于
拦截source转换 的所有event,对event进行处理
- 第一类:在event的头部添加KV对
- 第二类:处理event的body中的数据
- 常用的拦截器
- Timestamp:用于在每个Event头部添加时间戳
timestamp=时间戳
- Host:用于在每个Event头部添加主机名
host=主机名
- Static:用于在每个Event头部自定义添加KV
key=value
- RegexFilter:用于对Event的数据进行
正则匹配过滤
- Timestamp:用于在每个Event头部添加时间戳
Channel Selector
- 功能:如果一个source对接多个channel,用于
决定source如何将数据给channle
- 方式
replicas
:默认的方式- source会将数据
给每个channel一份
- source会将数据
mutiple
:可选的方式- source可以根据event头部某个Key的值来判断给哪个channel
选择性的将数据给不同的channel
Sink Processor
- 功能:将多个sink封装成一个整体:sinkgroup,用于
实现负载均衡和故障转移
- 应用:在工作中都搭配级联架构
两层Flume
,实现Collect层的高可用
- 负载均衡:所有sink是一起工作
- 具体一个event归哪个sink处理,由我们自己配置决定
随机
轮询
- 故障转移:只有一个sink工作,其他sink作为备份
- 如何决定谁是工作状态:权重决定
Flume自己是不是分布式的服务工具?
- 不是的
- 但是它能实现分布式的数据采集架构
- Flume底层只是一个封装好的Java程序
Flume开发
- step1:构建一个properties配置文件
- step2:定义agent、source、channel、sink
- step3:运行Flume的程序