目录
1 flume简介
flume是分布式的海量日志采集、聚合和传输的系统。从各类数据发送方接收数据进行简单处理后再写到各数据接收方。
配置项名称介绍:
a1.sources = r1 r2
a1.channels = c1 c2
a1.sinks = k1 k2
a1:flume节点名称,启动时通过参数命令-name指定。
a1.sources:监听的源,若有多个用空格隔开,用于收集数据并发送到channel。
a1.channels:临时通道,若有多个用空格隔开,存放source收集的数据,sink从这里读取数据。
a1.sinks:接收器,若有多个用空格隔开,从channel读取数据,并发送给目标 。
a1.sources.r1.type:源的类型,r1是源名称,可以是目录、日志文件、监听端口等。 常用的source的类型包括avro、exec、netcat、spooldir和syslog等。
a1.channels.c1.type:通道的类型,c1为通道名称,= memory表示为常用的memory-channel,同时也有其他类型的channel,如JDBC、file-channel、custom-channel等。
a1.sinks.k1.type:接收器类型,k1为接收器名称, = logger表示直接写入日志, 常用的包括avro、logger、HDFS、Hbase以及kafka等。
2 flume安装
1) 解压并安装
tar -zxvf apache-flume-1.8.0-bin.tar.gz
mv apache-flume-1.8.0-bin /opt/sqm
2) 修改配置文件
cd /opt/sqm/apache-flume-1.8.0-bin/conf
vi flume.conf
配置文件在文章后面。
3) 启动flume
nohup /opt/sqm/apache-flume-1.8.0-bin/bin/flume-ng agent --conf /opt/sqm/apache-flume-1.8.0-bin/conf --conf-file /opt/sqm/apache-flume-1.8.0-bin/conf/image_load.conf --name a1 -Dflume.root.logger=INFO,console &
此启动脚本为后台启动,因为指定的全路径,可在任一目录启动。
--conf:指定配置文件夹,包含flume-env.sh和log4j的配置文件
--conf-file:.conf 配置文件的地址
--name:agent(flume节点)名称
3 flume常用配置
1)source类型
(1)Avro Source
a1.sources.r1.type = avro
a1.sources.r1.channels = c1 c2
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 20001
a1.sources.r1.selector.type= multiplexing
# selector配置
a1.sources.r1.selector.header = logType
a1.sources.r1.selector.mapping.scsp_login = c1
a1.sources.r1.selector.mapping.scsp_auth = c2
(2)Taildir Source
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /scsp_taildir_position.json # json记录文件断点续传的位置,程序默认创建
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /scsp_login.*.log #正则匹配需要采集的SCSP登录日志
a1.sources.r1.headers.f1.logType = scsp_login
a1.sources.r1.filegroups.f2 = /scsp_auth.*.log # 正则匹配需要采集的SCSP鉴权日志
a1.sources.r1.headers.f2.logType = scsp_auth
a1.sources.r1.batchSize = 1000
(3)Syslog Sources
a1.sources.s1.type = org.apache.flume.source.SyslogTcpSource
a1.sources.s1.port = 9511
a1.sources.s1.host = 10.221.xxx.xx
a1.sources.s1.channels = c1
2)cannnel类型:
(1) memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 300000
a1.channels.c1.transactionCapactiy = 20000
a1.channels.c1.keep-alive = 30
属性 | 默认值 | 解释 |
---|---|---|
type | – | 组件类型,这个是: |
capacity | 100 | 内存中存储 Event 的最大数 |
transactionCapacity | 100 | source 或者 sink 每个事务中存取 Event 的操作数量(不能比 capacity 大) |
keep-alive | 3 | 添加或删除一个 Event 的超时时间(秒) |
byteCapacityBufferPercentage | 20 | 指定 Event header 所占空间大小与 channel 中所有 Event 的总大小之间的百分比 |
byteCapacity | Channel 中最大允许存储所有 Event 的总字节数(bytes)。默认情况下会使用JVM可用内存的80%作为最大可用内存(就是JVM启动参数里面配置的-Xmx的值)。 计算总字节时只计算 Event 的主体,这也是提供 byteCapacityBufferPercentage 配置参数的原因。注意,当你在一个 Agent 里面有多个内存 channel 的时候, 而且碰巧这些 channel 存储相同的物理 Event(例如:这些 channel 通过复制机制( 复制选择器 )接收同一个 source 中的 Event), 这时候这些 Event 占用的空间是累加的,并不会只计算一次。如果这个值设置为0(不限制),就会达到200G左右的内部硬件限制。 |
(2)file
a1.channels.quartz_product_c1.type = file
a1.channels.quartz_product_c1.checkpointDir = /opt/flume/chk/master/quartzProduct
a1.channels.quartz_product_c1.dataDirs = /opt/flume/data/master/quartzProduct
a1.channels.quartz_product_c1.minimumRequiredSpace = 51200
属性 | 默认值 | 解释 |
---|---|---|
type | – | 组件类型,这个是: |
checkpointDir | ~/.flume/file-channel/checkpoint | 记录检查点的文件的存储目录 |
useDualCheckpoints | false | 是否备份检查点文件。如果设置为 |
backupCheckpointDir | – | 备份检查点的目录。 此目录不能与**数据目录**或检查点目录 checkpointDir 相同 |
dataDirs | ~/.flume/file-channel/data | 逗号分隔的目录列表,用于存储日志文件。 在不同物理磁盘上使用多个目录可以提高文件channel的性能 |
transactionCapacity | 10000 | channel支持的单个事务最大容量 |
checkpointInterval | 30000 | 检查点的时间间隔(毫秒) |
maxFileSize | 2146435071 | 单个日志文件的最大字节数。这个默认值约等于2047MB |
minimumRequiredSpace | 524288000 | 最小空闲空间的字节数。为了避免数据损坏,当空闲空间低于这个值的时候,文件channel将拒绝一切存取请求 |
capacity | 1000000 | channel的最大容量 |
keep-alive | 3 | 存入Event的最大等待时间(秒) |
use-log-replay-v1 | false | (专家)是否使用老的回放逻辑 (Flume默认是使用v2版本的回放方法,但是如果v2版本不能正常工作可以考虑通过这个参数改为使用v1版本,v1版本是从Flume1.2开始启用的,回放是指系统关闭或者崩溃前执行的校验检查点文件和文件channel记录是否一致程序) |
use-fast-replay | false | (专家)是否开启快速回放(不适用队列) |
checkpointOnClose | true | channel关闭时是否创建检查点文件。开启次功能可以避免回放提高下次文件channel启动的速度 |
encryption.activeKey | – | 加密数据所使用的key名称 |
encryption.cipherProvider | – | 加密类型,目前只支持: |
encryption.keyProvider | – | key类型,目前只支持: |
encryption.keyProvider.keyStoreFile | – | keystore 文件路径 |
encrpytion.keyProvider.keyStorePasswordFile | – | keystore 密码文件路径 |
encryption.keyProvider.keys | – | 所有key的列表,包含所有使用过的加密key名称 |
encyption.keyProvider.keys.*.passwordFile | – | 可选的秘钥密码文件路径 |
3)sink类型:
(1)kafka
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = image_load
a1.sinks.k1.kafka.bootstrap.servers =ip01:9092,ip02:9092,ip03:9092,ip04:9092
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.flumeBatchSize = 1000
a1.sinks.k1.channel = c1
(2)avro
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = xxx
a1.sinks.k1.port = 20001
自己用过的配置:
1)Taildir Source + Memory Channel + Avro Sink
2)Avro Source + Memory Channel + Kafka Sink
3)Syslogtcp Source + Memory Channel + Kafka Sink
我是将1)和2)配合使用的,但是要注意的是,先启动2)再启动1)。
4 部署类型
1)单一流程
2)多代理流程(多个agent顺序相连)
为了能让数据流在多个Agent之间传输,前一个Agent的sink必须和后一个Agent的source都需要设置为avro类型并且指向相同的hostname(或者IP)和端口
3)流的合并(多个agent的数据汇聚到同一个agent)
这种情况应用的场景比较多,比如要收集Web网站的用户行为日志, Web网站为了可用性使用的负载集群模式,每个节点都产生用户行为日志,可以为每个节点都配置一个Agent来单独收集日志数据,然后多个Agent将数据最终汇聚到一个用来存储数据存储系统,如HDFS上。
4)多路复用流(多级流)
从Agent foo扇出流到多个channel中。这种扇出的机制可以是复制或者选择。
当配置为复制的时候,每个Event都被发送到3个channel上。
当配置为选择的时候,当Event的某个属性与配置的值相匹配时会被发送到对应的channel。
复制选择器
它是默认的选择器。
属性 | 默认值 | 解释 |
---|---|---|
selector.type | replicating |
|
selector.optional | – | 指定哪些channel是可选的,多个用空格分开 |
a1.sources = r1
a1.channels = c1 c2 c3
a1.sources.r1.selector.type = replicating
a1.sources.r1.channels = c1 c2 c3
a1.sources.r1.selector.optional = c3
上面这个例子中,c3配置成了可选的。向c3发送数据如果失败了会被忽略。c1和c2没有配置成可选的,向c1和c2写数据失败会导致事务失败回滚。
多路复用选择器
属性 | 默认值 | 解释 |
---|---|---|
selector.type | replicating | 组件类型,这个是: |
selector.header | flume.selector.header | 想要进行匹配的header属性的名字 |
selector.default | – | 指定一个默认的channel。如果没有被规则匹配到,默认会发到这个channel上 |
selector.mapping.* | – | 一些匹配规则,具体参考下面的例子 |
a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state #以每个Event的header中的state这个属性的值作为选择channel的依据
a1.sources.r1.selector.mapping.CZ = c1 #如果state=CZ,则选择c1这个channel
a1.sources.r1.selector.mapping.US = c2 c3 #如果state=US,则选择c2 和 c3 这两个channel
a1.sources.r1.selector.default = c4 #默认使用c4这个channel
5)故障转移与负载均衡
Sink groups允许组织多个sink到一个实体上。
Sink processors能够提供在组内所有Sink之间实现负载均衡的能力,而且在失败的情况下能够进行故障转移从一个Sink到另一个Sink。
故障转移
故障转移组逻辑处理器维护了一个发送Event失败的sink的列表,保证有一个sink是可用的来发送Event。
故障转移机制的工作原理是将故障sink降级到一个池中,在池中为它们分配冷却期(超时时间),在重试之前随顺序故障而增加。 Sink成功发送事件后,它将恢复到实时池。sink具有与之相关的优先级,数值越大,优先级越高。 如果在发送Event时Sink发生故障,会继续尝试下一个具有最高优先级的sink。 例如,在优先级为80的sink之前激活优先级为100的sink。如果未指定优先级,则根据配置中的顺序来选取。
要使用故障转移选择器,不仅要设置sink组的选择器为failover,还有为每一个sink设置一个唯一的优先级数值。 可以使用 maxpenalty 属性设置故障转移时间的上限(毫秒)。
属性 | 默认值 | 解释 |
---|---|---|
sinks | – | 这一组的所有sink名,多个用空格分开 |
processor.type | default | 组件类型,这个是: |
processor.priority.<sinkName> | – | 组内sink的权重值,<sinkName>必须是当前组关联的sink之一。数值(绝对值)越高越早被激活 |
processor.maxpenalty | 30000 | 发生异常的sink最大故障转移时间(毫秒) |
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
负载均衡
负载均衡Sink 选择器提供了在多个sink上进行负载均衡流量的功能。 它维护一个活动sink列表的索引来实现负载的分配。 默认支持了轮询(round_robin)和随机(random)两种选择机制分配负载。 默认是轮询,可以通过配置来更改。也可以从 AbstractSinkSelector 继承写一个自定义的选择器。
工作时,此选择器使用其配置的选择机制选择下一个sink并调用它。 如果所选sink无法正常工作,则处理器通过其配置的选择机制选择下一个可用sink。 此实现不会将失败的Sink列入黑名单,而是继续乐观地尝试每个可用的Sink。如果所有sink调用都失败了,选择器会将故障抛给sink的运行器。
如果backoff设置为true则启用了退避机制,失败的sink会被放入黑名单,达到一定的超时时间后会自动从黑名单移除。 如从黑名单出来后sink仍然失败,则再次进入黑名单而且超时时间会翻倍,以避免在无响应的sink上浪费过长时间。 如果没有启用退避机制,在禁用此功能的情况下,发生sink传输失败后,会将本次负载传给下一个sink继续尝试,因此这种情况下是不均衡的。
属性 | 默认值 | 解释 |
---|---|---|
processor.sinks | – | 这一组的所有sink名,多个用空格分开 |
processor.type | default | 组件类型,这个是: |
processor.backoff | false | 失败的sink是否成倍地增加退避它的时间。 如果设置为false,负载均衡在某一个sink发生异常后,下一次选择sink的时候仍然会将失败的这个sink加入候选队列; 如果设置为true,某个sink连续发生异常时会成倍地增加它的退避时间,在退避的时间内是无法参与负载均衡竞争的。退避机制只统计1个小时发生的异常,超过1个小时没有发生异常就会重新计算 |
processor.selector | round_robin | 负载均衡机制,可选值: |
processor.selector.maxTimeOut | 30000 | 发生异常的sink最长退避时间(毫秒) 如果设置了processor.backoff=true,某一个sink发生异常的时候就会触发自动退避它一段时间,这个 maxTimeOut 就是退避一个sink的最长时间 |
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
记录一下,以免时间久了忘掉。若有问题,欢迎批评指正。