Apache Flume简介
- Flume用于将多种来源的日志以流的方式传输到Hadoop或者其它目的地
- Flume拥有基于数据流上的简单灵活架构,支持容错、故障转移与恢复
- 由Cloudera 2009年捐赠给Apache,现为Apache顶级项目
Flume架构
- Client:客户端,数据产生的地方,如Web服务器
- Event:事件,指通过Agent传输的单个数据包,如日志数据通常对应一行数据
- Agent:代理,一个独立的JVM进程
-
Flume 以一个或多个Agent部署运行
-
Agent包含三个组件
Source
Channel
Sink
Flume安装和配置
Flume安装和使用
Hello Flume
agent.sources = s1
agent.channels = c1
agent.sinks = sk1
#设置Source为netcat 端口为5678,使用的channel为c1
agent.sources.s1.type = netcat
agent.sources.s1.bind = localhost
agent.sources.s1.port = 5678
agent.sources.s1.channels = c1
#设置Sink为logger模式,使用的channel为c1
agent.sinks.sk1.type = logger
agent.sinks.sk1.channel = c1
#设置channel为capacity
agent.channels.c1.type = memory
bin/flume-ng agent --name agent -f h0.conf -Dflume.root.logger=INFO,console
Flume组件
- Source
- SourceRunner
- Interceptor
- Channel
- ChannelSelector
- ChannelProcessor
- Sink
- SinkRunner
- SinkProcessor
- SinkSelector
Flume工作流程
Source
- exec source
- spooling directory source
- http source
- avro source
- kafka source
- netcat source
exec source
- 执行Linux指令,并消费指令返回的结果,如“tail -f”
属性 | 缺省值 | 描述 |
---|
type | - | exec |
command | - | "tail -f xxx.log" |
shell | - | 选择系统Shell程序,如"/bin/sh" |
batchSize | 20 | 发送给channel的最大行数 |
spooling directory source
- 从磁盘文件夹中获取文件数据,可避免重启或者发送失败后数据丢失,还可用于监控文件夹新文件
属性 | 缺省值 | 描述 |
---|
type | - | spooldir |
spooldir | - | 需读取的文件夹 |
fileSuffix | .COMPLETED | |
deletePolicy | never | 文件完成后删除策略:never和immediate |
http source
属性 | 缺省值 | 描述 |
---|
type | - | http |
post | - | 监听端口 |
bind | 0.0.0.0 | 绑定IP |
handler | org.apache.flume.source.http.JSONHandler | 数据处理程序类全名 |
curl -XPOST localhost:5140 -d'[{"headers":{"h1":"v1","h2":"v2"},"body":"hello body"}]'
avro source
- 监听Avro端口,并从外部Avro客户端接收events
属性 | 缺省值 | 描述 |
---|
type | - | avro |
bind | - | 绑定IP地址 |
port | - | 端口 |
threads | - | 最大工作线程数量 |
Channel
-
Memory Channel
- event保存在Java Heap中。如果允许数据小量丢失,推荐使用
-
File Channel
- event保存在本地文件中,可靠性高,但吞吐量低于Memory Channel
-
JDBC Channel
-
Kafka Channel
Sink
- Sink负责从Channel收集数据
- 常用Sink
- avro sink
- HDFS sink
- Hive sink
- HBase sink
- Kafka sink
avro sink
- 作为avro客户端向avro服务端发送avro事件
属性 | 缺省值 | 描述 |
---|
type | - | avro |
hostname | - | 服务端IP地址 |
post | - | 端口 |
batch-size | 100 | 批量发送事件数量 |
HDFS sink
属性 | 缺省值 | 描述 |
---|
type | - | hdfs |
hdfs.path | - | hdfs目录 |
hdfs.filePrefix | FlumeData | 文件前缀 |
hdfs.fileSuffix | - | 文件后缀 |
Hive sink
- 包含分隔文本或JSON数据流事件直接流入Hive表或分区
- 传入的事件数据字段映射到Hive表中相应的列
属性 | 缺省值 | 描述 |
---|
type | - | hive |
hive.metastore | - | Hive metastore URI |
hive.database | - | Hive数据库名称 |
hive.table | - | Hive表 |
serializer | - | 序列化器负责从事件中分析出字段并将它们映射为Hive表中的列。序列化器的选择取决于数据的格式。支持序列化器:DELIMITED和JSON |
HBase sink
属性 | 缺省值 | 描述 |
---|
type | - | hbase |
table | - | 要写入的Hbase表名 |
columnFamily | - | 要写入的Hbase列族 |
zookeeperQuorum | - | 对应hbase.zookeeper.quorum |
znodeParent | /hbase | zookeeper.znode.parent |
serializer | org.apache.flume.sink.hbase.SimpleHbaseEventSerializer | 一次事件插入一列 |
serializer.payloadColumn | - | 列名col1 |
多层代理
- 多跳(multi-agent flow)
- 多路数据流(Multiplexing the flow)
- 合并(Consolidation),将多个源合并到一个目的地
Flume Sink组
- sink组是用来创建逻辑上的一组sink
- sink组的行为是由sink处理器(processor)决定的,它决定了event的路由策略
- processor包括故障转移和负载均衡两类
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random
拦截器
- 拦截器可修改或丢弃事件
- 内置拦截器
- Hostlnterceptor:在event header中插入“hostname”
- Timestamplnterceptor:插入时间戳
- Staticlnceptor:插入key-value
- UUIDlnceptor:插入UUID
- …