1、Flume介绍
- 一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。
- Flume OG(original generation, 2009年7月):分布式日志收集系统, 有Master概念,依赖于Zookeeper,分为agent,collector, storage三种角色;Flume NG(next generation, 2011年10月):代码重构,功能精简, 去掉master,collector角色,专注数据的收集与传递。
2、Flume组成
2.1、Flume Flow
- Flow:数据采集流程
- Event:消息处理的最小单位,带有一个可选的消息头
- Agent:一个独立的Flume进程,包含组件Source、Channel、Sink
- Source:以event为单位接收信息,并确保信息被推送(push)到channel
- Channel:缓存信息,确保信息在被sink处理前不会丢失
- Sink:从channel中拉取(pull)并处理信息
- Interceptor:event拦截器,可以修改或丢弃event,做数据的过滤
2.2、处理流程:
source以event为单位从数据源接收信息,然后保存到一个或多个channel中 (可以经过一个或多个interceptor的预处理),sink从channel中拉取并处理 信息(保存,丢弃或传递到下一个agent),然后通知channel删除信息
3、Flume安装
3.1、依赖:jdk1.8
3.2、步骤
- 下载安装包
- 解压
-
配置flume-env.sh:设置 JAVA_HOME和FLUME_CLASSPATH="/root/hadoop/share/hadoop/common/*:/root/hadoop/share/hadoop/hdfs/*:/root/hadoop/share/hadoop/common/lib/*"
- 配置 agent:conf/flume-conf.properties
- 启动: $FLUME_HOME/bin/flume-ng agent -n a1 -c conf -f xxx.properties
3.3、配置模板
配置agent文件:
# example.conf: A single-node Flume configuration
# 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
source可以对应channel,而sink只能对应一个channel
4、source、channel和sink接收数据类型
4.1、source
名称 | 描述 |
Avro | 监听地址,接收avro信息 |
Thrift | 监听地址,接收thrift信息 |
JMS | 监听JMS地址,接收jms信息 |
Exec | 监听命令输出,如tail –f xxx.log |
Spooling Directory | 监听放置到指定文件夹下的新文件,读取文件中的内容 |
Kafka | 监听kafka服务器,接收kafka消息 |
自定义 | 自定义的source |
4.2、channel
名称 | 描述 |
Memory Channel | Event数据存储在内存中。处理速度快,但是不能保证信息的持久化,而且容 量受限于内存大小。 |
File Channel | Event数据存储在磁盘文件中。处理速度一般,但是可以保证信息不会丢失, 容量也几乎无限制。 |
JDBC Channel | Event数据存储在持久化存储中,当前Flume Channel内置支持Derby |
Spillable Memory Channel | Event数据存储在内存中和磁盘上,当内存队列满了,会持久化到磁盘文件 (当前为试验性的,不建议生产环境使用) |
Custom Channel | 自定义Channel实现 |
4.3、sink
名称 | 描述 |
HDFS | 数据写入HDFS |
Hive | 数据写入Hive |
Logger | 数据写入日志文件 |
Avro | 数据被转换成Avro Event,然后发送到配置的RPC端口上 |
Thrift | 数据被转换成Thrift Event,然后发送到配置的RPC端口上 |
HBase | 数据写入HBase数据库 |
ElasticSearch | 数据发送到Elastic Search搜索服务器(集群) |
Kafka | 数据发送到Kafka |
Null | 丢弃到所有数据 |
Custom | 自定义Sink实现 |
5、常见应用场景:
5.1、离线日志收集
场景描述:收集服务器的用户访问日志,保存到Hadoop集群中,用于离线的计算与分析
Flume方案:
- 在服务器端配置flume agent
- Source采用Spooling Directory Source(监听文件)
- Channel采用Memory Channel
- Sink采用HDFS Sink
5.2、实时日志收集
场景描述:收集服务器的系统日志,发送给实时计算引擎进行实时处理
Flume方案:
- 在服务器端配置flume agent
- Source采用Spooling Directory Source或 Exec Source(tail –f xxx)
- Channel采用Memory Channel
- Sink采用Kafka Sink
5.3、系统日志收集
场景描述:收集服务器的系统日志,发送给实时计算引擎进行实时处理
Flume方案:
- 在服务器端配置flume agent
- Source采用Spooling Directory Source或 Exec Source(tail –f xxx)
- Channel采用Memory Channel
- Sink采用Kafka Sink
6、使用注意事项
配置相关
- Agent的配置中使用统一的命名规则
- 在启动命令中添加“no-reload-conf”参数为true来取消自动加载配置文件功能
- 基于配置中心读取统一的配置文件
- 调大HdfsSink的batchSize,增加吞吐量,减少hdfs的flush次数
- 适当调大HdfsSink的callTimeout,避免不必要的超时错误
架构相关
- 将日志采集系统系统分成三层:采集、汇总和存储,采集只管将数据发送 到汇总层,处理逻辑由汇总层统一处理。好处是简化采集点的管理
- 采集点(source)不要直接接入应用系统中,以免由于日志收集系统问题影响应用系统