Flume知识点总结

Flume

Flume基础

Flume是一个高可用的,高可靠的分布式日志采集传输系统。

  • 常用系统分布
    Flume知识点总结_第1张图片

Flume 基础架构

Flume知识点总结_第2张图片

Agent
  • Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的。
  • Agent由三部分组成,分别是Source,Channel和Sink,他在图中就代表中间的方块。
Source
  • Sorce是用来接收数据进入Agent中的组件。
  • Source可以接受处理各种类型,各种格式的日志数据。比如avor、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。
Sink
  • Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。
  • Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义。
Channel
  • Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个Sink 的读取操作。
  • Flume 自带两种 Channel:Memory Channel 和 File Channel 以及 Kafka Channel。
Event
  • 传输单元,Flume 数据传输的基本单元,以 Event 的形式将数据从源头送至目的地。
  • Event 由 Header 和 Body 两部分组成,Header 用来存放该 event 的一些属性,为 K-V 结构,Body 用来存放该条数据,形式为字节数组。

Flume 快速入门

Flume框架需要字节手写配置文件,在启动的时候带上配置文件内容即可

  • 一般的配置文件如下图所示
    Flume知识点总结_第3张图片官方的配置手册:http://flume.apache.org/FlumeUserGuide.html.

  • 随后用命令行打开flume即可

 bin/flume-ng agent -c conf/ -n a1 -f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
  • 参数说明:
    -conf/-c:表示配置文件存储在 conf/目录

    -name/-n:表示给 agent 起名为 a1

    -conf-file/-f:flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf文件。

    -Dflume.root.logger=INFO,console :-D 表示 flume 运行时动态修改 flume.root.logger参数属性值,并将控制台日志打印级别设置为 INFO 级别。日志级别包括:log、info、warn、error。

常用的几种数据源监控方法

实时监控单个追加文件

案例需求:实时监控 Hive 日志,并上传到 HDFS 中
Flume知识点总结_第4张图片

实时监控目录下多个新文件

案例需求:使用 Flume 监听整个目录的文件,并上传至 HDFS
Flume知识点总结_第5张图片

实时监控目录下的多个追加文件

案例需求:使用 Flume 监听整个目录的实时追加文件,并上传至 HDFS
Flume知识点总结_第6张图片

  • Taildir Source 维护了一个 json 格式的 position File,其会定期的往 position File 中更新每个文件读取到的最新的位置,因此能够实现断点续传。

Flume 进阶

Flume 事务

Flume知识点总结_第7张图片
Put事务的流程

  • doPut:将皮数据写入临时缓冲区putList。
  • doCommit:检查Channel内存队列是否足够合并。
  • doRollback:channel内队列空间不足,回滚数据。

Take事务的流程

  • doTake:将数据取到临时缓冲区takeList,并将数据发送到HDFS。
  • doCommit:如果数据全部发送成功,则清理临时缓冲区。
  • doRollback:数据发送过程中如果出现异常,rollback将takeList中的数据归还给channel内存队列。

Flume Agent 内部原理

Flume知识点总结_第8张图片重要组件:

  • 1)ChannelSelector:

    • ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型,分别是 Replicating(复制)和 Multiplexing(多路复用)。
    • ReplicatingSelector 会将同一个 Event 发往所有的 Channel,Multiplexing 会根据相应的原则,将不同的 Event 发往不同的 Channel。
  • 2)SinkProcessor

    • SinkProcessor 共 有 三 种 类 型 , 分 别 是 DefaultSinkProcessor ,LoadBalancingSinkProcessor 和 FailoverSinkProcessor
    • DefaultSinkProcessor 对 应 的 是 单 个 的 Sink , LoadBalancingSinkProcessor 和FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor 可以实现故障转移的功能。

Flume 拓扑结构

简单串联

Flume知识点总结_第9张图片

复制和多路复用

Flume知识点总结_第10张图片

  • 需要在配置文件增加 a1.sources.r1.selector.type = replicating
负载均衡和故障转移

