Flume 开发环境搭建与编写 Hello World 示例

2019-05-10

关键字:Flume 环境搭建、Flume 如何安装、Flume 示例程序

这是一篇很直的文章,一切围绕着快速构建开发环境为目的,不讲原理不讲人生也不讲理想,只求用最短的时间让您的 Flume 跑起来。


1、下载与安装

 

首先,下载没跑的,去官网下载,这里贴出传送门: Flume 官方下载

 

其次,关于选择 Flume 版本的问题,对于学习,选择最新稳定版是肯定没错的。如果是用生生产环境,不敢要求最新,但至少得是稳定版本。官方网站中直接给出来的通常都只是最新版本而已。如果您要自行选择版本,可以去这里看看: Flume 历史版本下载 。这里不仅可以拿到大多数历史版本,甚至于还贴心地将稳定版本都打包到 stable 目录下了。

 

在选择好您需要的版本后下载下来,直接解压就可以了,Apache 的软件这点真心方便,解压即用圈粉无数。

tar -zxvf apache-flume-1.9.0-bin.tar.gz 

 

解压完成后可以看到如下目录结构

至此,下载与安装就算是完成了,接下来看看如何配置我们的 Flume 使用环境。

 

2、配置

 

Flume 的配置文件都放在 conf 目录下。默认情况下 conf 目录内会有以下几个文件

在这里,我们仅需要关注 flume-conf.properties.template 即可。不过在使用它之前,我们首先要将它的 .template 后缀去掉。

cp flume-conf.properties.template flume-conf.properties

这里强烈建议您使用 cp 而不是 mv ,留有一份默认配置的副本总是好的,省得以后需要恢复默认配置时还得重新解压安装包。

 

下面我们来看看 Flume 默认的配置信息

 1 agent.sources = seqGenSrc
 2 agent.channels = memoryChannel
 3 agent.sinks = loggerSink
 4 
 5 # For each one of the sources, the type is defined
 6 agent.sources.seqGenSrc.type = seq
 7 
 8 # The channel can be defined as follows.
 9 agent.sources.seqGenSrc.channels = memoryChannel
10 
11 # Each sink's type must be defined
12 agent.sinks.loggerSink.type = logger
13 
14 #Specify the channel the sink should use
15 agent.sinks.loggerSink.channel = memoryChannel
16 
17 # Each channel's type is defined.
18 agent.channels.memoryChannel.type = memory
19 
20 # Other config values specific to each type of channel(sink or source)
21 # can be defined as well
22 # In this case, it specifies the capacity of the memory channel
23 agent.channels.memoryChannel.capacity = 100

 

首先,我们注意到每一条配置项的第 1 个单词都是 agent ,这个 agent 并不是固定不变的,它代表的就是某个 Flume 代理的名称,即所有以该单词开始的配置项,都会被应用到以该单词为名称的 Flume 代理上。而我们在启动 Flume 实例时,会通过 -n 参数来指定我们要启动的代理名称。比如在这里,我们的代理名称就是 agent ,那我们如果想要应用这份配置表,则启动时就应该以下面这条启动命令

flume-ng agent ... -n agent ...

 

其次我们来关注下前面 3 条配置项。

agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink

这 3 条分别用于配置 源、通道与接收器 的名称。这仅仅是起个我们能认得的名字而已,所以可以随意填写配置值,但是这里起的名字在后面每一条配置项中都会用到。

 

然后是下一条配置项

agent.sources.seqGenSrc.type = seq

这里就看到了,我们前面定义源名称时所起的源名字在这里就用到了。整条配置项的意思是这条要配置的是名称为 agent 的 Flume 代理的 seqGenSrc 源的类型(type),然后它的值是 seq ,seq 表示 “序列发生器” 。序列发生器是什么东东呢?说白了就是自动产生从 0 到 Long.MAX_VALUE 之间的数字的东西,一般用于测试使用。

 

这里就有一个很有意思的地方:我怎么知道 seq 就代表序列发生器呢?那除了序列发生器,还有什么源类型可以填呢?

 

