Flume.apache.org 官方文档学习笔记 part one

Apache Flume

是一个分布式,可靠且可用的系统,用于有效地从许多不同的源收集,聚合和移动大量日志数据到集中式数据存储。

Flume.apache.org 官方文档学习笔记 part one

Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎任何可能的数据源。

Apache Flume是Apache Software Foundation的*项目。

目前有两种版本代码行,版本0.9.x和1.x.

有关0.9.x轨道的文档,请参阅 Flume 0.9.x用户指南。

本文档适用于1.4.x轨道。

鼓励新用户和现有用户使用1.x版本,以便利用最新架构中提供的性能改进和配置灵活性。


系统要求:
    java运行时环境 - Java 1.8或更高版本
    内存 - 源,通道或接收器使用的配置的足够内存
    磁盘空间 - 通道或接收器使用的配置的足够磁盘空间
    目录权限 - 代理使用的目录的读/写权限


架构:
    数据流模型:

        Flume事件被定义为具有字节有效负载和可选字符串属性集的数据流单元。Flume代理是一个(JVM)进程,它承载事件从外部源流向下一个目标(跃点)的组件。

        Flume源消耗由外部源(如Web服务器)传递给它的事件。外部源以目标Flume源识别的格式向Flume发送事件。例如,Avro Flume源可用于从Avro客户端或从Avro接收器发送事件的流中的其他Flume代理接收Avro事件。可以使用Thrift Flume Source定义类似的流程,以接收来自Thrift Sink或Flume Thrift Rpc客户端或Thrift客户端的事件,这些客户端使用Flume thrift协议生成的任何语言编写。当Flume源接收事件时,它将其存储到一个或多个频道。该通道是一个被动存储器,可以保持事件直到它被Flume接收器消耗。文件通道就是一个例子 - 它由本地文件系统支持。接收器从通道中移除事件并将其放入外部存储库(如HDFS(通过Flume HDFS接收器))或将其转发到流中下一个Flume代理(下一跳)的Flume源。给定代理程序中的源和接收器与通道中暂存的事件异步运行。


    复杂的流程:

        Flume允许用户构建多跳流,其中事件在到达最终目的地之前经过多个代理。它还允许扇入
        和扇出流,
        上下文路由和故障跳转的备份路由(故障转移)。

    可靠性
        事件在每个代理的通道中进行。然后将事件传递到流中的下一个代理或终端存储库(如HDFS)。
        只有将事件存储在下一个代理的通道或终端存储库中后,才会从通道中删除这些事件。
        这就是Flume中的单跳消息传递语义如何提供流的端到端可靠性。

        Flume使用事务方法来保证事件的可靠传递。源和接收器分别在事务中封装由信道提供的事务中放置或
        提供的事件的存储/检索。这可确保事件集在流中从一个点到另一个点可靠地传递。在多跳流的
        情况下,来自前一跳的接收器和来自下一跳的源都运行其事务以确保数据安全地存储在下一跳的信道中。

    可恢复性¶:
        事件在通道中进行,该通道管理从故障中恢复。Flume支持一个由本地文件系统支持的持久文件通道。
        还有一个内存通道,它只是将事件存储在内存中的队列中,这更快,但是当代理进程死亡时仍然留在
        内存通道中的任何事件都无法恢复。


    第三方插件目录:
        $FLUME_HOME/plugins.d 在启动的时候, flume-ng 启动脚本会在该目录下查找那些符合下述格式的插件,并且在启动的时候,把他们放到适当的路径。

    数据摄取:

        flume支持大量的机制去读取外部资源的数据。

    RPC :
        flume发行版本中包含的Avro客户端可以使用avro RPC机制 将给定文件发送到flume Avro源。
        $ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10

    执行命令:
        有一个exec源执行给定的吗,命令并消耗输出,输出的单个“线”,文本后跟回车符(‘\r’),或者换行符('\n')或两者在一起。


    网络数据流:
        flume支持以下的这些机制去从流行的日志流中读取数据。例如:
        1.Avro
        2.Thrift
        3.Syslog
        4.Netcat


    设置多代理流:

Flume.apache.org 官方文档学习笔记 part one

        为了使数据能在多个代理或者多跳之间流动,以前每个代理的接收器和现在每一跳的资源都需要是Avro类型,接收器指向源的主机名和端口。

    合并:

          在日志收集的一个很常见的场景是许多生产日志的客户端发送数据到很少部分的连接着存储子系统的消费代理,例如,上百个web服务器收集的日志被发送到一打代理,然后写入他们的hdfs集群。
        
Flume.apache.org 官方文档学习笔记 part one

        这在flume中是可以达到的,只要配置一些第一层代理,使用avro 接收器。所有这些都指向单个代理的avro源,(同时,你也可以使用thrift资源 接收器资源,客户端资源)。这些被第二层代理合并的资源将接受的事件合并到单个信道中,该信道由其接收器消耗到最终的目的地。

       多路复用流:

             flume支持将事件流多路复用到一个或多个目的地。 这可以通过定义多路复用流实现复制或者路由一个事件到一个或者多个信道。

       Flume.apache.org 官方文档学习笔记 part one

     上面的例子展示了资源从代理foo,被扇出去,去到了三个不同的信道。这个扇出可以复制或者多路复用。在复制流的情况下,每个事件被发送到所有三个信道。对于多路复用情况当一个事件的属性和预配置值相匹配,这个事件被递交给可用信道的子集。 例如,如果一个事件的属性“txnType“被设置成”customer“,接下来,他就会去到信道1和信道3,。这个映射可以在代理的配置文件中设置。

     正如前面所提到的,Flume代理配置是从一个类似于等级属性设置的java性质格式文件中读取的。

     为了定义一个单个代理的flow, 你需要通过一个信道去连接资源和接收器,你需要为给出的代理列出这些资源,接收器还有信道,然后将信道和资源指向这个信道。一个实际的资源可以被指定为多路复用信道,但是一个街搜奇只能指定一个信道,格式如下:

      

# list the sources, sinks and channels for the agent
<Agent>.sources = <Source>
<Agent>.sinks = <Sink>
<Agent>.channels = <Channel1> <Channel2>

# set channel for source
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...

# set channel for sink
<Agent>.sinks.<Sink>.channel = <Channel1>

       例如:一个叫做agent_foo的代理,是通过额外的avro客户端读取资源然后通过一个内存信道送到HDFS。配置文件 weblog.config 可以这样:

      

# list the sources, sinks and channels for the agent
agent_foo.sources = avro-appserver-src-1
agent_foo.sinks = hdfs-sink-1
agent_foo.channels = mem-channel-1

# set channel for source
agent_foo.sources.avro-appserver-src-1.channels = mem-channel-1

# set channel for sink
agent_foo.sinks.hdfs-sink-1.channel = mem-channel-1

     这将会让这些事件流从avro-AppSrv-source 到hdfs-cluster1-sink 通过内存信道 mem-channel-1,当这个代理以weblog.config

作为他的配置文件启动时,他会实例化这个流。