Flume
一、组成
1、source
taildir 多目录、断点续传 1.7以后,1.6及以前(自定义source)
tailidir source挂了怎么办? 因为支持断点续传所以重启即可,但是会导致数据重复的问题,那怎么办?再次修改源码,修改成事务;下级去重(hive、spark去重)
taildir 是否支持递归遍历读取文件? 不支持。可通过修改源码。
2、channel
file:可靠性高、效率低、基于磁盘 100万event
memory:可靠性差、效率高 基于内存 100event
kafka:可靠性高、效率高 要求下一级必须kafka
3、sink
hdfs sink 需要注意小文件问题
时间 1小时 or 128m event=0 文件名.lzo.tmp =>文件名.lzo
4、put/take 事务
二、三个器
拦截器:
- etl => 简单的清洗 判断 json 完整性
- 分类型 => 启动日志、事件日志
实现Interceptor 接口(initialize,close,event,多event,builder) 打包上传flume/lib
拦截器不用也可以,同样的功能可在下一级处理。如分类可调为在hive 的dwd层拆解开来。如 spark streaming 里拆分,拉勾里的推荐就是这样做。
选择器 replicating (默认)=>把数据发往所有通道 multiplexing =>选择性发往不同的通道
监控器 ganglia:监控到 put take 尝试提交次数 远远大于最终提交的次数,说明flume 性能有问题。flume不稳定,就需要优化。优化:选提高自己(增加内存flume_env.sh 4G-6G内存)、找兄弟(增加flume 台数)。
三、优化及挂了怎么办
优化:
- hdfs sink 需要注意小文件问题
- 优化:选提高自己(增加内存flume_env.sh 4G-6G内存)、找兄弟(增加flume 台数)
- fileChannel 能多目录就多目录提高吞吐量
- kafkaChannel 优化 比memory+kafka sink 快
flume 挂了怎么办?重启即可。
- 可能数据丢失的情况:memory channel,100 events 会丢
- 可能数据重复的情况:taildir source 会导致重复一条,通过 事务 解决;kafka channel 也可能重复一两条;
- sink 是基于磁盘的,不会丢。
kafka 的20件事
一、基础
1、组成:生产者、消费者、broker、zk (zk存储哪些信息?只有生产者信息没有。broker id、消费者信息、分区信息、副本信息)
2、多少台:2 * (生产者峰值生产速率 * 副本数 / 100)+1 =3
3、压测 生产者峰值生产速率 一般会低于 50M/s
4、副本数通常会设置2-3个,2个居多(因为副本作用是提高可靠性,太多会带来磁盘io 太多,影响性能)
5、kafka 数据保存多久? 默认保存 7 天。生产环境调整到 3 天(因为kafka 数据每天我们都要读完,还有保存太久也没用,因为日志服务器的数据会保存30天,假如数据丢了,可以重新去读日志服务器数据。)
6、磁盘空间准备多大:留30%预量
每天的数据量(100G)* 副本(2)*3天 /0.7
7、做没做kafka监控 eagle、kafka manager、monitor、自己写的(技术实力强)
8、ISR解决的是 leader挂了,谁当老大的问题。怎样能进入ISR队列?看延迟时间和延迟条数(新版本只有延迟时间)
9、分区分配策略:
- range(默认)容易产生数据倾斜,卡死。即没除开的话,会把数据放在低分区的场景。
- -round robin 把所有任务随机打散,排序轮询
10、分区数的设置?
期望的吞吐量/ min(生产者峰值生产速率,消费者消费速率)
(1) 创建一个只有1个分区的topic
(2) 测试这个topic的producer吞吐量和consumer吞吐量
(3) 假设他们的值分别是Tp和Tc,单位可以是MB/s
(4) 然后假设总的目标吞吐量是Tt,那么分区数=Tt/min(Tp,Tc)
–next week todo
二、挂了
三、消息丢失
四、重复
五、积压
六、优化