2.3 从“Hello World”开始
每一本技术图书都会有一个“Hello World”示例。下面是我们将会使用的配置文件:
这里定义了一个名为agent的代理,它有一个名为s1的源、一个名为c1的通道,以及一个名为k1的接收器。
源s1的类型为netcat,它只是打开一个Socket监听事件(每个事件一行文本)。它需要两个参数,分别是一个绑定IP与一个端口号。该示例使用0.0.0.0作为绑定地址(表示监听任何地址的Java约定)以及端口号12345。源配置还有一个名为channels的参数,它是源将事件附加到的通道名。在该示例中使用的是c1。这里使用了复数,因为你可以配置将一个源写到多个通道中,不过在这个简单的示例中我们并没有这么做。
名为c1的通道是个内存通道,使用了默认配置。
名为k1的接收器的类型是logger。该接收器主要用于调试与测试。它会使用log4j将所有INFO级别的日志记录下来,这些日志来自于配置好的通道,在该示例中就是c1。这里所用的通道是单数的,因为一个接收器只能从一个通道接收数据。
使用该配置,我们运行代理并使用Linux netcat工具连接到代理来发送事件。
首先,解压缩之前下载的二进制分发包:
接下来,简单看看help命令。使用help命令运行flume-ng命令:
注意,如果指定了目录,那么就需要先将其加入到classpath中。
如你所见,可以通过两种方式调用命令(除了烦琐的help与version命令外)。我们将使用agent命令,avro-client的使用将在后面进行介绍。
agent命令有两个必填参数,分别是使用的配置文件与代理名(如果配置包含了多个代理)。下面来看看我们的示例配置,打开一个编辑器(我使用的是vi,你可以使用自己喜欢的任何编辑器):
接下来,将vi配置的内容放到编辑器中,保存并退回到shell。
现在可以启动代理了:
-Dflume.root.logger属性覆盖了conf/log4j.properties中的root logger,使用console追加器。如果没有覆盖root logger,那么一切也都正常,只不过输出将会被写到log/flume.log文件中。当然了,你还可以编辑conf/log4j.properties文件,修改flume.root.logger属性(或是其他想要修改的任何属性)。
你可能会问,既然-f参数包含了配置的完整相对路径,那为何还要指定-c参数呢。原因在于log4j配置文件需要放到classpath中。如果命令没有指定-c参数,那就会报如下错误:
不过你并没有这么做,因此会看到如下关键的日志输出:
这行日志告诉你名为agent的代理已经启动了。通常情况下,如果在配置文件中有多个配置,你只需要这一行日志就可以断定启动了正确的配置。
下面是另一个检查,确保加载了正确的文件,在该示例中就是hw.conf文件:
当所有的配置都被解析完毕后,你会看到下面这条消息,它展示了配置好的一切内容。你会看到s1、c1、k1,以及哪些Java类完成了实际的工作。你可能会猜想,netcat其实是org.apache.flume.source.NetcatSource的便捷方式。如果需要,我们也可以使用类名。事实上,如果编写了自定义的源,那么我会使用其类名来作为源的type参数。如果不对Flume分发包打补丁,就无法定义自己的短名字:
我们看到源现在正在监听端口12345的输入,接下来向其发送一些数据。
最后,再打开一个终端。我们使用nc命令(也可以使用telnet或是其他类似的命令)发送字符串“Hello World”并敲入来标识事件的结束:
“OK”来自于代理,在敲入回车后,它表示将文本行作为一个Flume事件来接受。如果查看代理日志,你会看到如下内容:
上述日志消息表明该Flume事件不包含头(netcat源自己也没有添加任何头)。体以十六进制的形式呈现,并且还有一个字符串表示(便于阅读,该示例中就是Hello World消息)。
如果像下面这样再发送一行:
你会在代理的日志中看到如下内容:
事件似乎被截断了。根据设计,logger sink将体内容限制为16字节,从而避免屏幕充斥着过多的内容。如果想要查看调试的完整内容,那么你应该使用其他的sink,也许可以使用file_roll sink,它会将日志写到本地文件系统中。