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 1.4的介绍及使用示例_第1张图片
上面说到了一个flume系统可以由一个或多个agent组成,多个agent只要做一些简单的配置就可以串在一起,比如将两个agent(foo、bar)串在一起工作,只要将bar的source(入口)接在foo的sink(出口)上就可以了。如下图:
flume 1.4的介绍及使用示例_第2张图片
再看看下图,下图是将4个agent串在一起,agent1、agent2和agent3都是获取web服务器的数据,然后将各自获得到的数据统一地发送给agent4,最后由agent4将收集到的数据存储在hdfs里面。怎么样,agent的使用是不是很灵活,扩展性也很高,就行拼图一样,想怎么拼就怎么拼。
flume 1.4的介绍及使用示例_第3张图片
其实在1个agent里面,对source、channel、sink的个数是无限制的,可以有多个,只要他们能够正确匹配就行。请看下图,这个例子中source获取到的数据被分发给了3个channel,其中sink1将数据输出到hdfs里面,sink2将数据作为jms输出。



agent本质上是一个jvm进程,agent各组件间的工作是通过event事件来触发和协调的。使用agent时候,我们需要在agent的配置文件中设置好配置信息,source、channel、sink都有各自不同的配置选项。
flume常用组件的详细介绍如下表所示:
  • Flume Source
Source类型 说明
Avro Source 支持Avro协议(实际上是Avro RPC),内置支持
Thrift Source 支持Thrift协议,内置支持
Exec Source 基于Unix的command在标准输出上生产数据
JMS Source 从JMS系统(消息、主题)中读取数据,ActiveMQ已经测试过
Spooling Directory Source 监控指定目录内数据变更
Twitter 1% firehose Source 通过API持续下载Twitter数据,试验性质
Netcat Source 监控某个端口,将流经端口的每一个文本行数据作为Event输入
Sequence Generator Source 序列生成器数据源,生产序列数据
Syslog Sources 读取syslog数据,产生Event,支持UDP和TCP两种协议
HTTP Source 基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式
Legacy Sources 兼容老的Flume OG中Source(0.9.x版本)
  • Flume Channel
Channel类型 说明
Memory Channel Event数据存储在内存中
JDBC Channel Event数据存储在持久化存储中,当前Flume Channel内置支持Derby
File Channel Event数据存储在磁盘文件中
Spillable Memory Channel Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件(当前试验性的,不建议生产环境使用)
Pseudo Transaction Channel 测试用途
Custom Channel 自定义Channel实现
  • Flume Sink
Sink类型 说明
HDFS Sink 数据写入HDFS
Logger Sink 数据写入日志文件
Avro Sink 数据被转换成Avro Event,然后发送到配置的RPC端口上
Thrift Sink 数据被转换成Thrift Event,然后发送到配置的RPC端口上
IRC Sink 数据在IRC上进行回放
File Roll Sink 存储数据到本地文件系统
Null Sink 丢弃到所有数据
HBase Sink 数据写入HBase数据库
Morphline Solr Sink 数据发送到Solr搜索服务器(集群)
ElasticSearch Sink 数据发送到Elastic Search搜索服务器(集群)
Kite Dataset Sink 写数据到Kite Dataset,试验性质的
Custom Sink 自定义Sink实现

另外还有Channel Selector、Sink Processor、Event Serializer、Interceptor等组件,可以参考官网提供的用户手册。

二、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.   
  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
  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
  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
可以看到输出如下:

flume 1.4的介绍及使用示例_第4张图片

注:在进入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.   
  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
  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,在这里我只是做一下简单的使用示例介绍。


你可能感兴趣的:(Flume,Flume,1.4使用示例,1.4的介绍及使用示例)