2019独角兽企业重金招聘Python工程师标准>>>
1 前言
Flume开始由Cloudera公司开发,2011年Cloudera公司将Flume贡献给开源社区,现在Apache Flume是Apache Software Foundation的一个顶级项目。
目前Flume有两个可用的Release版本:0.9x和1.x。0.9x版本称为Flume-OG由Cloudera公司开发和维护,1.x版本称为Flume-NG由Apache Software Foundation开发和维护。本文档只对Apache Flume 1.x进行介绍说明。
1.1 核心概念
组件 |
解释 |
Agent |
一个jvm进程,里面运行flume-ng组件 |
Source |
接受数据源的地方 |
Channel |
连接Source和sink的管道 |
Sink |
数据流动结束的地方 |
events |
Flume-ng中传输的的一个数据单元 |
1.2 数据流模型
Flume-ng的数据流有事件(event)贯穿,它是flume数据的基本单位,当source捕捉到事件后会把它推入到channel中,sink处理该事件,可以持久化或者推向到另一个source,flume-ng提供了多种不同类型的source、channel和sink,可以自由组合,用户可以根据配置文件定义;
Flumen-ng支持多流、即多个agent可以协同工作,根据官网列举几个常用流:
1.3 基本组件
常用Flume source
Source类型 |
说明 |
Avro Source |
支持Avro协议(实际上是Avro RPC),内置支持, 1.4.0后默认rpc协议 |
Thrift Source |
支持Thrift协议,内置支持 |
Exec Source |
基于Unix的command在标准输出上生产数据,如:tail -f |
JMS Source |
从JMS系统(消息、主题)中读取数据 |
Spooling Directory Source |
监控指定目录内数据变更 |
Netcat Source |
监控某个端口,将流经端口的每一个文本行数据作为Event输入 |
Sequence Generator Source |
序列生成器数据源,生产序列数据 |
Syslog Sources |
读取syslog数据,产生Event,支持UDP和TCP两种协议 |
HTTP Source |
基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式 |
常用Flume channel
Channel类型 |
说明 |
Memory Channel |
Event数据存储在内存中 |
JDBC Channel |
Event数据存储在持久化存储中,当前Flume Channel内置支持Derby |
File Channel |
Event数据存储在磁盘文件中 |
Custom Channel |
自定义Channel实现 |
常用Flume sink
Sink类型 |
说明 |
HDFS Sink |
数据写入HDFS |
Logger Sink |
数据写入日志文件 |
Avro Sink |
数据被转换成Avro Event,然后发送到配置的RPC端口上 |
Thrift Sink |
数据被转换成Thrift Event,然后发送到配置的RPC端口上 |
IRC Sink |
数据在IRC上进行回放 |
File Roll Sink |
存储数据到本地文件系统 |
Null Sink |
丢弃到所有数据 |
HBase Sink |
数据写入HBase数据库 |
Morphline Solr Sink |
数据发送到Solr搜索服务器(集群) |
ElasticSearch Sink |
数据发送到Elastic Search搜索服务器(集群) |
Custom Sink |
自定义Sink实现 |
1.4 可靠性
Flume使用基于事务的数据传递方式来保证事件传递的可靠性。Source和Sink被封装进一个事务。事件被存放在Channel中直到该事件被处理,Channel中的事件才会被移除。这是Flume提供的点到点的可靠机制。
从多级流来看,前一个agent的sink和后一个agent的source同样有它们的事务来保障数据的可靠性。
1.5 可恢复性
Flumne-ng提供了一个FileChannel来备份数据;memory channel只会用了存储数据,agent进程挂了数据就会丢失,但是操作性能更好。
2 使用
2.1 安装
1. 拷贝安装包apche-flume-xxx.tar.gz到安装目录
2. 解压tar zxvf apache-flume-xxx.tar.gz
如果使用到hadoop集群,保证hadoop的相关环境都已经安装正确,并且hadoop集群可用。
2.2 配置
1. flume-ng是用过properties配置文件来定义流的,通过官网的一个例子看配置文件如何使用,该例子主要功能是通过netcat监控端口44444,把数据存放到memory channel中,通过一个logger sink把事件数据打印到控制台:
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2. 运行flume:
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
配置文件可以交由zookeeper管理, 可以把对应agent的配置文件上传到agent名称对应的目录下面,如果:
- /flume
|- /a1 [Agent config file]
|- /a2 [Agent config file]
启动命令为:
$ bin/flume-ng agent -conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console
3.然后我们telnet到44444端口测试:
$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world!
OK
服务端打印日志:
12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D Hello world!. }
3 参考
更多使用请参考:http://flume.apache.org/FlumeUserGuide.html