flume 1.4的介绍及使用示例

本文将介绍关于flume 1.4的使用示例,如果还没有安装flume的话可以参考:http://blog.csdn.net/zhu_xun/article/details/16958385

在进行使用示例说明之前,先请大家先明确flume中的Source和Sink以及Channel的概念。

flume-ng是flume的新版本的意思,其中“ng”意为new generate(新一代),目前来说,flume 1.4(也就是flume-ng)是最新的版本。

一、flume介绍

flume是个日志收集系统,这个日志收集系统由一个或多个agent(代理)构成,每个agent由三部分构成:Source、Channel、Sink,如下图:

agent结构图

source为水源,是aent获取数据的入口;
channel为管道,是数据(由resource获得)流动的通道,主要作用是用来传输和存储数据;
sink为水槽,用来接收channel传入的数据并将数据输出到指定地方。
大家可以把agent看作一个水管,source就是水管的入口,sink就是水管的出口,把数据当作水来看,数据流也就意味着水流。数据由source获得流经channel,最后传给sink。下图演示了一个完整的agent流程,由webserver获取数据,数据经channel流向sink,最后由sink将数据存储在hdfs里面。


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

再看看下图,下图是将4个agent串在一起,agent1、agent2和agent3都是获取web服务器的数据,然后将各自获得到的数据统一地发送给agent4,最后由agent4将收集到的数据存储在hdfs里面。怎么样,agent的使用是不是很灵活,扩展性也很高,就行拼图一样,想怎么拼就怎么拼。

其实在1个agent里面,对source、channel、sink的个数是无限制的,可以有多个,只要他们能够正确匹配就行。请看下图,这个例子中source获取到的数据被分发给了3个channel,其中sink1将数据输出到hdfs里面,sink2将数据作为jms输出。



agent本质上是一个jvm进程,agent各组件间的工作是通过event事件来触发和协调的。使用agent时候,我们需要在agent的配置文件中设置好配置信息,source、channel、sink都有各自不同的配置选项。

二、flume使用示例

1.通过avro-client客户端向agent发送数据,并打印在屏幕上(也就是输出至日志中):

注意:

a.本文中,以$FLUME代表flume的安装目录。

b.本文中的每个使用示例的配置文件名称皆为:source_sourceType-sink_sinkType.properties。

其中,sourceType表示source的类型,sinkType表示sink的类型。

比如,配置文件source_avro-sink_filerole.properties表示此例中的source类型为avro,sink的类型为filerole,即接收avro客户端传来的数据并将数据输出值本地文件。

c.本文中的channel的类型默认为memory,意为将数据存储至内存。

(1).在$FLUME目录下新建目录test,并在test目录下新建文件source_avro-sink_logger.properties,文件内容如下:

[java] 
view plain
copy

 

  1. <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
  2. #本例中,agent的名称为"a1"
  3. a1.sources = r1
  4. a1.sinks = k1
  5. a1.channels = c1
  6. #source配置信息
  7. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
  8. #(也就是说resource要通过avro-cliet向其发送数据)
  9. a1.sources.r1.type = avro
  10. a1.sources.r1.bind = localhost
  11. a1.sources.r1.port = 44444
  12. #sink配置信息
  13. # type为logger意将数据输出至日志中(也就是打印在屏幕上)
  14. a1.sinks.k1.type = logger
  15. #channel配置信息
  16. #type为memory意将数据存储至内存中
  17. a1.channels.c1.type = memory
  18. a1.channels.c1.capacity = 1000
  19. a1.channels.c1.transactionCapacity = 100
  20. #将source和sink绑定至该channel上
  21. a1.sources.r1.channels = c1
  22. a1.sinks.k1.channel = c1</span>

(2).生成测试源数据:

新建文件file01.txt,并向其中写入如下数据;

hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
hello world 10
(3)启动agent代理:

flume-ng agent -n a1 -f source_avro-sink_logger.properties

(4). 启动avro-client客户端向agent代理发送数据:

flume-ng avro-client -H localhost -p 44444 -F file01

注:启动avro-client客户端要重新开一个会话框

(5).这是可以看到aent的输出信息:

2.通过avro-client客户端向agent发送数据,并将数据输出至本地文件中:

(1).在$FLUME目录下新建目录test,并在test目录下新建文件source_avro-sink_filerole.properties,文件内容如下:

[java] 
view plain
copy

 

  1. <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
  2. #本例中,agent的名称为"a1"
  3. a1.sources = r1
  4. a1.sinks = k1
  5. a1.channels = c1
  6. #source配置信息
  7. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
  8. #(也就是说resource要通过avro-cliet向其发送数据)
  9. a1.sources.r1.type = avroa1.sources.r1.bind = localhosta1.sources.r1.port = 44444
  10. #sink配置信息
  11. #"file_roll"表示将数据存入本地文件系统
  12. a1.sinks.k1.type = file_roll
  13. #指定数据存放目录
  14. a1.sinks.k1.sink.directory = $FLUME/test/result
  15. #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据
  16. #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),
  17. #为0时表示只有一个文件存放数据)
  18. a1.sinks.k1.sink.rollInterval = 0
  19. #channel配置信息
  20. #type为memory意将数据存储至内存中
  21. a1.channels.c1.type = memory
  22. a1.channels.c1.capacity = 1000
  23. a1.channels.c1.transactionCapacity = 100
  24. #将source和sink绑定至该channel上
  25. a1.sources.r1.channels= c1
  26. a1.sinks.k1.channel = c1</span>

