《Flume日志收集与MapReduce模式》一2.3 从“Hello World”开始

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,它会将日志写到本地文件系统中。

时间: 2024-10-04 11:03:21

《Flume日志收集与MapReduce模式》一2.3 从“Hello World”开始的相关文章

《Flume日志收集与MapReduce模式》一1.5 Flume事件

1.5 Flume事件 Flume传输的基本的数据负载叫作事件.事件由0个或多个头与体组成. 头是一些键值对,可用于路由判定或是承载其他的结构化信息(比如说事件的时间戳或是发出事件的服务器主机名).你可以将其看作是与HTTP头完成相同的功能--传递与体不同的额外信息的方式. 体是个字节数组,包含了实际的负载.如果输入由日志文件组成,那么该数组就非常类似于包含了单行文本的UTF-8编码的字符串. Flume可能会自动添加头(比如,源添加了数据来自的主机名或是创建了事件时间戳),不过体基本上是不受影

《Flume日志收集与MapReduce模式》一第1章 概览与架构

第1章 概览与架构 如果在阅读本书,那就说明你正在数据的海洋中遨游.创建大量的数据是非常简单的事情,这要归功于Facebook.Twitter.Amazon.数码相机与相机照片.YouTube.Google,以及你能想得到的能够连接到互联网上的任何东西.作为网站的提供者,10年前的应用日志只是用来帮助你解决网站的问题.时至今日,如果你知道如何从大量的数据中浪里淘金,那么相同的数据就会提供关于业务与客户的有价值的信息. 此外,既然在阅读本书,那么你肯定知道创建Hadoop的目的在一定程度上就是为了

《Flume日志收集与MapReduce模式》一3.2 文件通道

3.2 文件通道 文件通道指的是将事件存储到代理本地文件系统中的通道.虽然要比内存通道慢一些,不过它却提供了持久化的存储路径,可以应对大多数情况,它应该用在数据流中不允许出现缺口的场合.这种持久化能力是由Write Ahead Log(WAL)以及一个或多个文件存储目录联合提供的.WAL用于以一种原子且安全的方式追踪来自于通道的所有输入与输出.通过这种方式,如果代理重启,那么WAL可以重放,从而确保在清理本地文件系统的数据存储前进入到通道中的所有事件都会被写出.此外,如果数据处理策略要求磁盘上的

《Flume日志收集与MapReduce模式》一3.3 小结

3.3 小结 本章介绍了在数据处理管道中常用的两类通道.内存通道提供了更快的速度,这是以故障事件出现时数据丢失为代价的.此外,文件通道提供了更可靠的传输,因为它能容忍代理故障与重启,这是以牺牲性能为代价的.你需要确定哪种通道更适合于你的使用场景.在确定内存通道是否适合时,请问问自己丢失一些数据的经济上的代价如何.在考虑是否使用持久化通道时请衡量它与添加更多的硬件以弥补性能上的差异时的代价相比如何.另一个考虑就是数据问题了.写入到Hadoop中的数据不一定都来自于流式应用日志.如果接收的是每天的数

《Flume日志收集与MapReduce模式》一1.1 Flume 0.9

1.1 Flume 0.9 Flume是在2011年被首次引入到Cloudera的CDH3分发中的.它由一套工作守护进程(代理)构成,这些守护进程是通过Zookeeper(一个配置与协调系统)根据一个或多个集中的Master配置而成的.在Master上,你可以在Web UI中查看代理状态,也可以以集中的方式在UI或是通过命令行Shell的方式取出配置(这两种方式都是通过Zookeeper与工作代理进行通信的).可以通过3种模式发送数据,分别叫作Best Effort(BE).Disk Failo

《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览

2.2 Flume配置文件概览 既然已经下载好了Flume,下面来花点时间看看如何配置代理.Flume代理的默认配置提供者使用了一个简单的键值对的Java属性文件,你需要在启动时向代理传递一个参数.由于可以在单个文件中配置多个代理,因此还需要额外传递一个代理标识符(叫作名字),这样它就知道该使用哪个代理了.在给出的示例中,我只指定了一个代理,使用agent这个名字.每个代理的配置都以下面这3个参数开始: 每个源.通道与接收器在该代理的上下文中也有一个唯一的名字.比如,如果不打算传递Apache访

《Flume日志收集与MapReduce模式》一1.3 HDFS与流式数据/日志的问题

1.3 HDFS与流式数据/日志的问题 HDFS并不是真正的文件系统,至少从传统的认识来说不是这样,对于通常的文件系统来说,很多我们认为理所当然的东西并不适合于HDFS,比如挂载.这使得将流式数据装载进Hadoop中变得有些复杂.在通常的Portable Operating System Interface(POSIX)风格的文件系统中,如果打开文件并写入数据,那么在文件关闭前它会一直存在于磁盘上.也就是说,如果另一个程序打开了相同的文件并开始读取,那么它会读取到写入器写到磁盘上的数据.此外,如

《Flume日志收集与MapReduce模式》一1.2 Flume 1.X(Flume-NG)

1.2 Flume 1.X(Flume-NG) Flume之所以会重构有很多原因,如果对细节感兴趣可以参考https://issues.apache.org/jira/browse/FLUME-728.一开始的重构分支最后变成了Flume 1.X的开发主线. Flume 1.X最为明显的变化是不再使用中心化的配置Master/Masters与Zookeeper.Flume 0.9的配置有些过度烦琐,并且极易出错.此外,中心化的配置已经超出了Flume的目标范围.取代中心化配置的是一个简单的磁盘上

《Flume日志收集与MapReduce模式》一第3章 通  道

第3章 通 道在Flume中,通道指的是位于源与接收器之间的构件.它为流动的事件提供了一个中间区域,从源中读取并且被写到数据处理管道中的接收器的事件处于这个区域中.本章将要介绍的两类通道分别是内存/非持久化通道与本地文件系统/持久化通道.持久化文件通道会在发送者接收到事件前将所有变化写到磁盘上.它要比非持久化的内存通道慢一些,不过可以在出现系统事件或是Flume代理重启时进行恢复.与之相反,内存通道要更快一些,不过在出现失败时会导致数据丢失,并且与拥有大量磁盘空间的文件通道相比,它的存储能力要低