Flume的学习笔记
文章目录
1. Flume简介
1.1 Flume的基本概念
(1) 什么是Flume
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
Flume 基于流式架构,灵活简单。
Flume 是可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据源中集中起来存储的工具/服务。
Flume 可以采集文件,socket 数据包(网络端口)、文件夹、kafka、mysql 数据库等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、Hbase 、hive、kafka 等众多外部存储系统中。
(2) Flume 目的
Flume 最主要的功能就是,实时读取服务器本地磁盘的数据,将数据写入HDFS
1.2 Flume 基本组件
简易架构图:
详细架构图:
(1) Flume 工作流程
Source 采集数据并包装成Event,并将Event缓存再Channel中,Sink不断地从Channel 获取Event,并解决成数据,最终将数据写入存储或索引系统
(2) Agent
Agent 是一个JVM进程,它以事件的形式将数据从源头送至目的。是 Flume 数据传输的基本单元
Agent 的3个组件的设计思想,主要考虑的是:source 和 sink 之间解耦合,以及异步操作。
每一个agent相当于一个数据(被封装成Event对象)传递员,内部有3个核心组件:
- Source:采集组件,用户跟数据源对接,以获取数据;它有各种各样的内置实现;
- Sink:下沉组件,用于往下一级agent 传递数据或者向最终存储系统传递数据。
- Channel : 传输通道组件,用于从source将数据传递到sink
(3) Source
Source 是负责接收数据到Flume Agent的组件,采集数据并包装成Event。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy
(4) Sink
Sink 不断地轮询Channel 中的事件且批量地移除他们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。
**Sink是完全事务性的。**在从 Channel 批量删除数据之前,每个 Sink 用 Channel 启动一个事务。批量时间一旦成功写出到存储系统或下一个 Flume Agent,Sink 就利用Channel 提交事务。事务一旦被提交,该 Channel 从自己的内部缓存区删除事件。
Sink 组件目的地包括hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义
(5) Channel
Channnel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许Source 和 Sink 运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作
Flume 自带两种Channel:
- Memory Channel是
内存中的队列
。Memory Channel在不需要关系数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器当即或者重启都会导致数据丢失 - File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据
(6) Event
数据在channel中的封装形式。
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event 由 Header 和Body 两部分组成,Header用来存放该event的一些属性,为K-V结构,Body 用来存放该条数据,形式为字节数组
header 是一个集合 Map[String,String],用于携带一些KV形式的元数据(标志、描述等)
body 就是一个字节数组byte[];装在具体的数据内容
(7) interceptor 拦截器
拦截器工作在source 组件之后,source 产生的 event 会被出啊还能入拦截器根据需要进行拦截处理,而且,拦截器可以组成拦截器链!
拦截器在flume中有一些内置的功能;
用户也可以根据自己的数据处理需求,自己开发自定义拦截器,这也是Flume的一个可以用来自定义扩展的接口。
(8) channel selector
一个source可以对接多个channel ,则 event 在这 n 个channel 之间传递的策略,由配置的channel selector 决定;
channel selector 有两种实现:replicating(复制),multiplexing(多路复用)
ChannelSelector的作用就是选出Event将要被发往那个Channel,其共有两种类型
Replicating (复制)
ReplicatingSelector会将同一个Event发往所有的Channel
Multiplexing(多路复用)
Multiplexing会根据相应的原则,将不同的Event发往不同的Channel
(9) sink processor
如果sink 和 channel 是一对一关系,则不需要专门的sink processor;
如果要配置一个channel 对多个sink ,则需要将这多个sink配置成一个sink group (sink组);
event 在一个组中的多个sink 间如何传递,则由所配置的sink processor l来决定;
Sink Processor共有三种类型
DefaultSinkProcessor
对应单个sink,发送至单个sink
LoadBalancingSinkProcessor
LoadBalancingSinkProcessor对应的是 Sink Group,LoadBalancingSinkProcessor可以实现负载均衡的能力
FailoverSinkProcessor
FailoverSinkProcessor对应的是Sink Group
FailoverSinkProcessor可以错误回复的功能
2. Flume 拓扑结构
1、Flume Agent 连接(简单串联)
这种模式是将多个flume 顺序连接起来,从最初的source开始到最终sink传送的母的存储系统。
-
优点
多个flume 并联,可以增加event缓存数量
-
缺点
此模式不建议桥接过多的flume数量,flume数量过多不仅会影响传输速率,而且一旦传输过程中某个节点flume宕机,会影响整个传输系统。
2、单 source ,多 channel 、sink (复制和多路复用)
Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据复制到多个Channel中,或者将不同数据分发到不同的channel中,sink可以选择传送到不同的目的地。
3、Flume 负载均衡和故障转移
Flume 支持使用将多个sink 逻辑上分到一个sink组,sink 组配合不同的sinkProcessor可以实现负载均衡和错误回复的功能。
4、Flume Agent 聚合
这种模式是最常见的,也非常实用,日常web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用flume 的这种组合方式能很好的解决这一问题,每台服务器部署一个flume 采集日志,传送到一个集中收集日志的flume,再由此flume上传到hdfs、hive、hbase等,进行日志分析。
3、Flume 内部原理
Source 将数据写入 Channel ,先经过Channel 处理器,Channel 处理器将这些时间传到一个或多个Source 配置的拦截器中。
拦截器是一段代码,可以基于某些它完成的处理来读取时间和修改或删除时间。基于某些标准,如正则表达式,拦截器可以用来删除事件。一旦拦截器处理完事件,拦截器链返回的事件列表传递到Channel 列表,即通过Channel 选择器为每个事件选择的Channel。
(拦截器不能写太复杂的逻辑,影响效率)
Source 可以通过处理器-拦截器-选择器 ,路由写入多个Channel。Channel选择器是决定每个事件必须写入到Source 附带的那个Channel 的组建。因此拦截器可以用来插入或删除事件中的数据,这样Channel 选择器可以应用一些条件在这些事件上,来决定时间必须写入哪些Channel。Channel 选择器可以对时间应用任意过滤条件,来决定每个事件必须写入那些Channel,以及Channel 是必须的或可选的。
4、Flume 事务
Transaction :事务控制机制
Flume 使用两个独立的事务:
- put操作:source读取数据源并写入event到channel
- take操作:sink从channel中获取event并写出到目标存储
事务的实现程度,取决于运行时所选择的具体的组件实现类;
再好的组件的组合,也只实现到了 at least once!(不会丢失数据,但可能产生重复传输)
事务实现的核心点,就是记录状态(比如source,记录自己完成的数据的偏移量)
比如spooling directory source 为文件的每一个event batch创建一个事务,来记录状态,一旦事务中所有的事件全部传递到channel且提交成功,那么source就将event batch 标记为完成。
同理,事务以类似的方式处理从channel 到sink的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚,且所有的事件都会保持到channel中,等待重新传递。
事务机制涉及到如下重要参数:
a1.sources.s1.batchSize =100
a1.sinks.k1.batchSize = 200
a1.channels.c1.transactionCapacity = 300 (应该大于source或者sink的batchSize)
<transactionCapacity 是说,channel中保存的事务的个数>
跟channel 的数据缓存空间容量区别开来:
a1.channels.c1.capacity = 10000
(1) Put 事务流程
- doPut:将批数据先写入临时缓存区putList
- doCommit:检查channel 内存队列是否足够合并
- doRollback: channel 内存队列空间不足,回滚数据
(2) Take事务流程
- doTake:将数据取到临时缓存区takeList,并将数据发送到HDFS
- doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
- doRollingback:数据发送过程中如果出现异常,rollback 将链式缓冲区takeList 中的数据归还给channel 内存队列
问题
事务时如何保证数据的端到端完整性呢?看下面有两个agent的情况:
数据流程:
- source1 产生 Event,通过“put"、”commit"操作将Event 放到Channel 1中
- sink 1 通过“take”操作从Channel 1中去除Event ,并把它 发送到Source 2 中
- Source 2 通过“put”、“commit” 操作将Event放到Channel 2中
- source 2向 sink1 发送成功信号,sink 1 “commit” 步骤2 中的“take”操作(其实就是删除channel 1 中的event)
说明:在任何时刻,Event至少在一个Channel 中是完整有效的。
5、Flume 配置文件详解
查询详细配置项可以访问Flume官网;http://flume.apache.org/releases/content/1.7.0/FlumeUserGuide.html
1、Source 配置项(常见配置项)
5.1.1 Avro Source
不同主机上的Agent通过网络传输数据可使用的Source,一般是接受Avro client 的数据,或是和上一级的Agent的Avro Sink 成对存在。
配置项名称 | 默认值 | 描述 |
---|---|---|
Channel | – | |
type | – | 组建类型名称,必须为avro |
bind | – | 要坚挺的主机名或IP地址 |
port | – | 要绑定的端口号 |
threads | – | 产生的最大工作线程数 |
ipFilterRules | – | 使用此配置定义N个netty ipFilter模式规则 |
selector.type | ||
selector.* | ||
interceptors | – | 拦截器列表 |
interceptors | ||
compression-type | none | 可设置为“none”或“deflate”,压缩类型需要和AvroSource匹配 |
5.1.2 NetCat Source
NetCat Source可以使用TCP和UDP两种协议方式,使用方法基本相同,通过监听指定的IP和端口来传输数据,它会将监听到的每一行数据转化成一个Event写入到Channel中。
配置项名称 | 默认值 | 描述 |
---|---|---|
Channel | – | |
type | – | 类型指定为:netcat |
bind | – | 绑定机器名或IP地址 |
port | – | 端口号 |
max-line-length | 512 | 一行的最大字节数 |
ack-every-event | true | 对成功接受的Event返回OK |
selector.type | replicating | 选择器类型replicating or multiplexing |
selector.* | 选择器相关参数 | |
interceptors | 拦截器列表,多个以空格分隔 | |
interceptors.* | interceptors.* |
5.1.3 Exec Source
Exec source通过执行给定的Unix命令的传输结果数据,如,cat,tail -F等,实时性比较高,但是一旦Agent进程出现问题,可能会导致数据的丢失。
配置项名称 | 默认值 | 描述 |
---|---|---|
channels | ||
type | – | 类型指定为:exec |
command | – | 需要去执行的命令 |
shell | – | 运行命令的shell脚本文件 |
restartThrottle | 10000 | 尝试重启的超时时间 |
restart | false | 如果命令执行失败,是否重启 |
logStdErr | false | 是否记录错误日志 |
batchSize | 20 | 批次写入channel的最大日志数量 |
batchTimeout | 3000 | 批次写入数据的最大等待时间(毫秒) |
selector.type | replicating | 选择器类型replicating or multiplexing |
selector.* | 选择器其他参数 | |
interceptors | – | 拦截器列表,多个空格分隔 |
interceptors.* |
5.1.4 Spooling Directory Source
通过监控一个文件夹将新增文件内容转换成Event传输数据,特点是不会丢失数据,使用Spooling Directory Source需要注意的两点是,1)不能对被监控的文件夹下的新增的文件做出任何更改,2)新增到监控文件夹的文件名称必须是唯一的。由于是对整个新增文件的监控,Spooling Directory Source的实时性相对较低,不过可以采用对文件高粒度分割达到近似实时
配置项名称 | 默认值 | 描述 |
---|---|---|
channels | ||
type | – | 类型指定:spooldir. |
spoolDir | – | 被监控的文件夹目录 |
fileSuffix | .COMPLETED | 完成数据传输的文件后缀标志 |
deletePolicy | never | 删除已经完成数据传输的文件时间:never or immediate |
fileHeader | false | 是否在header中添加文件的完整路径信息 |
fileHeaderKey | file | 如果header中添加文件的完整路径信息时key的名称 |
basenameHeader | false | 是否在header中添加文件的基本名称信息 |
basenameHeaderKey | basename | 如果header中添加文件的基本名称信息时key的名称 |
includePattern | ^.*$ | 使用正则来匹配新增文件需要被传输数据的文件 |
ignorePattern | ^$ | 使用正则来忽略新增的文件 |
trackerDir | .flumespool | 存储元数据信息目录 |
consumeOrder | oldest | 文件消费顺序:oldest, youngest and random. |
maxBackoff | 4000 | 如果channel容量不足,尝试写入的超时时间,如果仍然不能写入,则会抛出ChannelException |
batchSize | 100 | 批次处理粒度 |
inputCharset | UTF-8 | 输入码表格式 |
decodeErrorPolicy | FAIL | 遇到不可解码字符后的处理方式:FAIL,REPLACE,IGNORE |
selector.type | replicating | 选择器类型:replicating or multiplexing |
selector.* | 选择器其他参数 | |
interceptors | – | 拦截器列表,空格分隔 |
interceptors.* | – |
5.1.5 Kafka Source
Kafka Source是一个Apache Kafka消费者,它读取来自Kafka主题的消息。如果有多个Kafka源在运行,可以将它们配置为相同的使用者组,这样每个使用者都将为主题读取一组唯一的分区。
配置项名称 | 默认值 | 描述 |
---|---|---|
channels | – | |
type | – | 组件类型名需要为org.apache.flume.source.kafka.KafkaSource |
kafka.bootstrap.servers | – | 源使用的Kafka集群中的代理列表 |
kafka.consumer.group.id | flume | 消费者群体的唯一标识。在多个源或代理中设置相同的id表明它们属于同一使用者组 |
kafka.topics | – | 以逗号分隔的主题从kafka消费者将读取消息。 |
kafka.topics.regex | – | 定义源订阅的主题集的正则表达式。这个属性比kafka具有更高的优先级。主题和超越kafka,如果存在主题 |
batchSize | 1000 | 在一个批处理中写入信道的最大消息数 |
batchDurationMillis | 1000 | 最大时间(在ms)之前批将被写入通道批将被写入第一个大小和时间将达到。 |
backoffSleepIncrement | 1000 | 当Kafka主题为空时触发的初始和增量等待时间。等待时间将减少空洞的kafka主题的侵略性脉冲。对于摄入用例来说,一秒是理想的,但是对于使用拦截器的低延迟操作,可能需要更低的值。 |
maxBackoffSleep | 5000 | 当Kafka主题显示为空时触发的最大等待时间。对于摄入用例,5秒是理想的,但是对于使用拦截器的低延迟操作,可能需要更低的值。 |
useFlumeEventFormat | false | 默认事件作为字节从卡夫卡的话题直接进入身体。设置为true以Flume Avro二进制格式读取事件。与KafkaSink上的相同属性或Kafka通道上的parseAsFlumeEvent属性一起使用,这将保留在生成端发送的所有Flume头文件。 |
migrateZookeeperOffsets | true | 当没有找到Kafka存储的偏移量时,在Zookeeper中查找偏移量并将其提交给Kafka。这应该是真实的,以支持无缝Kafka客户端迁移从旧版本的Flume。迁移后可以将其设置为false,但通常不需要这样做。如果没有发现Zookeeper偏移量,则Kafka配置Kafka .consumer.auto.offset。reset定义如何处理偏移量。查看Kafka文档了解详细信息 |
kafka.consumer.security.protocol | PLAINTEXT | SASL_PLAINTEXT, SASL_SSL或SSL如果写信给卡夫卡使用某种程度的安全。参见下面的附加信息安全设置。 |
more consumer security props | – | 如果使用sasl_明文,则SASL_SSL或SSL引用Kafka安全性来获得需要在消费者上设置的其他属性。 |
Other Kafka Consumer Properties | 这些属性用于配置Kafka使用者。可以使用Kafka支持的任何消费者属性。惟一的要求是在属性名前加上前缀kafka.consumer。例如:kafka.consumer.auto.offset.reset |
2. Channels 配置项(常见配置项)
5.2.1 Memory Channel
Memory Channel是使用内存来存储Event,使用内存的意味着数据传输速率会很快,但是当Agent挂掉后,存储在Channel中的数据将会丢失。
配置项名称 | 默认值 | 描述 |
---|---|---|
type | – | 组件名称,必须为 memory |
capacity | 100 | channel最大能存储的event数量 |
transactionCapacity | 300 | 每次事务中能从source中拉取或下沉到sink的最大event数量 |
keep-alive | 3 | 一个put操作执行的最大时间 |
byteCapacityBufferPercentage | 20% | 定义byteCapacityBuffer 的占比,它与 byteCapacity之和为100%,byteCapacity见下栏 |
byteCapacity | 默认为JVM可用最大内存的80% | 在这个channel中允许存放的最大字节数 这个字节数只计算event body,这也是需要提供 byteCapacityBufferPercentage 配置参数的原因。 默认为JVM可用最大内存的80% (即通过命令行传递的-Xmx值的80%)。 注意,如果一个agent里面包含了多个channel,channel里面又包含了多个相同的events,那么这些events会被重复计算。 将它设为 0 将会导致这个值强制设定为200GB的容量 |
5.2.2 Spillable Memory Channel
可以理解成Memory Channel和File Channel的混合体。当内存满的时候,才会启用磁盘存储。
配置项名称 | 举值说明 | 描述 |
---|---|---|
type | – | 必须设置成SPILLABLEMEMORY |
memoryCapacity | 10000 | 内存队列中事件的最大存放数 |
overflowCapacity | 1000000 | 内存队列溢出之后,在磁盘中存放的最大事件数量 |
byteCapacity | 800000 | 内存队列中能够存放的最大字节数 |
transactionCapacity | 10000 | channel从source一次获取的最大事件数量 |
checkpointDir | ${flume_home}/checkpoint | 用于存放检查点的目录(用户可自定义) |
dataDirs | ${flume_home}/data | 内存队列溢出后,用于存放数据的磁盘目录(用户可自定义) |
5.2.3 JDBC Channel
事件存储在由数据库支持的持久存储中。JDBC通道目前支持嵌入式Derby。这是一个持久的通道,对于可恢复性非常重要的流来说非常理想。
配置项名称 | 默认值 | 描述 |
---|---|---|
type | – | 组件类型名需要是jdbc |
db.type | DERBY | |
driver.class | org.apache.derby.jdbc.EmbeddedDriver | 数据库供应商,需要是DERBY。 |
driver.url | (constructed from other properties) | JDBC连接URL |
db.username | “sa” | 数据库连接的用户id |
db.password | – | db连接密码 |
connection.properties.file | – | JDBC连接属性文件的路径 |
create.schema | true | 如果为真,则创建db模式 |
create.index | true | 创建索引以加速查找 |
create.foreignkey | true | |
transaction.isolation | “READ_COMMITTED” | db会话的隔离级别:READ_UNCOMMITTED, READ_COMMITTED, SERIALIZABLE, REPEATABLE_READ |
maximum.connections | 10 | 允许db的最大连接数 |
maximum.capacity | 0 (unlimited) | 通道中事件的最大数量 |
sysprop.* | 供应商特定属性 | |
sysprop.user.home | – | 存储嵌入式Derby数据库的主路径 |
5.2.4 Kafka Channel
事件存储在Kafka集群中(必须单独安装)。Kafka提供了高可用性和复制,因此在代理或Kafka代理崩溃时,其他接收器可以立即使用这些事件
配置项名称 | 默认值 | 描述 |
---|---|---|
type | – | 组件类型名,需要是org.apache.flume.channel. kafkar . kafkachannel |
kafka.bootstrap.servers | – | 通道使用的Kafka集群中的代理列表这可以是代理列表的一部分,但是我们建议对于HA至少有两个。格式是用逗号分隔的主机名列表:端口 |
kafka.topic | flume-channe | 频道将使用kafka主题 |
kafka.consumer.group.id | flume | 通道用于向Kafka注册的消费者组ID。多个通道必须使用相同的主题和组,以确保当一个代理失败时,另一个代理可以获得数据。注意,具有相同ID的非通道使用者可能会导致数据丢失。 |
parseAsFlumeEvent | true | 期望在通道中使用FlumeEvent模式的Avro datums。如果Flume source写入到该频道,则为true;如果其他生产者写入到该频道使用的主题,则为false。可以使用org.apache.flume.source.avro在Flume外部解析给Kafka的Flume源消息。AvroFlumeEvent flume-ng-sdk提供的工件 |
migrateZookeeperOffsets | true | 当没有找到Kafka存储的偏移量时,在Zookeeper中查找偏移量并将其提交给Kafka。这应该是真实的,以支持无缝Kafka客户端迁移从旧版本的Flume。迁移后可以将其设置为false,但通常不需要这样做。如果没有找到Zookeeper偏移量,则kafkar .consumer.auto.offset。重置配置定义了如何处理偏移量。 |
pollTimeout | 500 | 在使用者的“poll()”调用中等待的时间(以毫秒为单位)。 |
defaultPartitionId | – | 指定此通道中要发送到的所有事件的Kafka分区ID(整数),除非partitionIdHeader覆盖。默认情况下,如果没有设置此属性,则事件将由Kafka生成器的分词器分发——如果指定,包括按键分发(或者由Kafka .partitioner.class指定的分词器分发)。 |
partitionIdHeader | – | 设置后,生成器将从事件头获取使用此属性值命名的字段的值,并将消息发送到主题的指定分区。如果该值表示无效分区,则通道将不接受该事件。如果头值存在,则此设置将覆盖defaultPartitionId。 |
kafka.consumer.auto.offset.reset | latest | 当没有初始偏移kafka或如果当前偏移量不存在服务器上的任何更多的(例如,因为数据已被删除):最早:自动重置抵消最早抵消最新:自动重置抵消最新抵消没有:抛出异常的消费者如果没有找到以前的抵消消费者集团其他:消费者抛出例外。 |
kafka.producer.security.protocol | PLAINTEXT | SASL_PLAINTEXT, SASL_SSL或SSL如果写信给卡夫卡使用某种程度的安全。参见下面的附加信息安全设置。 |
kafka.consumer.security.protocol | PLAINTEXT | kafka.producer.security一样。协议,但读取/消费从kafka |
more producer/consumer security props | – | 如果使用sasl_明文,则SASL_SSL或SSL引用Kafka安全性来获得需要在生产者/消费者上设置的其他属性。 |
5.2.5 File Channel
File Channel使用磁盘来存储Event,速率相对于Memory Channel较慢,但数据不会丢失。
配置项名称 | 默认值 | 描述 |
---|---|---|
type | – | 组件名称,必须为 file. |
checkpointDir | ~/.flume/file-channel/checkpoint | checkpoint文件的存储目录 |
useDualCheckpoints | false | 备份checkpoint文件,如果它为 true, backupCheckpointDir 必须 被设置 |
backupCheckpointDir | – | 用于备份的checkpoint目录,它 必须不能 与原checkpoint目录一样 |
dataDirs | ~/.flume/file-channel/data | ‘,’分隔的目录列表,用于存储日志文件。在不同的磁盘上使用多个目录可以提高filechannel的性能 |
transactionCapacity | 10000 | channel支持的最大事务数 |
checkpointInterval | 30000 | checkpoint之间的最大时间间隔 |
maxFileSize | 2146435071 | 单个日志文件最大的字节数 |
minimumRequiredSpace | 524288000 | 最少需要的空闲空间(以字节为单位)。为了避免数据损坏,当空闲空间低于此值时,filechannel将停止接受take/put请求 |
capacity | 1000000 | 单个channel存储的最大容量 |
keep-alive | 3 | 一个put操作执行的最大时间 |
checkpointOnClose | true | 在关闭时是否创建检查点,如果设置为true,可以加速filechannel的后续启动。 |
3. Sink 配置项(常见配置项)
5.3.1 Logger Sink
Logger Sink以INFO 级别的日志记录到log日志中,这种方式通常用于测试。
配置项名称 | 默认值 | 描述 |
---|---|---|
channel | – | |
type | – | 类型指定:logger |
maxBytesToLog | 16 | 能够记录的最大Event Body字节数 |
5.3.2 HDFS Sink
Sink数据到HDFS,目前支持text 和 sequence files两种文件格式,支持压缩,并可以对数据进行分区,分桶存储。
配置项名称 | 配置项名称 | 配置项名称 |
---|---|---|
channel | – | |
type | – | 指定类型:hdfs |
hdfs.path | – | HDFS的路径,eg hdfs://namenode/flume/webdata/ |
hdfs.filePrefix | FlumeData | 保存数据文件的前缀名 |
hdfs.fileSuffix | – | 保存数据文件的后缀名 |
hdfs.inUsePrefix | – | 临时写入的文件前缀名 |
hdfs.inUseSuffix | .tmp | 临时写入的文件后缀名 |
hdfs.rollInterval | 30 | 间隔多长将临时文件滚动成最终目标文件,单位:秒, 如果设置成0,则表示不根据时间来滚动文件 |
hdfs.rollSize | 1024 | 当临时文件达到多少(单位:bytes)时,滚动成目标文件, 如果设置成0,则表示不根据临时文件大小来滚动文件 |
hdfs.rollCount | 10 | 当 events 数据达到该数量时候,将临时文件滚动成目标文件,如果设置成0,则表示不根据events数据来滚动文件 |
hdfs.idleTimeout | 0 | 当目前被打开的临时文件在该参数指定的时间(秒)内, 没有任何数据写入,则将该临时文件关闭并重命名成目标文件 |
hdfs.batchSize | 100 | 每个批次刷新到 HDFS 上的 events 数量 |
hdfs.codeC | – | 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy |
hdfs.fileType | SequenceFile | 文件格式,包括:SequenceFile, DataStream,CompressedStre, 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC; 当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值; |
hdfs.maxOpenFiles | 5000 | 最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭 |
hdfs.minBlockReplicas | – | HDFS副本数,写入 HDFS 文件块的最小副本数。 该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件 |
hdfs.writeFormat | Writable | 写 sequence 文件的格式。包含:Text, Writable(默认) |
hdfs.callTimeout | 10000 | 执行HDFS操作的超时时间(单位:毫秒) |
hdfs.threadsPoolSize | 10 | hdfs sink 启动的操作HDFS的线程数 |
hdfs.rollTimerPoolSize | 1 | hdfs sink 启动的根据时间滚动文件的线程数 |
hdfs.kerberosPrincipal | – | HDFS安全认证kerberos配置 |
hdfs.kerberosKeytab | – | HDFS安全认证kerberos配置 |
hdfs.kerberosKeytab | – | HDFS安全认证kerberos配置 |
hdfs.round | false | 是否启用时间上的”舍弃” |
hdfs.roundValue | 1 | 时间上进行“舍弃”的值 |
hdfs.roundUnit | second | 时间上进行”舍弃”的单位,包含:second,minute,hour |
hdfs.timeZone | Local Time | 时区。 |
hdfs.useLocalTimeStamp | false | 是否使用当地时间 |
hdfs.closeTries 0 | Number | hdfs sink 关闭文件的尝试次数; 如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,这个未关闭的文件将会一直留在那,并且是打开状态; 设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功 |
hdfs.retryInterval | 180 | hdfs sink 尝试关闭文件的时间间隔, 如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1 |
serializer | TEXT | 序列化类型 |
5.3.3 Hive Sink
此接收器将包含分隔文本或JSON数据的事件直接流到Hive表或分区中。事件是使用Hive事务编写的。只要将一组事件提交到Hive,它们就会立即对Hive查询可见。flume将流到的分区既可以预先创建,也可以选择在缺少分区时创建它们。来自传入事件数据的字段被映射到Hive表中的相应列。
配置项名称 | 默认值 | 描述 |
---|---|---|
channel | – | |
type | – | 组件类型名称,需要为hive |
hive.metastore | – | Hive metastore URI(例如thrift://a.b.com:9083) |
hive.database | – | 数据库名称 |
hive.table | – | 表名称 |
hive.partition | – | 逗号分隔标识要写入的分区的分区值列表。可能包含转义序列。E。g:如果表按(continent: string, country:string, time:string)分区,那么’ Asia,India,2014-02-26-01-21 '将表示continent=Asia,country=India,time=2014-02-26-01-21 |
hive.txnsPerBatchAsk | 100 | Hive像Flume一样向流客户端授予一批事务而不是单个事务。此设置配置每个事务批处理所需的事务数量。来自单个批处理的所有事务的数据最终会出现在单个文件中。Flume将在批处理中的每个事务中写入批大小事件的最大值。此设置与batchSize一起提供了对每个文件大小的控制。注意这些文件到最终蜂巢将透明地紧凑的大文件。 |
heartBeatInterval | 240 | 发送到Hive的连续心跳之间的时间间隔(以秒为单位),以防止未使用的事务过期。将此值设置为0可禁用心跳。 |
autoCreatePartitions | true | Flume将自动创建流到的必要的Hive分区 |
batchSize | 15000 | 单个Hive事务中能写入的最大event数量 |
maxOpenConnections | 500 | 只允许此数目的打开连接。如果超过此数字,则关闭最近最少使用的连接。 |
callTimeout | 10000 | (毫秒)Hive & HDFS I/O操作的超时,比如openTxn、写、提交、中止。 |
serializer | Serializer负责从事件中解析出字段,并将它们映射到hive表中的列。序列化器的选择取决于事件中数据的格式。支持序列化器:分隔和JSON | |
roundUnit | minute | 四舍五入值的单位——second, minute 或 hour. |
roundValue | 1 | 四舍五入到该时间的最高倍数(在使用hive.roundUnit配置的单元中),小于当前时间 |
timeZone | Local Time | 用于解析分区中的转义序列的时区名称,例如America/Los_Angeles。 |
useLocalTimeStamp | false | 在替换转义序列时使用本地时间(而不是事件头中的时间戳)。 |
5.3.4 Avro Sink
发送到此接收器的Flume事件被转换为Avro事件,并发送到配置的主机名/端口对。事件以配置的批大小批次从配置的通道获取。
配置项名称 | 默认值 | 描述 |
---|---|---|
channel | – | |
type | – | 组件类型名,需要是avro。 |
hostname | – | 要绑定到的主机名或IP地址。 |
port | – | 要监听的端口 |
batch-size | 100 | 要一起批处理以发送的事件数目 |
connect-timeout | 20000 | 允许第一次(握手)请求的时间量(ms)。 |
request-timeout | 20000 | 允许第一次请求之后的时间量(ms)。 |
reset-connection-interva | none | 重置到下一跳的连接之前的时间量。这将迫使Avro接收器重新连接到下一跳。这将允许接收在添加新主机时连接到硬件负载均衡器后的主机,而无需重新启动代理。 |
compression-type | none | 这可以是“none”或“deflate”。压缩类型必须与匹配的AvroSource的压缩类型匹配 |
compression-leve | 6 | 压缩事件的压缩级别。0 =无压缩,1-9为压缩。数字越高压缩越多 |
ssl | false | 设置为true为此AvroSink启用SSL。在配置SSL时,您可以选择设置“信任库”、“信任库-密码”、“信任库-类型”,并指定是否设置“信任-所有证书”。 |
trust-all-certs | false | 如果将此设置为true,则不会检查用于远程服务器(Avro源)的SSL服务器证书。不应该在生产环境中使用这种方法,因为它使攻击者更容易执行中间人攻击并“监听”加密连接 |
truststore | – | 自定义Java信任库文件的路径。Flume使用此文件中的证书权威信息来确定是否应该信任远程Avro源的SSL身份验证凭据。如果没有指定,将使用默认的Java JSSE证书权威文件(通常是Oracle JRE中的“jssecacerts”或“cacerts”)。 |
truststore-password | – | 指定信任存储库的密码 |
truststore-type | JKS | Java信任存储的类型。可以是“JKS”或其他受支持的Java信任存储库类型。 |
exclude-protocols | SSLv3 | 要排除的SSL/TLS协议的空格分隔列表。SSLv3总是被排除在外除了指定的协议。 |
maxIoWorkers | 2 * the number of available processors in the machine | I/O工作线程的最大数目。这是在NettyAvroRpcClient NioClientSocketChannelFactory上配置的。 |
5.3.5 File Roll Sink
在本地文件系统上存储事件。
配置项名称 | 默认值 | 默认值 |
---|---|---|
channel | – | |
type | – | 组件类型名需要是file_roll。 |
sink.directory | – | 将存储文件的目录 |
sink.pathManager | DEFAULT | 要使用的PathManager实现。 |
sink.pathManager.extension | – | 如果使用默认的PathManager,则为文件扩展名。 |
sink.pathManager.prefix | – | 如果使用默认的PathManager,要添加到文件名开头的字符串 |
sink.rollInterval | 30 | 每30秒滚动一次文件。指定0将禁用滚动,并导致将所有事件写入单个文件。 |
sink.serializer | TEXT | 其他可能的选项包括avro_event或EventSerializer实现的FQCN。构建器接口。 |
batchSize | 100 |
6、注意事项
1、Flume的停止
使用kill 停止Flume 进程,不可使用 kill -9,因为 Flume内部注册了很多钩子函数执行善后工作,如果使用 kill -9 会导致钩子函数不执行,使用kill 时,Flume内部进程会监控到用户的操作,然后调用狗子函数,执行一些善后操作,正常退出。
2、Flume数据丢失问题
Flume可能丢失数据的情况是Channel 采用memoryChannel,agent宕机导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失。另外,Flume 有可能造成数据的重复,例如数据已经成功由Sink发出,但是没有接收到响应,Sink会再次发送数据,此时可能会导致数据的重复。
3、Sink从Channel中读取数据的方式
默认情况下,Sink获取数据的方式是:当Source向Channel发送一条数据的时候,Sink会通过循环的方式获取一条数据,然后再发送给客户端。
Sink可以分为KafkaSink和AvroSink,它们都是通过循环的方式获取数据,但是KafkaSink可以通过配置topic进行批量从客户端读取。但原理还是一条一条的从Channel读取数据,只是在Sink中存在缓存机制,当数据量达到某一数量的时候,会将数据批量发送到客户端。
4、CPU占用过高的问题
若程序运行出现CPU占用过高的现象,则可以在代码中加入休眠sleep,这样的话,就可以释放CPU资源,注意,内存资源不会释放,因为线程还未结束,是可用状态。
7、性能调优
Flume 经常被用在生产环境中收集后端产生的日志,一个Flume进程就是一个Agent,要充分发挥Flume的性能最主要的是要调好Flume的配置参数。
Flume agent配置分为三个部分:Source、Channel、Sink。
1、Source
(1) 增加Source个数(使用tairDirSource时可增加filegroups个数)可以增大Source读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个Source以保证Source有足够的能力获取到新产生的数据。
(2) batchSize参数决定Source一次批量传输到Channel的event条数,适当调大这个参数可以提高Source搬运Event到Channel时的性能。
2、Channel
(1) type选择memory时Channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据;type选择file时Channel的容错性更好,但是性能上会比memory channel 差。使用file Channel时dataDirs配置多个不同盘下的目录可以提高性能。
(2) capacity 参数决定Channel可容纳最大的event条数;transactionCapacity参数决定每次Source往Channel里面写的最大event条数和每次Sink从Channel 里面读的最大event条数;transactionCapacity需要大于Source和Sink的batchSize参数;byteCapacity是Channel的内存大小,单位是byte。
3、Sink
(1) 增加Sink的个数可以增加Sink消费event的能力。当然Sink也不是越多越好,够用就行,过多的Sink会占用系统资源,造成系统资源不必要的浪费。
(2) batchSize参数决定Sink一次批量从Channel读取的event条数,适当调大这个参数可以提高Sink从Channel搬出event的性能。
8、启动命令详解
flume安装很简单(linux上),去官网下载一个合适的版本,将压缩包上传至服务器,然后解压,进入conf目录,修改对应的配置文件,完了执行命令启动就好了。
bin/flume-ng agent -c ./conf ………….
commands: 命令
- help 显示帮助信息
- agent 启动一个agent进程
- avro-client 启动一个用于测试avro source的客户端(能狗发送avro序列化流)
- version 显示当前flume的版本信息
global options:全局通用选项
–conf,-c 指定flume的系统配置文件所在目录
–classpath,-C 添加额外的classpath
–dryrun,-d 不去真正启动flume agent,而是打印当前命令一些信息
–plugins-path 指定插件(jar)所在路径。默认:$FLUME_HOME/plugins.d
-Dproperty=value 传入Java环境参数
-Xproperty=value 传入所需的JVM配置参数
agent options:agent 可选参数
- –name,-n agent的别名(在用户采集方案配置文件中)(必填)
- –conf-file.-f 指定用户采集方案配置文件的路径
- –zkConnString,-z 指定zookeeper 的连接地址
- –zkBasePath,-p
指定用户配置文件所在的zookeeper path,比如:/flume/config - –no-reload-conf 关闭配置文件动态加载
- –help,-h display help text
avro-client options:
- –rpcProps,-P RPC client properties file with server connection params
- –host,-H avro序列化数据索要法网的目标主机(avro source所在机器)
- –port,-p avro序列化数据索要发往的目标主机的端口号
- –dirname
需要被序列化发走的数据所在目录 - –filename,-F 需要被序列化发走的数据所在文件(default:std input)
- –headerFile,-R 存储header key-value的文件
- –help,-h 帮助信息
启动avro客户端要么指定–rpcProps,要么指定–host和–port。
开启内置HTTP监控功能
- -Dflume.monitoring.type=http -Dflume.monitoring.port=34545
监控数据发往ganglia进行展示
- -Dflume.monitoring.type=ganglia -Dflume.monitoring.port=34890
9、案例
1.flume简单串联配置案例。(https://blog.csdn.net/qq_45798610/article/details/108014056)
2.Flume之将两个Flume的数据聚合到第三个Flume里面。(https://blog.csdn.net/qq_41489540/article/details/109288220)
3.大数据之flume:用Flume采集堕胎机器上的多种日志并存储于HDFS。(https://blog.csdn.net/qq_39436781/article/details/94592329)