Flume_概述

来源:互联网 发布:2017好看的网络大电影 编辑:程序博客网 时间:2024/05/16 08:13
  1. flume概述

    flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方,比如送到HDFS,简单来说flume就是收集日志的。
    flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume再删除己缓存的数据。

    这里写图片描述

  2. flume架构

    agent本身是一个java进程,运行在日志收集节点—所谓日志收集节点就是服务器节点。agent里面包含3个核心的组件:source—->channel—–>sink,类似生产者、仓库、消费者的架构。

    source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。 source是从一些其他产生数据的应用中接收数据的活跃组件。source可以监听一个或者多个网络端口,用于接收数据或者从本地文件系统读取数据。每个source必须至少连接一个channel。基于一些标准,一个source可以写入几个channel,复制事件到所有或者某些channel。source通过处理器-拦截器-选择器路由写入多个channel。channel选择器是决定每个事件必须写入到source附带的哪个channel组件,而拦截器可以用来插入或删除事件中的数据。

    channel:channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。一般来说channel是被动组件,channel像队列,source写入到它们,sink从它们中读取。多个source可以安全写入到相同的channel,并且多个sink可以从相同的channel读取。但是一个sink只能从一个channel读取。

    sink:sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。sink连续轮询各自的channel来读取和删除事件。sink将事件推送到下一个阶段(RPC Sink的情况下),或到最终的目的地。一旦在下一个阶段或其目的地中数据是安全的,sink通过事务提交通知channel,可以从channel中删除这些事件。sink运行器运行一个sink组,sink组可含有一个或多个sink。如果组中只存在一个sink,那么没有组将更有效率。每个sink组有一个sink处理器,处理器选择组中的sink之一去处理下一个事件集合。

    这里写图片描述

  3. flume拓扑

    flume可以支持多级flume的agent,即flume可以前后相继,例如sink可以将数据写到下一个agent的source中,这样的话就可以连成串了,可以整体处理了。这个flume agent链条可以用于将数据从一个位置移动到另一个位置——特别是从生产数据的应用程序到HDFS、HBase等。agent是一个Java应用程序,接收或者生产数据并缓冲数据,直到最终写入到agent或者存储或者索引系统。flume还支持扇入(fan-in)、扇出(fan-out)。扇入就是source可以接受多个输入,扇出就是sink可以将数据输出多个目的地destination中。

    基于有多少服务器生产多少数据,agent可以组织到一个、两个或者更多的层,每一层的agent使用RPC sink-RPC source的组合,从一层转发数据到另一层。当应用程序产生更多的数据或添加了更多服务器,很容易通过最外层添加更多的agent,并配置它们向第二层的机器写数据来扩展。

    这里写图片描述

  4. event

    在整个数据的传输的过程中,流动的是event,即事务保证是在event级别进行的。event将传输的数据进行封装,是flume传输数据的基本单位,如果是文本文件,通常是一行记录,event也是事务的基本单位。event从source流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。

    事件event具有一个主体和一个报头集合。主体是一个字节数组,通常是flume传送的负载。报头被表示为一个map,其中有字符串key和字符串value。报头并不是用来传输数据的,只为了路由的意图和跟踪发送事件的优先级和严重性。报头也可以用于给事件增加ID或者UUID

  5. 动态路由

    flume的一个重要特性是动态路由。多路复用channel选择器是一种通过特定报头的值,检查每一个经过选择器传入事件的channel选择器,基于此值,它选择一组事件必须写入的channel。这是flume内置的,选择的报头、值和channel却是可配置的。

  6. flume的无数据丢失保证

    flume保证事件至少一次被送到它们的目的地,意味着通过flume到存储系统的发送事件至少将存储一次。如果用例是重复敏感型的,在事件中插入唯一标识符通常是一个好主意。后续的处理工作可以使用这些标识符删除重复的数据。

  7. 批量的重要性

    由于实际调用相关的元数据和所有额外的TCP开销,RPC调用有额外开销。当发送的数据量非常小时,这些开销是每个RPC调用成本的一大部分,导致不必要的网络利用率等。为避免这种开销,单个RPC调用中批量处理几个事件或从远程客户端写入,总是一个好主意。对于最大为几个字节的事件,批量大小在100和1000之间通常性能很好(具体而定)。
    批量太大也会有问题,如:网络上太多的碎片。同时批量太大会增加事件重复的风险,因为每一批失败最终可能会导致大量的事件再次写入,如果有事件已经成功写入HDFS,这些事件最终会重新写入

  8. Hadoop业务的整体开发流程

    这里写图片描述

  9. 设置Agent

    ① 配置单个组件
    Flume agent配置存储在一个本地配置文件中。这是一个跟Java 属性文件格式一样的文本文件。一个或者多个agent可以指定同一个配置文件来进行配置。配置文件包括每个source的属性,agent中的sink和channel以及它们是如何连接构成数据流。

    ② 碎片集合
    agent需要知道每个组件加载什么和它们是怎样连接构成流。这通过列出agent中每个source、sink和channel和指定每个sink和source连接的channel。例如,一个agent流事件从一个称为avroWeb的Avro sources通过一个称为file-channel的文件channel流向一个称为hdfs-cluster1的HDFS sink。配置文档将包含这些组件的名字和avroWeb source和hdfs-cluster1 sink中间共享的file-channel。

    ③ 开始一个agent
    agent通过一个称为flume-ng shell位于Flume项目中bin目录下的脚本来启动。须在命令行中指定一个agent名字,配置目录和配置文档
    bin/flumengagentnagent_name -c conf -f conf/flume-conf.properties.template
    现在agent将会开始运行给定的属性文档中的source和sink。

    ④ 记录原始数据
    通过摄取管道获取记录到Flume log文件的原始数据流大多不会描述生产环境的行为因为数据里面可能包含敏感数据或者安全相关的配置,例如安全密钥。默认情况,Flume不会记录这些信息。另一方面,如果数据管道损坏,Flume会试图提供一些线索来调试问题。
    一个调试事件管道的方法是设置一个额外的内存channel来连接Logger Sink,用来将所有事件数据都记录到Flume log。然而,在一些情况之下,这种方法还是不足以解决问题。
    为了能够记录配置相关的日志,设置-Dorg.apache.flume.log.printconfig=true。这个也可以通过命令行或者在flume-env.sh设置JAVA_OPTS属性。
    为了能够记录数据,通过跟上面相同的方式来设置-Dorg.apache.flume.log.rawdata=true 。对于大部分组件来说,log4j的打印级别必须设置为DEBUG或者TRACE来让指定事件的日志信息出现在Flume log中。
    下面是一个例子能够保证将配置信息和原始数据在log4j的打印级别设置在DEBUG的情况下输出到控制台:

    $ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=DEBUG,console -Dorg.apache.flume.log.printconfig=true -Dorg.apache.flume.log.rawdata=true     

    ⑤ zookeeper基础配置
    Flume支持通过ZooKeeper来配置Agent。这是个实验性的特性。配置文档必须上传到ZooKeeper中,(在一个可配置的前缀下)。这个配置文档存储在ZooKeeper节点数据下。下面是ZooKeeper下的节点树结构:

    - /flume |- /a1 [Agent config file] |- /a2 [Agent config file]

    一旦配置文档上传完成,通过下面选项来启动agent

    $ bin/flume-ng agent –conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console

    ⑥ 安装第三方插件
    Flume拥有一个全备的插件架构。虽然Flume自带许多开箱即用的sources、channel,sinks和serializers等,同时也存在许多跟Flume之外的实现。
    Flume曾经支持在flume-env.sh中的FLUME_CLASSPATH中添加一些自定义的Flume组件,现在Flume支持一个特殊路径plugins.d自动地安装那些按照指定格式存储的插件。
    这个plugins.d目录位于FLUME_HOME/plugins.d。在启动的时候,flume-ng启动脚本扫描plugins.d目录下的遵循格式的插件并在启动java时将它们放在合适的路径。
    在plugins.d下的每个插件(子目录)包含三个子目录:
    1).lib – 插件的jar包
    2).libext – 插件的依赖jar包
    3).native – 任何需要的本地库,例如.so文档。

  10. 数据获取

    Flume支持从外部来源获取数据的一系列机制。
    ① RPC
    Flume 中的Avro client 可以用avro RPC 机制来发送一个给定文档给Flume Avro source。
    $ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10
    上面的命令行发送/usr/logs/log.10的内容给监听在那个端口的Flume source。

    ② Executing commands(执行命令行)
    由一个执行source来执行给出的命令和消费输出。输出的一行文本带着(‘\r’)或者(‘\n’)或者两者皆有。
    说明:Flume不支持一个结尾符作为一个资源。所以可以用一个可执行的源码来包装结尾命令输出文件。

    ③ Network streams
    Flume支持下面的机制来读取受欢迎的日志类型,例如:
    1).Avro
    2).Thrift
    3).Syslog
    4).Netcat

原创粉丝点击