文章目录
- Source
- Channel
- Sink
- HDFS文件类型使用压缩
- HDFS路径建议
- 拦截器
- 内存优化
- Flume启停脚本
Flume版本:1.9
Source
- 常用的source:Taildir Source
- Taildir Source功能:监控目录下的多个追加文件
- 实现断点续传的原理:读取完数据后 将offset保存到磁盘的文件中
- 如果Taildir Source挂了,可能会出现重复数据,下面有两种处理方式:
1、Flume不处理,去重任务交给下游,这样可以确保Flume的效率(推荐)
2、Flume加事务,但会变慢(不推荐)
Channel
名称 | 默认容量 | 说明 | 应用场景 |
memory channel | 100个event | 基于内存,效率高,可靠性低 如果挂了,最坏可能丢100个event | 普通日志,要求快,丢一点无所谓 |
file channel | 100万个event | 基于磁盘,效率低,可靠性高 | 和钱相关的,要求准 |
kafka channel | 基于Kafka,效率高、可靠性高 | 直接对接Kafka |
Sink
- 常用的sink:HDFS Sink
- 对于HDFS Sink的HDFS小文件问题,要配置文件滚动:
1、按大小滚动:127M(略小于HDFS块大小182M)
2、按时间滚动:3600秒(注意:时间不能太长,如果设2小时,23:59滚动后01:59才滚下一次,ods脚本在01:00执行,就会漏数)
3、按event数量滚动:通常设为0,即是禁用
HDFS文件类型使用压缩
# HDFS文件类型及压缩方式
a1.sinks.k1.hdfs.fileType = CompressedStream
a1.sinks.k1.hdfs.codeC = gzip
HIVE表默认支持Gzip
HDFS路径建议
如果您的数仓有STG层(贴源层),那么hdfs.path
设置为贴源层的HDFS路径
我的数仓没有专设贴源层,而是创建了一个临时文件夹,存放Sqoop、Flume等临时数据文件,以供HIVE加载数据
hadoop fs -mkdir -p /temp/flume/kafka
Flume会自动根据hdfs.path
创建路径
一个TOPIC对于一个文件夹:/temp/flume/kafka/topic_name
# source
a2.sources.r2.type = org.apache.flume.source.kafka.KafkaSource
# header添加topic
a2.sources.r2.setTopicHeader = true
a2.sources.r2.topicHeader = topic
# sink
a2.sinks.k2.type = hdfs
# 指定数据存储目录
a2.sinks.k2.hdfs.path = /temp/flume/kafka/%{topic}/%Y-%m-%d
/temp/flume/kafka/%{topic}/%Y-%m-%d
拦截器
- ETL拦截器:用于轻度清洗,例如:过滤json格式不完整的数据
- 时间拦截器:提取日志的时间,用于日期分区,避免零点漂移的问题
内存优化
Flume可能出现异常:
ERROR hdfs.HDFSEventSink: process failed
java.lang.OutOfMemoryError: GC overhead limit exceeded
- 修改
flume-env.sh
把内存调到4~6G(假设日志服务器16G) - 促销节日来之前,增加机器(内存)
-Xms
:初始Java堆内存大小-Xmx
:最大Java堆内存大小
建议-Xmx
与-Xms
设为一致,减少内存抖动带来的性能影响
如果设置不一致,容易在初始化时,由于内存不够,频繁触发 fullGC
cd $FLUME_HOME/conf/
vim flume-env.sh
export JAVA_OPTS="-Xms3000m -Xmx3000m -Dcom.sun.management.jmxremote"
如图显示,Flume设置-Xms3000m -Xmx3000m
后,RES 显示为1.3g,远没达到3g
Flume启停脚本
mkdir ~/bin
cd ~/bin
touch f1.sh
chmod 777 f1.sh
vim f1.sh
#!/bin/bash
fc='/opt/module/scripts/flume1.conf'
start="nohup flume-ng agent --conf-file $fc --name a1 -Dflume.root.logger=INFO,LOGFILE >$FLUME_HOME/f1.txt 2>&1 &"
stop="ps -ef | grep $fc | grep -v grep | awk '{print \$2}' | xargs -n1 kill -9"
for i in hostname1 hostname2 hostname3
do
case $1 in
"start"){
echo "------START $i Flume------"
ssh $i $start
};;
"stop"){
echo "------STOP $i Flume------"
ssh $i $stop
};;
esac
done