同时在$FLUME/test下新建目录result,用来存放agent写入的数据。
(2).生成测试源数据:
同上
(3)启动agent代理:
flume-ng agent -n a1 -f source_avro-sink_filerole.properties
(4). 启动avro-client客户端向agent代理发送数据:
flume-ng avro-client -H localhost -p 44444 -F file01
注:启动avro-client客户端要重新开一个会话框
(5)进入$FLUME/test/result目录:
  这是可以看到新生成的文件"1386378213670-1",这是打开文件看到内容如下:

3.通过avro-client客户端向agent发送数据,并将数据输出至hdfs中:
(1).在$FLUME目录下新建目录test,并在test目录下新建文件source_avro-sink_hdfs.properties,文件内容如下:

[java] 
view plain
copy

 

  1. <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
  2. #本例中,agent的名称为"a1"
  3. a1.sources = r1
  4. a1.sinks = k1
  5. a1.channels = c1
  6. #source配置信息
  7. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
  8. #(也就是说resource要通过avro-cliet向其发送数据)
  9. a1.sources.r1.type = avro
  10. a1.sources.r1.bind = localhost
  11. a1.sources.r1.port = 44444
  12. #加入时间戳拦截器,要不运行时会报异常
  13. a1.sources.r1.interceptors = i1
  14. a1.sources.r1.interceptors.i1.type = timestamp
  15. #sink配置信息
  16. #type为"hdfs"表示将数据存入分布式文件系统(hdfs)
  17. a1.sinks.k1.type = hdfs
  18. a1.sinks.k1.channel = c1
  19. a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
  20. a1.sinks.k1.hdfs.filePrefix = events-
  21. #a1.sinks.k1.hdfs.round = true
  22. #a1.sinks.k1.hdfs.roundValue = 0
  23. #a1.sinks.k1.hdfs.roundUnit = minute
  24. #a1.sinks.k1.hdfs.srollSize = 4000000
  25. #a1.sinks.k1.hdfs.rollCount = 0
  26. a1.sinks.k1.hdfs.writeFormat = Text
  27. a1.sinks.k1.hdfs.fileType = DataStream
  28. #a1.sinks.k1.hdfs.batchSize = 10
  29. #channel配置信息
  30. #type为memory意将数据存储至内存中
  31. a1.channels.c1.type = memory
  32. a1.channels.c1.capacity = 1000
  33. a1.channels.c1.transactionCapacity = 100
  34. #将source和sink绑定至该channel上
  35. a1.sources.r1.channels = c1
  36. a1.sinks.k1.channel = c1</span>

(2).生成测试源数据:
同上
(3).启动hadoop环境
启动hadoop:start-all.sh
删除output目录:hadoop fs -rmr output
为了防止hadoop的安全性问题,可以把hadoop的安全模式关闭掉:hadoop dfsadmin -safemode leave
(4)启动agent代理:
flume-ng agent -n a1 -f source_avro-sink_hdfs.properties
(5). 启动avro-client客户端向agent代理发送数据:
flume-ng avro-client -H localhost -p 44444 -F file01
注:启动avro-client客户端要重新开一个会话框
(6)进入hadoop的output目录:
hadoop fs -cat /flume/events/13-12-07/1220/58/events-.1386390061690
可以看到输出如下:

注:在进入hdfs目录下查看文件时,agent在hdfs里创建的目录和文件名和我上面输入的会不一样,自己注意辨别。
4.将两个agent串起来:
这个示例是将agent01和agent02串起来工作的,agent01获取数据后向agent02输入。
(1).在$FLUME目录下新建目录test,并在test目录下新建文件agent01.properties和agent02.properties,文件内容如下:
 agent01.properties内容如下:

[java] 
view plain
copy

 

  1. <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
  2. #本例中,agent的名称为"a1"
  3. a1.sources = r1
  4. a1.sinks = k1
  5. a1.channels = c1
  6. #source配置信息
  7. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
  8. #(也就是说resource要通过avro-cliet向其发送数据)
  9. a1.sources.r1.type = avro
  10. a1.sources.r1.bind = localhost
  11. a1.sources.r1.port = 44444
  12. # Describe the sink
  13. #a1.sinks.k1.type = logger
  14. #sink配置信息
  15. #k1的type为avro表示该sink将通过avro-client客户端以avro协议通过5555端口发送数据
  16. a1.sinks.k1.type = avro
  17. a1.sinks.k1.hostname = localhost
  18. a1.sinks.k1.port = 55555
  19. #channel配置信息
  20. #type为memory意将数据存储至内存中
  21. a1.channels.c1.type = memory
  22. a1.channels.c1.capacity = 1000
  23. a1.channels.c1.transactionCapacity = 100
  24. #将source和sink绑定至该channel上
  25. a1.sources.r1.channels = c1
  26. a1.sinks.k1.channel = c1</span>

