Flume
Posted yuexiuping
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flume相关的知识,希望对你有一定的参考价值。
Flume
Flume 概述:
- 特点:高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
- 选Flume的原因:FLume是流式传输实时处理的。
- 数据的传输过程:没有将用户产生的日志直接传输给大数据平台,而是传给日志服务器,可以按自己的需求方式去日志服务器获取。 不希望以你的方式来传输而时希望以我的方式去拿。
- 日志:
- <1>框架工作时候产生日志;
- <2>用户的操作行为被后台服务器收集后产生的用户行为日志。
- Log4j:通过日志(log4j)的方式打印日志。
- 日志的级别:Debug、Info、 Warn、 Error。
Flume基础架构:
WebServer -> Agent -> HDFS
Agent:JVM进程,由Source、Channel、Sink组成。
-
Source:是负责接收数据到Flume Agent的组件。
- Netcat Source :实现对端口的监控。
- Exec Source:可以实时搜集数据,不能实现断点续传,但是在Flume不运行或者Shell命令出错的情况下,数据将会丢失。
- Spooling Directory Source:监控目录,支持断点续传,用于监控文件下的新增文件,将被采集过的文件做上标记后缀-Completed下次就不采集了,只采集监控目录下的新文件,Spooling Dir 但不适合对实时追加日志的文件进行监听并同步。
- TailDir Source:断点续传、多目录,可以监控文件夹下文件个数即文件的变化,但不支持递归监控文件夹,TailDir维护了一个json格式的position File其会定期的往position File中更新每个文件读取到的最新的位置,因此能够实现断点续传。
说明:Flume 1.6 以前需要自定义Source记录每次读取文件位置,实现断点续传。
-
Sink:不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
- Hdfs Sink: 将监控到的数据上传到 HDFS中。
- Logger Sink: 将监控到的数据打印到控制台。
- Avro Sink:可以将本级Flume采集的数据通过AvroSink传递给下一层Flume的AvroSource处理。
说明:没有用 Logger.Sink 的时候尽量要写上 flume.root.logger= INFO,console 这样可以将flume框架的信息打印到控制台上,当出现错误时会将错误信息输出到控制台上,否则输出到日志文件中,当出现错误时无法即使的观测到错误信息。
-
Channel:Channel是位于Source和Sink之间的缓冲区。
- Memory Channel:是内存中的队列,在不关心文件丢失的情况下使用,因为内存中的数据并不安全,存在丢失的风险。
- File Channel:将所有Event写入到磁盘,需要指明存储数据的路径,速度慢,但是安全,安全起见还从在另外的磁盘中创建了副本,防止数据丢失。
- Kafka Channel:省去Sink,提高了效率。KafkaChannel数据存储在Kafka里面,所以数据是存储在磁盘中。
Linux说明:
- Linux中储存文件元数据的区域就叫做inode,每个inode都有一个号码,操作系统用inode号码来识别不同的文件,底层并不认识文件和目录,只认识这个inode编号。Unix/Linux系统内部不使用 文件名,而使用inode号码来识别文件。
- Ens33网卡:用于与其他机器进行网络通信服务,会占用带宽,带宽越大传输速率越快; IO网卡:用于本机通信服务,不占用带宽。
Event:
- Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。
说明:对于所有与时间相关的转义序列,Event Header中必须存在以 "timestamp"的key,除非 \'hdfs.useLocalTimeStamp\' 设置为true,此方法会使用TimestampInterceptor自动添加timestamp。
Flume事务:
- 接收数据通过Source接收数据。
- 事件处理:将source收到的数据传入ChannelProcessor再将数据传递给拦截器,通过拦截器对数据进行拦截检验,筛选出满足条件的数据。
- Put事务:
- Doput:将拦截器处理后的满足条件的数据以batch形式doput到临时缓冲区putList。
- Channel选择器:将putList中的数据经ChannelProcessor,传入ChannelSelector获取事件的Channel列表。
- Docommit:首先docommit检查channel内存队列是否足够合并,如果足够会根据Channel选择器的选择结果将事件写入对应的Channel中,否则会进行事务的回滚,将putList中的数据丢掉等待source重新发送。
- 进入到Channel的Event会通过SinkProcessor获取相应的Sink,并等待Sink来take。
- Take事务:
- DoTake:将Channel中的Event提取到临时缓冲区takelist,并发送到HDFS。
- Docommit:如果takelist中的数据全部发送成功,则清除临时缓冲区中的数据。
- DoRollback:如果数据发送过程中出现了异常,会执行rollback,将临时缓冲区中的数据归还到Channel队列等待再次获取。
说明:
- 事务的四个特性acid:原子性、一致性、隔离性、持久性。
- Channel为双端队列:两头都可以放,两头都可以出,先进先出。
- Flume事务只能保证数据不丢失,但无法保证数据不重复。Source、Sink端有事务保证不会丢失数据,但Channel可能会有数据丢失,最多丢100个Event。
- \'batchsize < transactionCapacity < capacity\'
批次大小,每次往putlist中一次放多少数据。 每次往channel中存放数据的个数,即putlist中可以存放event的大小。 为channel的event大小。
说明:BatchSize大小:Event 1K 左右时,500-1000 合适(默认为1000)
重要组件:
-
Channel Selector:选出Event将要被发往哪个Channel。
- Repilcation Channel Selector(默认):会将source过来的数据发送到所有channel。
- Multiplexing Channel Selector:会根据相应的原则,将不同的Event发往不同的Channel。
-
Sink Processor:
- DefaultSinkProcessor:对应单个的Sink。
- LoadBalancingSinkProcessor:对应Sink Group,可以实现负载均衡的功能。
- FailoverSinkProcessor:对应Sink Group,可以错误恢复的功能。
-
Intercept 拦截器:将source 发送给channel的过程中进行拦截处理,可以添加头部信息、判断body是否合法等,有拦截器才走拦截器,没有不走。
说明:每个Source可以对接多个Channel,每个Channel可以对接多个Sink,每个sink只能获取一个Channel 的数据。
FLume拓扑结构:
-
串联:
- 将多个Flume通过顺序的方式连接,从最初的Source到最终的Sink的目的存储系统,该方式不建议桥接过多的Flume,Flume数量过多不仅会影响传输速率,而且一旦某个flume节点宕机会导致整个传输系统异常。
-
复制和多路复用:
- Flume支持将事件流向一个或多个目的。这种模式可以通过Channel Selector将相同的数据复制到多个Channel中,也可以将不同的数据发送到不同的Channel中,Sink可以选择不同的目的地。
-
负载均衡和故障转移:
-
Flume支持使用将多个sink逻辑上分到一个sink组,Sink组配合不同的SinkProcessor可以实现负载均衡和错误恢复的功能。
- LoadBalancingSinkProcessor:负载均衡,通过轮询的方式传输数据、或者随机的方式给。轮询的方式与channel机制有关,轮询单位Batch,有等待时间。
- FailoverSinkProcessor:故障转移,有active和standby的sink,将数据给active的。
退避:当active的sink故障以后,Standby的sink转换为active的以后会定时的检查原来的sink是否恢复,间隔时间为指数增长,最大为30秒。
-
-
聚合:
- 通过多台服务器去处理前台的并发请求,多台flume服务器向hdfs传输数据时写频率可能比较高,可以通过聚合的方式将多个flume的写数据请求聚合在一个集中收集日志的flume写入hdfs。
Ganglia数据监控:
- Gmod负责监控节点进程,采集各种数据,将数据交给gmetad。
- Gmetad将数据存储到磁盘。
- Gweb会将gmetad存储在磁盘里的数据调出来展示到web页面 。
以上是关于Flume的主要内容,如果未能解决你的问题,请参考以下文章