Flume知识点总结_第11张图片

  • 需要配置以下参数
    a1.sinkgroups.g1.processor.type = failover
    a1.sinkgroups.g1.processor.priority.k1 = 5
    a1.sinkgroups.g1.processor.priority.k2 = 10
    a1.sinkgroups.g1.processor.maxpenalty = 10000
聚合

Flume知识点总结_第12张图片

  • 日常 web 应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用 flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个 flume 采集日志,传送到一个集中收集日志的flume,再由此 flume 上传到 hdfs、hive、hbase 等,进行日志分析

自定义 Interceptor

案例需求
使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统。

依赖配置:

<dependency>
 <groupId>org.apache.flume</groupId>
 <artifactId>flume-ng-core</artifactId>
 <version>1.7.0</version>
</dependency>

定义 CustomInterceptor 类并实现 Interceptor 接口。

package com.atguigu.flume.interceptor;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.List;
public class CustomInterceptor implements Interceptor {
 @Override
 public void initialize() {
 }
	 @Override
	 public Event intercept(Event event) {
		 byte[] body = event.getBody();
		 if (body[0] < 'z' && body[0] > 'a') {
			 event.getHeaders().put("type", "letter");
		 } else if (body[0] > '0' && body[0] < '9') {
			 event.getHeaders().put("type", "number");
		 }
		 return event;
	 }
	 @Override
	 public List<Event> intercept(List<Event> events) {
	 for (Event event : events) {
		 intercept(event);
	 }
	 return events;
	 }
	 @Override
	 public void close() {
	 }
	 
	 public static class Builder implements Interceptor.Builder {
	 
	 @Override
	 public Interceptor build() {
		 return new CustomInterceptor();
	 }
	 
	 @Override
	 public void configure(Context context) {
	 
	 }
	}
}

编辑 flume 配置文件
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.atguigu.flume.interceptor.CustomInterceptor$Builder
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = type
a1.sources.r1.selector.mapping.letter = c1
a1.sources.r1.selector.mapping.number = c2

自定义 Source

  • 根据官方说明自定义MySource 需要继承 AbstractSource 类并实现 Configurable 和 PollableSource 接口。
  • 实现相应方法:
    • getBackOffSleepIncrement()//暂不用
    • getMaxBackOffSleepInterval()//暂不用
    • configure(Context context)//初始化 context(读取配置文件内容)
    • process()//获取数据封装成 event 并写入 channel,这个方法将被循环调用。
  • 使用场景:读取 MySQL 数据或者其他文件系统。

Flume 数据流监控

Ganglia
  • Ganglia 由 gmond、gmetad 和 gweb 三部分组成。
  • gmond(Ganglia Monitoring Daemon)是一种轻量级服务,安装在每台需要收集指标数据的节点主机上。使用 gmond,你可以很容易收集很多系统指标数据,如 CPU、内存、磁盘、网络和活跃进程的数据等。
  • gmetad(Ganglia Meta Daemon)整合所有信息,并将其以 RRD 格式存储至磁盘的服务。
    gweb(Ganglia Web)Ganglia 可视化工具,gweb 是一种利用浏览器显示 gmetad 所存储数据的 PHP 前端。在 Web 界面中以图表方式展现集群的运行状态下收集的多种不同指标数据

Flume 的事务机制

Flume 的事务机制(类似数据库的事务机制):Flume 使用两个独立的事务分别负责从Soucrce 到 Channel,以及从 Channel 到 Sink 的事件传递。比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么 Soucrce 就将该文件标记为完成。同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到 Channel 中,等待重新传递。

Flume 采集数据会丢失吗?
  • 根据 Flume 的架构原理,Flume 是不可能丢失数据的,其内部有完善的事务机制,Source 到 Channel 是事务性的,Channel 到 Sink 是事务性的,因此这两个环节不会出现数据的丢失,唯一可能丢失数据的情况是 Channel 采用 memoryChannel,agent 宕机导致数据丢失,或者 Channel 存储数据已满,导致 Source 不再写入,未写入的数据丢失。
  • Flume 不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由 Sink 发出,但是没有接收到响应,Sink 会再次发送数据,此时可能会导致数据的重复

你可能感兴趣的:(Hadoop生态圈)