Hadoop学习笔记—19.Flume框架学习

START:Flume是Cloudera提供的一个高可用的、高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地。这里的日志是一个统称,泛指文件、操作记录等许多数据。

一、Flume基础理论

1.1 常见的分布式日志收集系统

  Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用。 Chukwa 是一个开源的用于监控大型分布式系统的数据收集系统。这是构建在 hadoop 的 hdfs 和 map/reduce 框架之上的,继承了 hadoop 的可伸缩性和鲁棒性。而 Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。

1.2 Flume的数据流模型

  Flume的核心把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。

   Flume传输的数据的基本单位Event,如果是文本文件,通常是一行记录,这也是事务的基本单位。Event 从 Source 流向 Channel,再到 Sink,本身为一个byte数组,并可携带headers信息。Event代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的地去。

1.3 Flume的三大核心组件

  Flume运行的核心是Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是sourcechannelsink。通过这些组件,Event可以从一个地方流向另一个地方,如图1所示。

图1  Flume数据流模型

  一个flume系统可以由一个或多个agent组成,多个agent只要做一些简单的配置就可以串在一起,比如将两个agent(foo、bar)串在一起工作,只要将bar的source(入口)接在foo的sink(出口)上就可以了。如图2所示。

图2  多级Agent连接模型

  图3则展示了将4个agent串在一起,agent1、agent2和agent3都是获取web服务器的数据,然后将各自获得到的数据统一地发送给agent4,最后由agent4将收集到的数据存储在hdfs里面。

图3  多对一的合并模型

  (1)什么是Agent?

  Flume的核心是agent。agent是一个java进程,运行在日志收集端,通过agent接收日志,然后暂存起来,再发送到目的地。

  (2)三大核心组件

  ①Source:专用于收集日志,可以处理各种类型各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义等。

  ②Channel:专用于临时存储数据,可以存放在memory、jdbc、file、数据库、自定义等。其存储的数据只有在sink发送成功之后才会被删除。

  ③Sink:专用于把数据发送到目的地点,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定义等。

理解Source、Channel与Sink:

source为水源,是aent获取数据的入口;

channel为管道,是数据(由resource获得)流动的通道,主要作用是用来传输和存储数据;

sink为水槽,用来接收channel传入的数据并将数据输出到指定地方。 

大家可以把agent看作一个水管,source就是水管的入口,sink就是水管的出口,把数据当作水来看,数据流也就意味着水流。数据由source获得流经channel,最后传给sink。如图1就演示了一个完整的agent流程,由webserver获取数据,数据经channel流向sink,最后由sink将数据存储在hdfs里面。 

1.3 Flume的可靠性保证

  Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据
  Flume使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把Event从Channel中remove掉。这样数据流里的event无论是在一个agent里还是多个agent之间流转,都能保证可靠,因为以上的事务保证了event会被成功存储起来。而Channel的多种实现在可恢复性上有不同的保证。也保证了event不同程度的可靠性。比如Flume支持在本地保存一份文件channel作为备份,而memory channel将event存在内存queue里,速度快,但丢失的话无法恢复。

二、Flume基础实践

