Flume使用入门 & 入门Demo

Flume系列文章:
Flume 概述 & 架构 & 组件介绍

在本篇文章中,将介绍Flume的使用

使用Flume & 入门案例

查看使用帮助

$>cd $FLUME_HOME/bin

查看使用的帮助,会打印相关的命令指示,从而来帮助我们知道如何进行使用:

$>./flume-ng

列举出来的都是常用的,不常用的没有写在下面:

Usage: ./flume-ng <command> [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

运行Flume的入门案例

编写配置文件:

$>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. }

这样将指定机器端口上的数据给收集过来了

Flume工作原理

Event就是Flume数据传输的基本单元:

Event: { 
    headers:{} 
    body: 68 65 6C 6C 6F 20 68 75 68 75 6E 69 61 6F 0D    
        hello huhuniao. }
  • 一条数据就是一个event
  • event由header和body构成
  • body里面的内容是字节数组

基本工作原理:
参看基本工作原理图:
这里写图片描述

数据从source里面过来
把数据put到channel(channel可以理解为队列,先进先出;
每个event慢慢地从队尾到队头,后面进来的event在队尾)
sink取数据从队头开始取,即往下面压,从上面取

该案例仅仅只能作为1个demo,玩玩而已(用来入门、了解flume的),生产上是没有人从socket去拿数据然后输出信息到控制台的;后续的文章将继续介绍Flume,Flume在生产中的使用

猜你喜欢

转载自blog.csdn.net/lemonZhaoTao/article/details/80640959
今日推荐