Flume是一个分布式的、可靠的数据收集、集合和移动的组件。基于流式数据模型,非常健壮、支持容错、故障转移等特性。本用实例辅助说明Flume的大部分核心概念。
版本记录:
2016-07-23 初稿
安装FLume
Flume的安装非常简单,其核心就是agent。
从官网下载稳定版本:
wget http://apache.fayea.com/flume/1.6.0/apache-flume-1.6.0-bin.tar.gz
tar zxvf apache-flume-1.6.0-bin.tar.gz
mv apache-flume-1.6.0-bin apache-flume-1.6.0
为了运行方便,我们把bin目录加到Path中:
vim /etc/profile
export FLUME_HOME=/opt/flume/apache-flume-1.6.0
export PATH=$PATH:$FLUME_HOME/bin
source /etc/profile
测试一下是否安装成功:
flume-ng help
入门例子
Flume的核心工作都是通过Flume Agent来完成的,Flume agent是一个长期运行的Java进程,其中运行着source和sink,source和sink之间通过channel连接。source作为生产者,产生数据,输送到channel,sink从则从channel中读取数据,并保存到HDFS之类的数据目的地。Flume中自带了非常丰富的各个组件实现。例如从目录中拉取新文件数据的spool source,收集运行命令输出结果的exec source。channel的实现由内存memory,文件file channel等。sink有简单的logger输出,HDFS sink,avro sink等。
数据在Flume中用事件event来表示,因此一个运行中的Flume agent就是一个event的流动系统,由source产生,传送到channel,再传送到sink用于存储或者下一步处理。
多个Flume Agent可以相互连接构成一个拓扑图,从而提供稳定的、高吞吐的数据收集系统。因此Flume系统中,核心是配置。使用Flume提供的丰富组件,构成满足自己需求的系统。如果原生组件不足以满足需求,完全可以扩展自己需要的组件,Flume提供了非常好的拓展点。
Agent的示意图如下:
假设我们现在想监控/tmp/spooldir目录下的文件变动,一旦有新增文件后,读取每一行,输出到控制台。我们首先配置一个名为test-agent.properties的文件,内容如下:
agent1.sources = source1
agent1.sinks = sink1
agent1.channels = channel1
agent1.sources.source1.channels=channel1
agent1.sinks.sink1.channel = channel1
agent1.sources.source1.type=spooldir
agent1.sources.source1.spoolDir=/tmp/spooldir
agent1.sinks.sink1.type=logger
agent1.channels.channel1.type=file
配置文件的属性名称采用级联的层次结构来设置各种属性。我们采用Flume自带的spooldir作为source,使用具有持久化特性的file channel以及简单的logger sink。
接下来先创建监控的目录:
mkdir /tmp/spooldir
````
使用flume-ng启动agent:
<div class="se-preview-section-delimiter"></div>
flume-ng agent –conf-file /opt/flume/conf/spool-to-logger.properties –name agent1 –conf $FLUME_HOME/conf -Dflume.root.logger=INFO,console
![这里写图片描述](https://img-blog.csdn.net/20160723123511268)
日志中主要是一些source sink的启动信息。
接着我们在在一个终端中,往/tmp/spooldir中新增一个文件,为了保存新增文件的原子操作,我们先创建一个隐藏文件:
<div class="se-preview-section-delimiter"></div>
echo “Hello Flume” > /tmp/spooldir/.file1.txt
然后使用原子性操作mv改变为可见文件:
<div class="se-preview-section-delimiter"></div>
mv /tmp/spooldir/.file1.txt /tmp/spooldir/file1.txt
此时日志中可以看到如下输出:
![这里写图片描述](https://img-blog.csdn.net/20160723123732691)
成功。一行会被当做一个事件,我们写入一行,所以控制台收到一个事件的日志。多行文件的输出类似:
![这里写图片描述](https://img-blog.csdn.net/20160723124245740)
body的输出中是UTF-8编码格式。成功处理完之后,file channel中的文件名添加了COMPLETE的后缀,表示该文件已经处理过。
<div class="se-preview-section-delimiter