• flume 1.4的介绍及使用示例


    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 在CODE上查看代码片 派生到我的代码片
     
    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.   
    7. #source配置信息  
    8. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动  
    9. #(也就是说resource要通过avro-cliet向其发送数据)  
    10. a1.sources.r1.type = avro  
    11. a1.sources.r1.bind = localhost  
    12. a1.sources.r1.port = 44444  
    13.   
    14. #sink配置信息  
    15. # type为logger意将数据输出至日志中(也就是打印在屏幕上)  
    16. a1.sinks.k1.type = logger  
    17.   
    18. #channel配置信息  
    19. #type为memory意将数据存储至内存中  
    20. a1.channels.c1.type = memory  
    21. a1.channels.c1.capacity = 1000  
    22. a1.channels.c1.transactionCapacity = 100  
    23.   
    24. #将source和sink绑定至该channel上  
    25. a1.sources.r1.channels = c1  
    26. 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 在CODE上查看代码片 派生到我的代码片
     
    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.   
    7. #source配置信息  
    8. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动  
    9. #(也就是说resource要通过avro-cliet向其发送数据)  
    10. a1.sources.r1.type = avroa1.sources.r1.bind = localhosta1.sources.r1.port = 44444  
    11. #sink配置信息  
    12. #"file_roll"表示将数据存入本地文件系统  
    13. a1.sinks.k1.type = file_roll  
    14. #指定数据存放目录  
    15. a1.sinks.k1.sink.directory = $FLUME/test/result  
    16. #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据  
    17. #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),  
    18. #为0时表示只有一个文件存放数据)  
    19. a1.sinks.k1.sink.rollInterval = 0   
    20.   
    21. #channel配置信息  
    22. #type为memory意将数据存储至内存中  
    23. a1.channels.c1.type = memory  
    24. a1.channels.c1.capacity = 1000  
    25. a1.channels.c1.transactionCapacity = 100  
    26.   
    27. #将source和sink绑定至该channel上  
    28. a1.sources.r1.channels= c1  
    29. 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 在CODE上查看代码片 派生到我的代码片
     
    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.   
    7. #source配置信息  
    8. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动  
    9. #(也就是说resource要通过avro-cliet向其发送数据)  
    10. a1.sources.r1.type = avro  
    11. a1.sources.r1.bind = localhost  
    12. a1.sources.r1.port = 44444  
    13.   
    14. #加入时间戳拦截器,要不运行时会报异常  
    15. a1.sources.r1.interceptors = i1  
    16. a1.sources.r1.interceptors.i1.type = timestamp  
    17.   
    18. #sink配置信息  
    19. #type为"hdfs"表示将数据存入分布式文件系统(hdfs)  
    20. a1.sinks.k1.type = hdfs  
    21. a1.sinks.k1.channel = c1  
    22. a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S  
    23. a1.sinks.k1.hdfs.filePrefix = events-  
    24. #a1.sinks.k1.hdfs.round = true  
    25. #a1.sinks.k1.hdfs.roundValue = 0  
    26. #a1.sinks.k1.hdfs.roundUnit = minute  
    27. #a1.sinks.k1.hdfs.srollSize = 4000000  
    28. #a1.sinks.k1.hdfs.rollCount = 0    
    29. a1.sinks.k1.hdfs.writeFormat = Text  
    30. a1.sinks.k1.hdfs.fileType = DataStream  
    31. #a1.sinks.k1.hdfs.batchSize = 10  
    32.   
    33. #channel配置信息  
    34. #type为memory意将数据存储至内存中  
    35. a1.channels.c1.type = memory  
    36. a1.channels.c1.capacity = 1000  
    37. a1.channels.c1.transactionCapacity = 100  
    38.   
    39. #将source和sink绑定至该channel上  
    40. a1.sources.r1.channels = c1  
    41. 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 在CODE上查看代码片 派生到我的代码片
     
    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.   
    7. #source配置信息  
    8. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动  
    9. #(也就是说resource要通过avro-cliet向其发送数据)  
    10. a1.sources.r1.type = avro  
    11. a1.sources.r1.bind = localhost  
    12. a1.sources.r1.port = 44444  
    13.   
    14. # Describe the sink  
    15. #a1.sinks.k1.type = logger  
    16.   
    17. #sink配置信息  
    18. #k1的type为avro表示该sink将通过avro-client客户端以avro协议通过5555端口发送数据  
    19. a1.sinks.k1.type = avro  
    20. a1.sinks.k1.hostname = localhost  
    21. a1.sinks.k1.port = 55555  
    22.   
    23. #channel配置信息  
    24. #type为memory意将数据存储至内存中  
    25. a1.channels.c1.type = memory  
    26. a1.channels.c1.capacity = 1000  
    27. a1.channels.c1.transactionCapacity = 100  
    28.   
    29. #将source和sink绑定至该channel上  
    30. a1.sources.r1.channels = c1  
    31. a1.sinks.k1.channel = c1</span>  

    agent02.properties内容如下:

    [java]  view plain copy 在CODE上查看代码片 派生到我的代码片
     
    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.   
    7.   
    8. #source配置信息  
    9. #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动  
    10. #(也就是说resource要通过avro-cliet向其发送数据)  
    11. a1.sources.r1.type = avro  
    12. a1.sources.r1.bind = localhost  
    13. a1.sources.r1.port = 55555   
    14.   
    15.   
    16. #sink配置信息  
    17. #type为"file_roll"表示将数据存入本地文件系统  
    18. a1.sinks.k1.type = file_roll  
    19. #指定数据存放目录  
    20. a1.sinks.k1.sink.directory = $FLUME/test/log  
    21. #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据  
    22. #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),  
    23. #为0时表示只有一个文件存放数据)  
    24. #a2.sinks.k1.sink.rollInterval = 0   
    25.   
    26.   
    27. #channel配置信息  
    28. #type为memory意将数据存储至内存中  
    29. a1.channels.c1.type = memory  
    30. a1.channels.c1.capacity = 1000  
    31. a1.channels.c1.transactionCapacity = 100  
    32.   
    33.   
    34. #将source和sink绑定至该channel上  
    35. a1.sources.r1.channels = c1  
    36. 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,在这里我只是做一下简单的使用示例介绍。


  • 相关阅读:
    如何修改SVN中的用户名和密码
    Telerik_2012_Q3 RadGrid 汉化
    DXperience-12.1.5 官网下载+注册破解+帮助文档
    Telerik_2012_Q3 (已破解)全套下载链接
    WinForm 控件库
    向项目的文件夹中写入数据流
    coolcarousel 图片轮播缩放问题
    IOS开发UI篇--使用CAShapeLayer实现复杂的View的遮罩效果
    iOS开发
    解析 iOS 动画原理与实现
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3473122.html
Copyright © 2020-2023  润新知