Flume系列文章:
Flume 概述 & 架构 & 组件介绍
在本篇文章中,将介绍Flume的使用
$>cd $FLUME_HOME/bin
查看使用的帮助,会打印相关的命令指示,从而来帮助我们知道如何进行使用:
$>./flume-ng
列举出来的都是常用的,不常用的没有写在下面:
Usage: ./flume-ng [options]...
commands:
agent run a Flume agent
使用的最多的方式
avro-client run an avro Flume client
这种方式用的也不多,因为这种方式很low,没有办法在生产上面使用
global options:
--conf,-c <conf> use configs in <conf> directory
来指定使用的配置文件在什么地方;其实这个配置文件指向的就是$FLUME_HOME/conf下的内容
-Dproperty=value sets a Java system property value
运行一些java的属性,等会会用到
agent options:
--name,-n <name> the name of this agent (required)
agent的名字
--conf-file,-f <file> specify a config file (required if -z missing)
指定的是自己定义的flume的配置文件
官网(1.6.0版本的):http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#a-simple-example
代码解释:
# a1:Agent的名称
# sources的名称:r1
# sink的名称:k1
# channels的名称:c1
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 配置source
# sources代表source可以有多个,这里只有一个a1
# r1对应的类型是netcat
# 官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#netcat-source
# 监听一个端口,把里面每一行的数据作为一个event给返回回来 ==> 这和$>nc -k -l [host] [port]是一样的
# 必填的属性为:channels
# type 必须为netcat
# bind 绑定在哪台机器上面,Host name or IP address都可以
# port 端口
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 配置channel
# 使用内存的channel
# 官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#memory-channel
# 必填的属性:type 必须为memory (就这1个必填的属性)
#
a1.channels.c1.type = memory
# 配置sink,使其输出到控制台
# 官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#logger-sink
# 必填的属性:channel
# type 必须为logger
a1.sinks.k1.type = logger
# 配完source、channel、sink之后,这些东西都是散的,我们需要将他们给串起来
# 上述的组件中,source与sink的必填属性中都有channel,我们都还未进行配置
# 这里只需要将source的channel指定
# 将sink的channel指定
# 就OK了(channel都是自己定义的a1.channels = c1中的c1)
# 可以这样进行理解:
# a1的source收集完数据之后,去了c1这个channel
# a1的sink从c1这个channel去取数据
# 注意:
# a1.sources.r1.channels = c1 代表了1个数据源可以输出到多个不同的channel
# a1.sinks.k1.channel = c1 但是1个sink只能去1个channel里取数据,是不能从多个channel去取数据的
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
编写配置文件:
$>cd $FLUME_HOME/conf
$>vi hello.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sources.r1.channels = c1
a1.channels.c1.type = memory
a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1
启动agent:
官网:http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0/FlumeUserGuide.html#starting-an-agent
$>bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
$>flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/hello.conf \
-Dflume.root.logger=INFO,console // 指定日志级别(建议使用起来)
观察打印的log信息:
Creating instance of channel c1 type memory
Creating instance of source r1, type netcat
Creating instance of sink: k1, type: logger
Channel c1 connected to [r1, k1]
Starting Channel c1
Starting Sink k1
Starting Source r1
安装telnet
$>yum install telnet-server
$>yum install telnet
测试
$>telnet localhost 44444
输入信息:
huhuniao
flume test
man city
man united
观察启动agent那端的,所显示的log信息:
2018-02-05 14:14:40,661 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 68 65 6C 6C 6F 20 68 75 68 75 6E 69 61 6F 0D hello huhuniao. }
2018-02-05 14:14:44,662 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 66 6C 75 6D 65 20 74 65 73 74 0D flume test. }
2018-02-05 14:14:47,607 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 6D 61 6E 20 63 69 74 79 0D man city. }
2018-02-05 14:14:51,609 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 6D 61 6E 20 75 6E 69 74 65 64 0D man united. }
这样将指定机器端口上的数据给收集过来了
Event就是Flume数据传输的基本单元:
Event: {
headers:{}
body: 68 65 6C 6C 6F 20 68 75 68 75 6E 69 61 6F 0D
hello huhuniao. }
数据从source里面过来
把数据put到channel(channel可以理解为队列,先进先出;
每个event慢慢地从队尾到队头,后面进来的event在队尾)
sink取数据从队头开始取,即往下面压,从上面取
该案例仅仅只能作为1个demo,玩玩而已(用来入门、了解flume的),生产上是没有人从socket去拿数据然后输出信息到控制台的;后续的文章将继续介绍Flume,Flume在生产中的使用