学习前 先了解一下
企业中可能遇见的一个问题:spooldir 监控的目录文件 有重复名的话会报错且罢工!
在企业中如何控制文件的产生 文件名不同 我们20150109-01.log【我们文件名产生前用时间控制文件名 年月日小时 每一个小时的数据存储在一个文件中。这样就保证了 数据源文件名的不重复。
如何模拟一个不断变化的文件。 shell 循环
直接敲命名:while true;do date >> test.log;sleep 0.5;done
或者 写shell 脚本
#!/bin/bash
while true
do
date >> test.log
sleep 0.5
done
一/flume 的负载均衡(load-balance)
简单讲:一个agent 从服务器上获取数据源下沉到多个sink,多个sinK再由多个其他的agent1/agent2/agent3等来处理 然后sink 都到hdfs.
首先了解一下 文件内容是什么意思
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 k3
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true #如果开启,则将失败的 sink 放入黑名单
a1.sinkgroups.g1.processor.selector = round_robin # 另外还支持 random 随机round_robin 是轮训的意思
a1.sinkgroups.g1.processor.selector.maxTimeOut=10000 #在黑名单放置的超时时间,超时结
束时,若仍然无法接收,则超时时间呈指数增长
首先将note1上的flume 分发的到note2和Note3上
命令:scp -r /export/servers/flume/ root@note2:/export/servers/
Scp -r /export/servers/flume/ root@note3:/export/servers/
直接案例:
1.在note1上
vi exec-avro.conf
内容:
#agent1 name
agent1.channels = c1
agent1.sources = r1
agent1.sinks = k1 k2
#set gruop
agent1.sinkgroups = g1
#set channel
agent1.channels.c1.type = memory
agent1.channels.c1.capacity = 1000
agent1.channels.c1.transactionCapacity = 100
agent1.sources.r1.channels = c1
agent1.sources.r1.type = exec
agent1.sources.r1.command = tail -F /root/logs4/123.log
agent1.sinks.k1.channel = c1
agent1.sinks.k1.type = avro
agent1.sinks.k1.hostname = note2
agent1.sinks.k1.port = 52020
agent1.sinks.k2.channel = c1
agent1.sinks.k2.type = avro
agent1.sinks.k2.hostname = note3
agent1.sinks.k2.port = 52020
#set sink group
agent1.sinkgroups.g1.sinks = k1 k2
#set failover
agent1.sinkgroups.g1.processor.type = load_balance
agent1.sinkgroups.g1.processor.backoff = true
agent1.sinkgroups.g1.processor.selector = round_robin
agent1.sinkgroups.g1.processor.selector.maxTimeOut=10000
2.note2上
vi avro-logger.conf
me the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = note2
a1.sources.r1.port = 52020
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3.note3上
vi avro-logger.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = note3
a1.sources.r1.port = 52020
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动规则 :远离source 源的 先启动 这里下启动 note2 和note3
执行指令: bin/flume-ng agent -c conf -f conf/avro-logger.conf -n a1 -Dflume.root.logger=INFO,console
这个加黑的文件名改成对应的文件名在三台机器上 启动
案例二 flume 的容错(机制)
Failover Sink Processor 能够实现 failover 功能。
Failover Sink Processor 维护一个优先级 Sink 组件列表,只要有一个 Sink
组件可用,Event 就被传递到下一个组件。故障转移机制的作用是将失败的 Sink
降级到一个池,在这些池中它们被分配一个冷却时间,随着故障的连续,在重试
之前冷却时间增加。一旦 Sink 成功发送一个事件,它将恢复到活动池。 Sink 具
有与之相关的优先级,数量越大,优先级越高。
例如,具有优先级为 100 的 sink 在优先级为 80 的 Sink 之前被激活。如果
在发送事件时汇聚失败,则接下来将尝试下一个具有最高优先级的 Sink 发送事
件。如果没有指定优先级,则根据在配置中指定 Sink 的顺序来确定优先级。
直接案例:
Note1上:Vi failover-logger.cof
#agent1 name
agent1.channels = c1
agent1.sources = r1
agent1.sinks = k1 k2
#set gruop
agent1.sinkgroups = g1
#set channel
agent1.channels.c1.type = memory
agent1.channels.c1.capacity = 1000
agent1.channels.c1.transactionCapacity = 100
agent1.sources.r1.channels = c1
agent1.sources.r1.type = exec
agent1.sources.r1.command = tail -F /root/logs4/456.log
agent1.sinks.k1.channel = c1
agent1.sinks.k1.type = avro
agent1.sinks.k1.hostname = note2
agent1.sinks.k1.port = 52020
agent1.sinks.k2.channel = c1
agent1.sinks.k2.type = avro
agent1.sinks.k2.hostname = note3
agent1.sinks.k2.port = 52020
#set sink group
agent1.sinkgroups.g1.sinks = k1 k2
#set failover
agent1.sinkgroups.g1.processor.type = failover
agent1.sinkgroups.g1.processor.priority.k1 = 10 #优先级 权重 绝对值越大先使用 当此机器#不能正常运行时,会到下一个优先级高的执行
agent1.sinkgroups.g1.processor.priority.k2 = 1
agent1.sinkgroups.g1.processor.maxpenalty = 10000
Note2 上:可以使用案例四中的文件即可
Note3 上:同上
然后启动note2上的flume 和note3上的flume
最后启动note1上的flume
向456.Log文件中实时的写数据【while true;do date >456.log;sleep 0.5;done】,观察note2上有数据 note3上无数据 ;终止note2,再看note3 会发现note3有数据。
这就实现了容错 【note2挂了,还有note3上】