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结构图
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,文件内容如下:
- <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
- #本例中,agent的名称为"a1"
- a1.sources = r1
- a1.sinks = k1
- a1.channels = c1
- #source配置信息
- #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
- #(也就是说resource要通过avro-cliet向其发送数据)
- a1.sources.r1.type = avro
- a1.sources.r1.bind = localhost
- a1.sources.r1.port = 44444
- #sink配置信息
- # type为logger意将数据输出至日志中(也就是打印在屏幕上)
- a1.sinks.k1.type = logger
- #channel配置信息
- #type为memory意将数据存储至内存中
- a1.channels.c1.type = memory
- a1.channels.c1.capacity = 1000
- a1.channels.c1.transactionCapacity = 100
- #将source和sink绑定至该channel上
- a1.sources.r1.channels = c1
- 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,文件内容如下:
- <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
- #本例中,agent的名称为"a1"
- a1.sources = r1
- a1.sinks = k1
- a1.channels = c1
- #source配置信息
- #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
- #(也就是说resource要通过avro-cliet向其发送数据)
- a1.sources.r1.type = avroa1.sources.r1.bind = localhosta1.sources.r1.port = 44444
- #sink配置信息
- #"file_roll"表示将数据存入本地文件系统
- a1.sinks.k1.type = file_roll
- #指定数据存放目录
- a1.sinks.k1.sink.directory = $FLUME/test/result
- #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据
- #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),
- #为0时表示只有一个文件存放数据)
- a1.sinks.k1.sink.rollInterval = 0
- #channel配置信息
- #type为memory意将数据存储至内存中
- a1.channels.c1.type = memory
- a1.channels.c1.capacity = 1000
- a1.channels.c1.transactionCapacity = 100
- #将source和sink绑定至该channel上
- a1.sources.r1.channels= c1
- 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,文件内容如下:
- <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
- #本例中,agent的名称为"a1"
- a1.sources = r1
- a1.sinks = k1
- a1.channels = c1
- #source配置信息
- #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
- #(也就是说resource要通过avro-cliet向其发送数据)
- a1.sources.r1.type = avro
- a1.sources.r1.bind = localhost
- a1.sources.r1.port = 44444
- #加入时间戳拦截器,要不运行时会报异常
- a1.sources.r1.interceptors = i1
- a1.sources.r1.interceptors.i1.type = timestamp
- #sink配置信息
- #type为"hdfs"表示将数据存入分布式文件系统(hdfs)
- a1.sinks.k1.type = hdfs
- a1.sinks.k1.channel = c1
- a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
- a1.sinks.k1.hdfs.filePrefix = events-
- #a1.sinks.k1.hdfs.round = true
- #a1.sinks.k1.hdfs.roundValue = 0
- #a1.sinks.k1.hdfs.roundUnit = minute
- #a1.sinks.k1.hdfs.srollSize = 4000000
- #a1.sinks.k1.hdfs.rollCount = 0
- a1.sinks.k1.hdfs.writeFormat = Text
- a1.sinks.k1.hdfs.fileType = DataStream
- #a1.sinks.k1.hdfs.batchSize = 10
- #channel配置信息
- #type为memory意将数据存储至内存中
- a1.channels.c1.type = memory
- a1.channels.c1.capacity = 1000
- a1.channels.c1.transactionCapacity = 100
- #将source和sink绑定至该channel上
- a1.sources.r1.channels = c1
- 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内容如下:
- <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
- #本例中,agent的名称为"a1"
- a1.sources = r1
- a1.sinks = k1
- a1.channels = c1
- #source配置信息
- #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
- #(也就是说resource要通过avro-cliet向其发送数据)
- a1.sources.r1.type = avro
- a1.sources.r1.bind = localhost
- a1.sources.r1.port = 44444
- # Describe the sink
- #a1.sinks.k1.type = logger
- #sink配置信息
- #k1的type为avro表示该sink将通过avro-client客户端以avro协议通过5555端口发送数据
- a1.sinks.k1.type = avro
- a1.sinks.k1.hostname = localhost
- a1.sinks.k1.port = 55555
- #channel配置信息
- #type为memory意将数据存储至内存中
- a1.channels.c1.type = memory
- a1.channels.c1.capacity = 1000
- a1.channels.c1.transactionCapacity = 100
- #将source和sink绑定至该channel上
- a1.sources.r1.channels = c1
- a1.sinks.k1.channel = c1</span>
agent02.properties内容如下:
- <span style="font-family:Tahoma;font-size:14px;">#为agent的各个组件命名
- #本例中,agent的名称为"a2"
- a2.sources = r1
- a2.sinks = k1
- a2.channels = c1
- #source配置信息
- #r1的type为avro表示该source接收的数据协议为avro,且接收数据由avro客户端事件驱动
- #(也就是说resource要通过avro-cliet向其发送数据)
- a1.sources.r1.type = avro
- a1.sources.r1.bind = localhost
- a1.sources.r1.port = 55555
- #sink配置信息
- #type为"file_roll"表示将数据存入本地文件系统
- a1.sinks.k1.type = file_roll
- #指定数据存放目录
- a1.sinks.k1.sink.directory = $FLUME/test/log
- #设置滚动时间(即每隔一段你设置的时间,系统会生成一个新的文件存放数据
- #(如果不指定,系统会默认生成N个文件,将数据分别存入N个文件中),
- #为0时表示只有一个文件存放数据)
- #a2.sinks.k1.sink.rollInterval = 0
- #channel配置信息
- #type为memory意将数据存储至内存中
- a1.channels.c1.type = memory
- a1.channels.c1.capacity = 1000
- a1.channels.c1.transactionCapacity = 100
- #将source和sink绑定至该channel上
- a1.sources.r1.channels = c1
- 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,在这里我只是做一下简单的使用示例介绍。