agent02.properties内容如下:

[java] 
view plain
copy

 

  1. <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
  2. #本例中,agent的名称为"a2"
  3. a2.sources = r1
  4. a2.sinks = k1
  5. a2.channels = c1
  6. #source配置信息
  7. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
  8. #(也就是说resource要通过avro-cliet向其发送数据)
  9. a1.sources.r1.type = avro
  10. a1.sources.r1.bind = localhost
  11. a1.sources.r1.port = 55555
  12. #sink配置信息
  13. #type为"file_roll"表示将数据存入本地文件系统
  14. a1.sinks.k1.type = file_roll
  15. #指定数据存放目录
  16. a1.sinks.k1.sink.directory = $FLUME/test/log
  17. #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据
  18. #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),
  19. #为0时表示只有一个文件存放数据)
  20. #a2.sinks.k1.sink.rollInterval = 0
  21. #channel配置信息
  22. #type为memory意将数据存储至内存中
  23. a1.channels.c1.type = memory
  24. a1.channels.c1.capacity = 1000
  25. a1.channels.c1.transactionCapacity = 100
  26. #将source和sink绑定至该channel上
  27. a1.sources.r1.channels = c1
  28. a1.sinks.k1.channel = c1</span>

(2).生成测试源数据:
同上
(3).启动agent代理:
  先启动agent02:flume-ng agent -n a2 -f agent02.properties 
  再启动agent01:flume-ng agent -n a1 -f agent01.properties 
注意:要注意启动顺序,先启动agent02,在启动agent01,要分别在不同的窗口启动
(4). 启动avro-client客户端向agent01代理发送数据:
flume-ng avro-client -H localhost -p 44444 -F file01
注:启动avro-client客户端要重新开一个会话框
(5)进入$FLUME/test/result目录:
  这是可以看到新生成的文件"1386378213670-1",这是打开文件看到内容如下:

未完待续。。。。。。

关于flume-ng的详细介绍和使用说明,希望大家去参考它的官方网址:http://flume.apache.org/FlumeUserGuide.html,在这里我只是做一下简单的使用示例介绍。

flume 1.4的介绍及使用示例的更多相关文章

  1. flume安装及配置介绍(二)

    注: 环境: skylin-linux Flume的下载方式: wget http://www.apache.org/dyn/closer.lua/flume/1.6.0/apache-flume-1 ...

  2. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  3. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  4. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

  5. 关于 AutoResetEvent 的介绍的简单示例

    关于 AutoResetEvent 的介绍的简单示例 直接贴代码了: class Program { static void Main(string[] args) { string result = ...

  6. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  7. 分布式日志收集系统Apache Flume的设计详细介绍

    问题导读: 1.Flume传输的数据的基本单位是是什么? 2.Event是什么,流向是怎么样的? 3.Source:完成对日志数据的收集,分成什么打入Channel中? 4.Channel的作用是什么 ...

  8. DOM4J介绍与代码示例

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...

  9. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

随机推荐

  1. 一起买Beta版本系列文档

    一起买beta版本文档报告汇总 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 一.Beta版本冲 ...

  2. .net走向设计2—设计工具

    1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具

  3. javascript里的封装

    用javascript闭包的特性,可以模拟实现私有变量.私有方法. var myObject = =(function(){ var privateValue; function privateMet ...

  4. Excel导入-----导出(包含所选和全部)操作

    在做系统的时候,很多时候信息量太大,这时候就需要进行Excel表格信息的导入和导出,今天就来给大家说一下我使用Excel表格信息导入和导出的心得. 1:首先需要在前端显示界面View视图中添加导入Ex ...

  5. hdoj 1002 A+B(2)

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  6. C# 加密

    一.RSA加密解密 using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  7. 快手 KSCAD 5.0 矢量图形设计软件

    今天我的快手软件发布了一个最新版本 KSCAD 5.0,免费使用, 详情请看 www.timegis.com 快手 5.0 (KSCAD) 是一款简单易用的矢量绘图软件,其功能和Visio类似,可以绘 ...

  8. 1.本周的作业请参照此文:http://www.ruanyifeng.com/blog/2015/12/git-workflow.html 制定本组项目的GitHub版本更新流程---答题者:徐潇瑞

    首先,介绍一下gitflow,它是最早诞生.并得到广泛采用的一种工作流程.如果采用git flow开发流程,那么项目存在两个常设分支,一个叫主分支master,另一个叫开发分支develop.mast ...

  9. ASP.NET Core 1.0 入门——Application Startup

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  10. iOS 报错 :Duplicate interface definition for class’*'

    这个是重复导入引起的,但是一般的重复导入会在C里的include.而在项目中我们移动项目的位置,比如从某一文件夹移到另一文件夹,路径改变的话会导致项目的中预编译文件PrefixHeader.pch的路 ...