答案就是:看官网文档!这里贴出一个官网文档的链接: Flume 1.9 官网文档 。进去后关注下左侧边栏,找到如下图所示的标签

在这个 Flume Sources 标签下列出的子标签,就是 Flume 目前支持的源类型。上面的 seq 值也在这里可以找到

您在后续的使用过程中需要哪种类型的源又不知道该填什么值的时候,来这查查就好了。Flume 所支持的源类型已经能够全面覆盖大数据开发领域了。

 

当然,不同类型的源的附属配置项也不同,具体的还得参考官网上的文档。

 

再下面两条配置项的都差不多的了,想知道 Flume 支持哪些类型,直接上去查就好了

agent.sources.seqGenSrc.channels = memoryChannel
agent.sinks.loggerSink.type = logger

 

再接下来,配置的是源和接收器的通道。

agent.sinks.loggerSink.channel = memoryChannel
agent.channels.memoryChannel.type = memory

关于源、接收器与通道之间的关系,有需要的同学请参考笔者的另一篇博客 Flume 架构解析

 

最后一条配置项配置的是和通道相关的额外配置。这个配置并不是必配项,关键得看我们所选择的通道类型。

agent.channels.memoryChannel.capacity = 100

 

以上借用 Flume 默认的配置项来简单讲解了一下 Flume 配置。下面我们来做个 “Hello World” 实例实操一下。

 

3、Hello World 示例

 

不要误会,笔者这里说的 “Hello World” 示例并不是真的要输出  Hello World 。只是说平时我们在学习一门新的编程语言时,几乎都是以输出一个 “Hello World” 字符串来作为第一支程序,算是入门的意思。那这里我们一起来做一个 Flume 入门级程序,因此笔者将它称为 “Hello World” 示例。

 

关于我们的这支 “Hello World” 程序,我们以 netcat 作为数据输入源,控制台作为数据输出端。在我们有了上一节的 Flume 配置基础知识以后,笔者在这就直接贴上配置项信息就好了,笔者可以少啰嗦几句,大家理解起来也可以更直接一点

agent.sources = mnetcat
agent.channels = memoryChannel
agent.sinks = mconsolesink

agent.sources.mnetcat.type = netcat
agent.sources.mnetcat.bind = localhost
agent.sources.mnetcat.port = 7777

agent.sinks.mconsolesink.type = logger
agent.sinks.mconsolesink.maxBytesToLog = 128

agent.sources.mnetcat.channels = memoryChannel
agent.sinks.mconsolesink.channel = memoryChannel

agent.channels.memoryChannel.type = memory
agent.channels.memoryChannel.capacity = 100

 

接下来,我们来运行我们的 Flume 代理。通过以下命令来运行

./bin/flume-ng agent -c conf -f conf/flume-conf.properties -n agent -Dflume.root.logger=INFO,console

笔者是在 Flume 安装目录下执行的这条命令。顺利的话,我们可以在控制台最后看到以下提示信息

(conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:196)] Starting Sink mconsolesink
(conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:207)] Starting Source mnetcat
(lifecycleSupervisor-1-4) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:155)] Source starting
(lifecycleSupervisor-1-4) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:166)] Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:7777]

 

此时查看网络信息也能看到当前机器上 7777 端口已经处于监听状态了。

netstat -ntlp
tcp6       0      0 127.0.0.1:7777          :::*                    LISTEN      43017/java 

 

接下来,我们再开启另一个窗口,通过 nc 命令来向 7777 端口发送消息。

nc localhost 7777

 

我们键入 “Hello World” 字样,然后回车

hello world
OK

 

顺利的话,就可以在 Flume 运行的窗口上看到如下打印信息了

Event: { headers:{} body: }
Event: { headers:{} body: }
Event: { headers:{} body: }
Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64                hello world }

还真是输出一个 hello world 字符串的示例呢!

 


 

posted @ 2019-05-10 23:29  大窟窿  阅读(1483)  评论(0编辑  收藏  举报