1、Flume基础扫盲
1、概述
Flume是一个分布式、可靠的和高可用的海量日志采集、聚合和传输的系统。支持在系统中定制种类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
PS:在HDFS中,文件只作为目录项存在,在文件关闭前,其长度一直显示为0。如果在一段时间内将数据写到文件中,但却没有将其关闭,那么一旦客户端出现网络中断,什么都得不到,只有一个空白的文件。
Flume以Agent为最小的独立运行单位,一个Agent就是一个JVM.单个Agent由source、channel、sink三大组件构成。
input叫做source、output叫做sink,连接source与sink中间的部分叫做channel,它们中传输的是event.其图示如下:
说明:
- source将data转化为event写入到一个或多个channel中。
- channel作为event从source到sink传递的保留区。
- sink只从一个channel中接收event。
- agent可能会有多个source、channel与sink。
- event:flume将数据表示为event,它是Flume的基本传输单位。它由0个或多个头与体组成。头是一些键值对,可用于路由判定或是承载其他结构化信息。体是字节数组,包含实际负载。每个event本质上是一个独立的记录,而不是记录的一部分。event结构如下图:
一个Agent可以连接一个或多个其他的Agent。一个Agent也可以从一个或多个Agent接收数据。通过相互连接的多个Agent,一个流作业被建立。这个Agent链条可以用于将数据从一个位置移动到另一个位置--特别是,从生产数据的应用程序到HDFS、HBase等。
拦截器是位于source和channel之间。可以用拦截器检查和修改flume的event,可在source创建event后或是channel发送event前链接0个或多个拦截器。
2、Source
exec源、syslog源
3、Channel
Channel包含2类channel:内存/非持久化通道与文件系统/持久化通道。应避免从Source到Channel的数据存储率大于Sink所能写发数据率,否则会出现channel堵塞。
flume只对每个独立agent中的每个channel提供事务保证。
文件通道的持久化能力是由WAL(Write Ahead Log)以一个或多个文件存储联合提供的。
通道选择器负责将数据从一source转向一个或多个channel上。flume自带两个通道选择器,可以包含大多数据使用场景。
- 复制通道选择器(默认)将event的副本放到每个事先配置好的通道中。
- 多路通道选择器会根据某些头信息将event写到不同的通道中。
4、Sink与SinkHandler
HDFS Sink的作用是持续打开HDFS中的文件,然后以流的方式将数据写入其中,并且在某个时间点关闭该文件再打开新的文件。
编解码器:用于通过各种压缩算法来压缩和解压缩数据。Flume支持gzip、bzip2、lzo和snappy。
事件序列化器:是Flume转换为另一种格式以进行输出的机制。text、avro
Sink Group:是Flume为了在数据处理Channel中消除单点失败,通过负载均衡或是故障恢复机制将event发送到不同sink的能力。它用于创建逻辑sink分组,该分组的行为是由sink processor来控制,它决定了事件的路由方式。Sink运行器(Sink Runner)运行一个Sink组,sink组可含有一个或多个Sink。如果组中只存在一个Sink,那么没有组将更有效率。Sink运行器仅仅是一个询问Sink组(或Sink)来处理下一批event集合。每Sink只能从一个Channel获取数据,尽管多个Sink可以从同一个Channel获取数据。选定的Sink(或如果没有组,唯一的Sink)从Channel中接收事件,并将事件写入下一阶段或最终目的地。流程如下:
5、拦截器、ETL
拦截器:可以实现数据处理管道中所必需的最后一个功能,就是即时检测与转换event。
Flume自带的拦截器:Timestamp、Host、static、正则表达式过滤、正则表达式抽取,也可以自定义拦截器。
Avro源/接收器
6、Flume监控
监控指标
- data以期望的速度进入source中
- data没有超出channel的限制
- data以期望的速度离开sink
监控方式:
- JMX
- Monit
- Nagios
- Ganglia
- 自定义监控勾子
7、实时日志收集注意点
1)、如果是在集群中,时间使用UTC
2)、对容量进行规划
3)、多数据中心需要考虑点
4)、收集的数据要合规
Source、Channel处理器、拦截器和Channel选择器之间的交互如下图:
9、Flume支持的数据流类型
1)、多Agent流
2)、合并流
3)、多通路流
10、综合示例:
2处的机器生成2种类型数据(即三角形与矩形),对应代理使用了多路通道选择器将这两种数据划分到了不同的通道中。矩形与1处机器产生的数据合并后分到了数据中心1,三角形分到数据中心2中的ES中。
注意:数据转换可能发生在任何source之后以及任何sink之前。
发送数据到Flume:Flume有两类发送数据到Flume Agent的程序性方法:Flume SDK和Embedded Agent API。Flume也自带有log4j appender,可以用来从应用程序发送数据到Flume Agent。