Flume

Flume

Flume 概述:

  1. 特点:高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
  2. 选Flume的原因:FLume是流式传输实时处理的。
  3. 数据的传输过程:没有将用户产生的日志直接传输给大数据平台,而是传给日志服务器,可以按自己的需求方式去日志服务器获取。 不希望以你的方式来传输而时希望以我的方式去拿。
  4. 日志:
    • <1>框架工作时候产生日志;
    • <2>用户的操作行为被后台服务器收集后产生的用户行为日志。
  5. Log4j:通过日志(log4j)的方式打印日志。
  6. 日志的级别:Debug、Info、 Warn、 Error。

Flume基础架构:

WebServer -> Agent -> HDFS

Agent:JVM进程,由Source、Channel、Sink组成。

  1. 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记录每次读取文件位置,实现断点续传。

  2. Sink:不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。

    • Hdfs Sink: 将监控到的数据上传到 HDFS中。
    • Logger Sink: 将监控到的数据打印到控制台。
    • Avro Sink:可以将本级Flume采集的数据通过AvroSink传递给下一层Flume的AvroSource处理。

    说明:没有用 Logger.Sink 的时候尽量要写上 flume.root.logger= INFO,console 这样可以将flume框架的信息打印到控制台上,当出现错误时会将错误信息输出到控制台上,否则输出到日志文件中,当出现错误时无法即使的观测到错误信息。

  3. 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事务:

  1. 接收数据通过Source接收数据。
  2. 事件处理:将source收到的数据传入ChannelProcessor再将数据传递给拦截器,通过拦截器对数据进行拦截检验,筛选出满足条件的数据。
  3. Put事务:
    • Doput:将拦截器处理后的满足条件的数据以batch形式doput到临时缓冲区putList。
    • Channel选择器:将putList中的数据经ChannelProcessor,传入ChannelSelector获取事件的Channel列表。
    • Docommit:首先docommit检查channel内存队列是否足够合并,如果足够会根据Channel选择器的选择结果将事件写入对应的Channel中,否则会进行事务的回滚,将putList中的数据丢掉等待source重新发送。
  4. 进入到Channel的Event会通过SinkProcessor获取相应的Sink,并等待Sink来take。
  5. Take事务:
    • DoTake:将Channel中的Event提取到临时缓冲区takelist,并发送到HDFS。
    • Docommit:如果takelist中的数据全部发送成功,则清除临时缓冲区中的数据。
    • DoRollback:如果数据发送过程中出现了异常,会执行rollback,将临时缓冲区中的数据归还到Channel队列等待再次获取。
说明:
  1. 事务的四个特性acid:原子性、一致性、隔离性、持久性。
  2. Channel为双端队列:两头都可以放,两头都可以出,先进先出。
  3. Flume事务只能保证数据不丢失,但无法保证数据不重复。Source、Sink端有事务保证不会丢失数据,但Channel可能会有数据丢失,最多丢100个Event。
  4. 'batchsize < transactionCapacity < capacity'
    • 批次大小,每次往putlist中一次放多少数据。
    • 每次往channel中存放数据的个数,即putlist中可以存放event的大小。
    • 为channel的event大小。

说明:BatchSize大小:Event 1K 左右时,500-1000 合适(默认为1000)

重要组件:

  1. Channel Selector:选出Event将要被发往哪个Channel。

    • Repilcation Channel Selector(默认):会将source过来的数据发送到所有channel。
    • Multiplexing Channel Selector:会根据相应的原则,将不同的Event发往不同的Channel。
  2. Sink Processor:

    • DefaultSinkProcessor:对应单个的Sink。
    • LoadBalancingSinkProcessor:对应Sink Group,可以实现负载均衡的功能。
    • FailoverSinkProcessor:对应Sink Group,可以错误恢复的功能。
  3. Intercept 拦截器:将source 发送给channel的过程中进行拦截处理,可以添加头部信息、判断body是否合法等,有拦截器才走拦截器,没有不走。

    说明:每个Source可以对接多个Channel,每个Channel可以对接多个Sink,每个sink只能获取一个Channel 的数据。

FLume拓扑结构:

  1. 串联:

    • 将多个Flume通过顺序的方式连接,从最初的Source到最终的Sink的目的存储系统,该方式不建议桥接过多的Flume,Flume数量过多不仅会影响传输速率,而且一旦某个flume节点宕机会导致整个传输系统异常。
  2. 复制和多路复用:

    • Flume支持将事件流向一个或多个目的。这种模式可以通过Channel Selector将相同的数据复制到多个Channel中,也可以将不同的数据发送到不同的Channel中,Sink可以选择不同的目的地。
  3. 负载均衡和故障转移:

    • Flume支持使用将多个sink逻辑上分到一个sink组,Sink组配合不同的SinkProcessor可以实现负载均衡和错误恢复的功能。

      • LoadBalancingSinkProcessor:负载均衡,通过轮询的方式传输数据、或者随机的方式给。轮询的方式与channel机制有关,轮询单位Batch,有等待时间。
      • FailoverSinkProcessor:故障转移,有active和standby的sink,将数据给active的。

      退避:当active的sink故障以后,Standby的sink转换为active的以后会定时的检查原来的sink是否恢复,间隔时间为指数增长,最大为30秒。

  4. 聚合:

    • 通过多台服务器去处理前台的并发请求,多台flume服务器向hdfs传输数据时写频率可能比较高,可以通过聚合的方式将多个flume的写数据请求聚合在一个集中收集日志的flume写入hdfs。

Ganglia数据监控:

  • Gmod负责监控节点进程,采集各种数据,将数据交给gmetad。
  • Gmetad将数据存储到磁盘。
  • Gweb会将gmetad存储在磁盘里的数据调出来展示到web页面 。
posted @ 2021-05-30 23:48  yuexiuping  阅读(143)  评论(0编辑  收藏  举报