当前位置: 首页 > 科技观察

Flume架构及源码分析-整体架构

时间:2023-03-13 21:42:53 科技观察

最近在学习Flume的源码,所以想写一篇学习Flume源码的笔记,供有需要的朋友一起学习。1、Flume简介Flume是一家开源的cloudera公司,收集、聚合、可靠传输大量日志数据到存储;通过事务机制提供可靠的消息传输支持,自带负载均衡机制支持层次扩展;并提供了一些默认组件供直接使用。Flume目前常见的应用场景:日志--->Flume--->实时计算(如Kafka+Storm)、日志--->Flume--->离线计算(如HDFS、HBase)、日志--->水槽--->弹性搜索。2、整体架构Flume主要分为三个组件:Source、Channel、Sink;数据流向如下图所示:1.Source负责日志的流入,比如来自文件、网络、Kafka等数据源的数据流入。数据流入方式有两种:训练拉动和事件驱动两种;2、Channel负责数据聚合/暂存,比如暂存到内存、本地文件、数据库、Kafka等,日志数据不会在管道中长时间停留,很快就会被Sink消费掉3、Sink负责数据到存储的传输,比如直接将日志从Channel存储到HDFS、HBase、Kafka、ElasticSearch等,然后在Hadoop、Storm、ElasticSearch等上进行数据分析或查询。一个Agent会有这三个组件同时Source和Sink是异步执行的,不会互相影响。假设我们已经收集并索引了Nginx的访问日志,我们可以这样部署:1.Agent和WebServer部署在同一台机器上;2、Source使用ExecSource,使用tail命令收集日志;3.Channel使用MemoryChannel,因为log数据丢失问题不大;4.Sink使用ElasticSearchSink写入ElasticSearch。这里可以配置多个ElasticSearch服务器IP:PORT列表来提高处理能力。上面描述了日志是如何流动的。对于复杂的日志采集,我们需要过滤Source日志,写入多个Channel,并在Sinks上进行故障处理/负载均衡。Flume默认支持这些:1.Source收集的日志会传递给ChannelProcessor组件,ChannelProcessor组件首先通过Interceptor过滤日志。如果您接触过Servlet,那么概念是相似的。可以参考《Servlet3.1规范翻译——过滤器 》;过滤器可以过滤掉日志,或者修改日志内容;2、过滤完成后,交给ChannelSelector处理。默认提供两个选择器:copy或multiplex选择器;copy表示将一条日志复制到多个Channel;并根据配置的Server条件进行多路复用,将符合条件的路由到相应的Channel;写多个Channel时可能会出现失败,失败的处理有两种方式:稍后重试或忽略。重试通常需要指数时间来重试。我们之前说过,Source生产日志到Channel,Sink从Channel消费日志;它们是完全异步的,所以Sink只需要监听Channel的变化就可以了。此时我们可以过滤/修改Source日志,copy/route一条消息到多个Channel,Sink应该有写入失败。Flume默认提供了以下几种策略:默认策略是Sink,如果失败则表示该事务失败,稍后会重试。Flume还提供了failover策略:Failover策略就是为多个Sinks定义优先级。如果其中一个失败,则路由到下一个优先级的Sink;只要Sink抛出一次异常,就会认为失败,然后从存活的Sink中移除,然后等待指数时间重试。默认等待1s开始重试,最长等待30s。Flume还提供了负载均衡策略:负载均衡算法默认提供两种:round-robintraining和random;它通过抽象出一个类似于ChannelSelector的SinkSelector来进行选择。故障补偿机制与Failover中的算法类似,但故障补偿默认是关闭的。需要将backoff参数设置为true才能启用它。至此,Flume涉及的一些核心组件已经介绍完毕。后面分析组件的时候会讲到Source和Sink是如何异步的,Channel提供的事务机制等等。假设我们需要收集大量的客户端日志,并对它们进行一些缓冲或者集中处理,我们可以部署一个汇聚层。整体架构类似如下:1.首先是日志采集层。该层的代理和应用部署在同一台机器上,负责收集如Nginx的访问日志;然后通过RPC将日志流向收集/聚合层;在这一层,日志应该被快速收集,然后流入收集/聚合层;2.采集/聚合层日志采集或聚合,以及故障转移或负载均衡等容错处理,提高可靠性;此外,该层还可以开辟文件通道,作为数据缓冲区;3.收集/聚合层过滤或修改数据,然后进行存储或处理;比如存储到HDFS,或者流到Kafka然后通过Storm实时处理数据。至此,我们从Flume的核心组件到大致的部署架构有了一个大致的了解,涉及到的一些实现细节将在下一节中详细介绍。【本文为专栏作者张凯涛原创文章,作者微信公众号:凯涛的博客,id:kaitao-1234567】