[干货] Flume综述与实例

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值