Flume 入门

一: Flume是什么:

1. 有Cloudera公司开源
2. 分布式,可靠,高可用的海量日志采集系统;
3. 数据源可定制,可扩展;
4.  数据存储系统可定制,可扩展;
5. 中间件,屏蔽了数据源和数据存储之间的耦合。

二: 特点:

1. 可靠性
      可以根据对可靠性的要求设置不同的数据存储来保证数据的可靠性,比如可以保存在内容,保存到磁盘;
2. 可扩展性
      各组件数据可扩展, source, channel, sink都可扩展
3.  高性能
      高吞吐率,可以满足海量数据的收集需求
4.可管理性
      可动态的增加和删除节点
5.活跃的社区

三: Flume版本介绍

 1. Flume OG: Original Generation
      o.9.x或cdh3以及更早版本 
     主要由agent, collector, master等组件构成。

 2. Flume NG: NEW Generation
       1.x或cdh4以后的版本
       主要有Agent,Client等组件构成
       NG版本的退出主要是为了简化代码,简化架构;

四: Flume NG基本架构

《Flume 入门》 20160530190347644.png

五: Flume NG核心概念

1.agent: agent本身是一个java进程,运行在日志收集节点—所谓日志收集节点就是服务器节点.
           source—->channel—–>sink,类似生产者、仓库、消费者的架构
2.source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,
           包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。 
3.channel:source组件把数据收集来以后,临时存放在channel中;
            即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。
4.sink:  sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义。

六:  Flume 运行机制

flume的核心就是一个agent,这个agent对外有两个进行交互的地方,一个是接受数据的输入——source,一个是数据的输出sink;
sink负责将数据发送到外部指定的目的地。source接收到数据之后,将数据发送给channel;
chanel作为一个数据缓冲区会临时存放这些数据,随后sink会将channel中的数据发送到指定的地方—-例如HDFS等;
注意:只有在sink将channel中的数据成功发送出去之后,channel才会将临时数据进行删除,这种机制保证了数据传输的可靠性与安全性。

七: Event

    flume的核心是把数据从数据源(source)收集过来,在将收集到的数据送到指定的目的地(sink)。
为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。 
在整个数据的传输的过程中,流动的是event,即事务保证是在event级别进行的。那么什么是event呢?—–event将传输的数据进行封装,是flume传输数据的基本单位,如果是文本文件,通常是一行记录,event也是事务的基本单位。
event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。 为了方便大家理解,给出一张event的数据流向图: 

《Flume 入门》 20160530163300022.png

八: Client

Client是一个将原始log包装成events并且发送他们到一个或者多个agent.
其目的是从解耦, 但不是必须的;

九: Agent

一个Agent包含Source,Channel,Sink和其他组件;
它利用这些组件将event从一个节点传输到另一个节点;
agent是flume流的基础部分;

十: Agent->Source, 概述

Sources负责接收event或通过特殊机制产生event,并将events批量的放到一个或者多个Channel
包含event驱动和轮询2种类型
不同类型的Sources:
与系统集成的Sources: 
  Syslog:
  Netcat:指定的网络端口,即只要应用程序向这个端口里面写数据,这个source组件就可以获取到信息
  Exec:  监听一个指定的命令,获取一条命令的结果作为它的数据源
  TailDir: 监听文件内容, 一旦新写入一行新数据,则读取之; 支持断点续读, 定期将最新读取数据的偏移量写入json文件, 根据文件修改时间觉得读取优先级, 最新的文件优先读取;目前只支持文本文件;
  Spooling Directory Source:监听一个指定的目录,即只要应用程序向这个指定的目录中添加新的文件,source组件就可以获取到该信息,并解析该文件的内容,然后写入到channle。写入完成后,标记该文件已完成或者删除该文件。
  Avro, Thrift: 监听一个指定的Avro 端口,通过Avro 端口可以获取到Avro client发送过来的文件 。
      即只要应用程序通过Avro 端口发送文件,source组件就可以获取到该文件中的内容。 
      (注:Avro和Thrift都是一些序列化的网络端口–通过这些网络端口可以接受或者发送信息,
      Avro可以发送一个给定的文件给Flume,Avro 源使用AVRO RPC机制) 
Sources 必须要和一个channel关联.

十一: Agent->Channel

Channel位于Source和Sink之间,用于缓存event;
当Source接收到数据之后,将数据发送给Channel,Chanel作为一个数据缓冲区会临时存放这些数据,
随后sink会将Channel中的数据发送到指定的地方—-例如HDFS等,
注意:只有在sink将Channel中的数据成功发送出去之后,Channel才会将临时数据进行删除,这种机制保证了数据传输的可靠性与安全性

不同的Channel提供的持久化水平也是不一样的:
Memory Channel:; volatile
File Channel: 基于WAL(预写式日志)实现
JDBC Channel: 基于Database实现

十二: Agent->Sink

Sink负责将event传输到最终目的地,成功后将event从Channel移除.
不同类型的Sink:
存储event到最终目的终端Sink: 比如:HDFS,HBase
自动消耗Sink: Null Sink
用于Agent间通信: Avro

十三: 数据库全量和增量导入系统

全量导入:
    Sqoop
增量导入:
    Canal(https://github.com/alibaba/canal)
    DataBus(https://github.com/linkedin/databus)

十四: Sqoop: SQL-to-Hadoop

连接传统关系型数据库和Hadoop的桥梁
把关系型数据库的数据导入到Hadoop(Hdfs, Hbase, Hive)中;
利用MapReduce加快数据传输速度;
批处理方式进行数据传输;
优势:
    1. 高效,可控地利用资源
          任务并行度,超时时间等;
    2.   数据类型映射与转换
          可自动进行,用户也可以自定义
    3.支持多种数据库
          Mysql, Oracle, PostgreSQL
    原文作者:曹振华
    原文地址: https://www.jianshu.com/p/a78307915e76
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