Flume主要是一个代理。Flume 传输的数据的基本单位是 Event,如果是文本文件,通常是一行记录。flume有三个核心组件,主要是source,channel,sink。 通过这些组件,Event 可以从一个地方流向另一个地方。
Flume 使用事务性的方式保证传送Event整个过程的可靠性。Sink 必须在 Event 已经被传达到下一站agent里,或者,已经被存入外部数据目的地之后,才能把 Event 从 Channel 中 remove 掉。
①Source 可以接收外部源发送过来的数据。不同的 source,可以接受不同的数据格式。比如有目录池(spooling directory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容。
②Channel 是一个存储地,接收 source 的输出,直到有 sink 消费掉 channel 中的数据。channel 中的数据直到进入到下一个channel中或者进入终端才会被删除。当 sink 写入失败后,可以自动重启,不会造成数据丢失,因此很可靠。
③Sink 会消费 channel 中的数据,然后送给外部源或者其他 source。如数据可以写入到 HDFS 或者 HBase 中。因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。
主要的channel有两种,Memory channel和File channel。
- File Channel 是一个持久化的隧道(Channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。
- 。Memory Channel 是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果 Java 进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间受到 RAM大小的限制,而 File Channel 这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。
附例:最简单的单一代理flume
执行
$ bin/flume-ng agent -c conf -f ./conf/example.conf -n a1 -Dflume.root.logger=INFO,console
参数说明
• -n 指定agent名称
• -c 指定配置文件目录
• -f 指定配置文件
• -Dflume.root.logger=DEBUG,console 设置日志等级
执行
$ telnet localhost 44444
Hello World!