2.1 Flume基本安装

  (1)下载flume的安装包,这里选择的是1.4.0版本的,我已经将其上传到了网盘中(http://pan.baidu.com/s/1kTEFUfX

  (2)解压缩bin与src包,并重命名

Step1.解压缩两个包

tar -zvxf libs/apache-flume-1.4.0-bin.tar.gz

tar -zvxf libs/apache-flume-1.4.0-src.tar.gz

Step2.将源码包拷贝到bin目录中

cp -ri apache-flume-1.4.0-src/* apache-flume-1.4.0-bin/

Step3.【可选】重命名为flume

mv apache-flume-1.4.0-bin flume

2.2 Flume基本配置

  本次实践示例Source来自Spooling Directory,Sink流向HDFS。监控/root/edisonchou文件目录下的文件,一旦有新文件,就立刻将文件内容通过agent流向HDFS的hdfs://hadoop-master:9000/testdir/edisonchou文件中。在这之前,我们需要对flume进行基本的配置。

  首先,进入flume的conf目录下,新建一个example.conf,其对三大核心组件的配置如下:

  (1)配置source

agent1.sources.source1.type=spooldir
agent1.sources.source1.spoolDir=/root/edisonchou
agent1.sources.source1.channels=channel1
agent1.sources.source1.fileHeader = false
agent1.sources.source1.interceptors = i1
agent1.sources.source1.interceptors.i1.type = timestamp

  (2)配置channel

agent1.channels.channel1.type=file
agent1.channels.channel1.checkpointDir=/root/edisonchou_tmp/123
agent1.channels.channel1.dataDirs=/root/edisonchou_tmp/

  (3)配置sink

agent1.sinks.sink1.type=hdfs
agent1.sinks.sink1.hdfs.path=hdfs://hadoop-master:9000/testdir/edisonchou
agent1.sinks.sink1.hdfs.fileType=DataStream
agent1.sinks.sink1.hdfs.writeFormat=TEXT
agent1.sinks.sink1.hdfs.rollInterval=1
agent1.sinks.sink1.channel=channel1
agent1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d

2.3 监控指定目录测试

  (1)启动hadoop,老命令:start-all.sh

  (2)新建文件夹/root/edisonchou,并在HDFS中新建目录/testdir/edisonchou

  (3)在flume目录中执行以下命令启动示例agent

bin/flume-ng agent -n agent1 -c conf -f conf/example.conf -Dflume.root.logger=DEBUG,console

  出现上图所示时,说明agent启动成功了。

  (4)新开一个SSH连接,在该连接中新建一个文件test,随便写点内容,然后将其移动到/root/edisonchou目录中,这时再查看上一个连接中的控制台信息如下,可以发现以下几点信息:

  可以发现,当我们向监控目录/root/edisonchou中新增一个文件时,agent立即向HDFS写入了这个文件,其中经历了大概三步:创建、关闭、重命名。在重命名步骤中,主要是将.tmp后缀移除。下图展示了我们向监控目录加入的文件test已经通过agent加入了HDFS中:

  

参考资料

(1)hanlong,《Flume—开源分布式日志收集系统》:http://www.cnblogs.com/hanganglin/articles/4224928.html

(2)windcarp,《Flume采集处理日志文件》:http://www.cnblogs.com/windcarp/p/3872578.html

(3)我的小人生,《Flume 1.4的介绍及使用》:http://www.cnblogs.com/fuhaots2009/p/3473122.html

(4)残夜,《Flume日志收集》:http://www.cnblogs.com/oubo/archive/2012/05/25/2517751.html

(5)sandyfog,《Flume的概述和简单实例》:http://www.cnblogs.com/sandyfog/p/3795967.html

(6)apache,《flume文档》:http://flume.apache.org/documentation.html

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

时间: 2024-08-08 18:17:14

Hadoop学习笔记—19.Flume框架学习的相关文章

Hadoop学习笔记—18.Sqoop框架学习

一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop.随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求. Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是松散型数据. 一.HBase:BigTable的开源实现 1.1 HBase出现的背景 (1)随着数据规模越来越大,大量业务场景开始考虑数据存储水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器. (2)海量数据量存储成为瓶颈,单台机器无法负载大量数据. (3)单台机器IO读

Hadoop学习笔记—16.Pig框架学习

一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算.Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口. Compare:相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构.

Hadoop学习笔记—17.Hive框架学习

一.Hive:一个牛逼的数据仓库 1.1 神马是Hive? Hive 是建立在 Hadoop 基础上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机制.Hive 定义了简单的类 SQL  查询语言,称为 QL ,它允许熟悉 SQL  的用户查询数据.同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper  和 reducer 来处理内建的 mapper 和 reduce

Hadoop学习笔记—15.HBase框架学习(基础实践篇)

一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先,准备好HBase的安装包,我这里使用的是HBase-0.94.7的版本,已经上传至百度网盘之中(URL:http://pan.baidu.com/s/1pJ3HTY7) (1)通过FTP将hbase的安装包拷贝到虚拟机hadoop-master中,并执行一系列操作:解压缩.重命名.设置环境变量 ①

tornado学习笔记19 Tornado框架分析

19.1 Http服务器请求处理流程图   (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen socket对象: (3) 调用add_hander方法,将初始化的listen socket对象添加至IOLoop池中,这时的socket就开始监听来自客户端的请求. (4) 客户端发送HTTP请求: (5) listen socket监听到客户端的请求,调用listen socket的accep

Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用实现数据库基本操作.. 1.DAO..   DAO..这个说法大家都不陌生..数据库操作访问对象的抽象接口层..在DAO内部封装好通用的方法..然后再使用一个具体类来进行实现..在我们想要调用这些方法对数据库进行相关操作时..只需要传递数据实体对象,就可以通过实体对象的传递从而实现对数据库进行操作.

Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现有参Http Get请求...   AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼主对比了两个框架中的源码...Volley更多的地方是使用抽象方法封装在接口

Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行