文章目录

  • 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

flume数据重复排查 flume保证数据不重复_big data

拦截器

  • ETL拦截器:用于轻度清洗,例如:过滤json格式不完整的数据
  • 时间拦截器:提取日志的时间,用于日期分区,避免零点漂移的问题

内存优化

Flume可能出现异常:
ERROR hdfs.HDFSEventSink: process failedjava.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数据重复排查 flume保证数据不重复_hdfs_02

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