Flume中常用Kafka Source、正则拦截器、HDFS Sink,这里把需要注意的点做一下总结,并实现数据根F据事件时间和事件类型落到HDFS。
# source类型
agent.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
# kafka brokers列表
agent.sources.s1.kafka.bootstrap.servers = localhost:9092
# 配置消费的kafka topic
agent.sources.s1.kafka.topics = testTopic3
# 配置消费者组的id
agent.sources.s1.kafka.consumer.group.id = consumer_testTopic3
# 自动提交偏移量的时间间隔
agent.sources.s1.kafka.consumer.auto.commit.interval.ms = 60000
1、flume对从Kafka中读取到的Event默认会在Event Header中添加3个属性partition,topic,timestamp。如partition=2, topic=testTopic3, timestamp=1529237228398。timestamp:默认不是事件时间,也不是入Kafka时间,是flume agent 所在机器的毫秒时间戳。
2、kafka.topics.regex属性 可通过正则定义要读取的Topic 列表
基于正则搜索和替换字符串。
agent.sources.s1.interceptors.i2.type = search_replace
agent.sources.s1.interceptors.i2.searchPattern = "log_type":"userInfo1"
agent.sources.s1.interceptors.i2.replaceString = "log_type":"userInfo"
基于正则过滤或反向过滤。
agent.sources.s1.interceptors.i1.type = regex_filter
agent.sources.s1.interceptors.i1.regex = "log_type":"appError"
#排除或保留 true:基于正则排除 默认false:只基于正则保留
agent.sources.s1.interceptors.i1.excludeEvents = true
基于正则从Event body中抽取字段,添加到Event Header中。
agent.sources.s1.interceptors.i3.type = regex_extractor
agent.sources.s1.interceptors.i3.regex = "log_type":"(\\w+)".*"event_time":"(\\d+)"
agent.sources.s1.interceptors.i3.serializers = i3_s1 i3_s2
agent.sources.s1.interceptors.i3.serializers.i3_s1.name = LogType
agent.sources.s1.interceptors.i3.serializers.i3_s2.name = timestamp
1、正则表达式与事件中字符串的匹配。
# sink 类型
agent.sinks.r1.type = hdfs
# hdfs 目录 注意:%Y%m%d 需要event header 中有毫秒级的timestamp字段
# 在上边已经提取event的event_time作为header中的timestamp字段,这样就可以根据事件时间写入hdfs
agent.sinks.r1.hdfs.path = hdfs://node1:8020/flume_data/%Y%m%d/%{LogType}
#
#agent.sinks.r1.hdfs.useLocalTimeStamp = true
# hdfs 路径中时间解析的时区,默认Local Time
#agent.sinks.r1.hdfs.timeZone = Local Time
# hdfs 文件记录格式,Text:原文本
agent.sinks.r1.hdfs.writeFormat = Text
# hdfs文件格式,DataStream类型:输出文件不会被压缩
agent.sinks.r1.hdfs.fileType = DataStream
# hdfs文件大小为指定字节时,另起新的文件存储 0:不基于文件大小滚动文件
agent.sinks.r1.hdfs.rollSize = 102400
# hdfs文件大小为指定event事件数时,另起新文件存储 0:不基于文件大小滚动文件 注意:事件数不一定等于hdfs文件行数,如自定义拦截器将一个事件拆分成多行
agent.sinks.r1.hdfs.rollCount = 5
# 到指定秒时,另起新文件存储 0:不基于时间文件大小滚动文件
agent.sinks.r1.hdfs.rollInterval = 10
# hdfs文件前缀 后缀
agent.sinks.r1.hdfs.filePrefix=log
agent.sinks.r1.hdfs.fileSuffix=.txt
1、HDFS路径中的变量如%Y%m%d与%{LogType}。
%Y%m%d来自于Event Header中的timestamp字段,timestamp字段在Source 为Kafka Source时默认会添加当前flume agent的毫秒时间戳作为timestamp的值,也可以从Event body中提取如事件时间作为Event Header中的timestamp的值。
%{LogType}来自于Event Header中的LogType字段,可通过拦截器从Event body中提取。
2、HDFS Sink支持多种文件滚动方式,基于文件大小,基于Event行数,基于时间长短。
# source的名字
agent.sources = s1
# channels的名字
agent.channels = c1
# sink的名字
agent.sinks = r1
# 指定source使用的channel
agent.sources.s1.channels = c1
# 指定sink使用的channel
agent.sinks.r1.channel = c1
######## source相关配置 ########
# source类型
agent.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
# kafka brokers列表
agent.sources.s1.kafka.bootstrap.servers = localhost:9092
# 配置消费的kafka topic
agent.sources.s1.kafka.topics = testTopic3
# 配置消费者组的id
agent.sources.s1.kafka.consumer.group.id = consumer_testTopic3
# 自动提交偏移量的时间间隔
agent.sources.s1.kafka.consumer.auto.commit.interval.ms = 60000
######## interceptor相关配置 ########
# 定义要用到的拦截器
agent.sources.s1.interceptors = i1 i2 i3
# 1)定义拦截器i1---正则过滤
agent.sources.s1.interceptors.i1.type = regex_filter
agent.sources.s1.interceptors.i1.regex = "log_type":"appError"
#排除或保留 true:基于正则排除 默认false:只基于正则保留
agent.sources.s1.interceptors.i1.excludeEvents = true
# 2)定义拦截器i2---搜索替换
agent.sources.s1.interceptors.i2.type = search_replace
agent.sources.s1.interceptors.i2.searchPattern = "log_type":"userInfo1"
agent.sources.s1.interceptors.i2.replaceString = "log_type":"userInfo"
# 3)定义拦截器i3---正则抽取(抽取字段加入event header中)
agent.sources.s1.interceptors.i3.type = regex_extractor
agent.sources.s1.interceptors.i3.regex = "log_type":"(\\w+)".*"event_time":"(\\d+)"
agent.sources.s1.interceptors.i3.serializers = i3_s1 i3_s2
agent.sources.s1.interceptors.i3.serializers.i3_s1.name = LogType
agent.sources.s1.interceptors.i3.serializers.i3_s2.name = timestamp
######## channel相关配置 ########
# channel类型
agent.channels.c1.type = file
# 数据存放路径
agent.channels.c1.dataDirs = /Users/wangpei/tempData/flume/filechannle/dataDirs2
# 检查点路径
agent.channels.c1.checkpointDir = /Users/wangpei/tempData/flume/filechannle/checkpointDir2
# channel中最多缓存多少
agent.channels.c1.capacity = 1000000
# channel一次最多吐给sink多少
agent.channels.c1.transactionCapacity = 10000
######## sink相关配置 ########
# sink 类型
agent.sinks.r1.type = hdfs
# hdfs 目录 注意:%Y%m%d 需要event header 中有毫秒级的timestamp字段
# 在上边已经提取event的event_time作为header中的timestamp字段,这样就可以根据事件时间写入hdfs
agent.sinks.r1.hdfs.path = hdfs://node1:8020/flume_data/%Y%m%d/%{LogType}
#
#agent.sinks.r1.hdfs.useLocalTimeStamp = true
# hdfs 路径中时间解析的时区,默认Local Time
#agent.sinks.r1.hdfs.timeZone = Local Time
# hdfs 文件记录格式,Text:原文本
agent.sinks.r1.hdfs.writeFormat = Text
# hdfs文件格式,DataStream类型:输出文件不会被压缩
agent.sinks.r1.hdfs.fileType = DataStream
# hdfs文件大小为指定字节时,另起新的文件存储 0:不基于文件大小滚动文件
agent.sinks.r1.hdfs.rollSize = 102400
# hdfs文件大小为指定event事件数时,另起新文件存储 0:不基于文件大小滚动文件 注意:事件数不一定等于hdfs文件行数,如自定义拦截器将一个事件拆分成多行
agent.sinks.r1.hdfs.rollCount = 5
# 到指定秒时,另起新文件存储 0:不基于时间文件大小滚动文件
agent.sinks.r1.hdfs.rollInterval = 10
# hdfs文件前缀 后缀
agent.sinks.r1.hdfs.filePrefix=log
agent.sinks.r1.hdfs.fileSuffix=.txt
[wangpei@localhost ~/software/apache-flume-1.8.0-bin]$ bin/flume-ng agent --conf conf_kafkaSource_regInterceptor_hdfsSink -f conf_kafkaSource_regInterceptor_hdfsSink/agent.conf -name agent
{"log_type":"userInfo1","event_time":"1527804366000","uid":"123"}
{"log_type":"user_log","event_time":"1527804AAA366000","uid":"123"}
{"log_type":"appError","event_time":"1527804366000","uid":"123"}
{"log_type":"user_log","event_time":"1527804366000","uid":"123"}
1、log_type为appError被排除。
2、"log_type":"userInfo1"被修改成"log_type":"userInfo"。
3、会按事件的时间落盘,时间解析异常按flume agent 时间落盘。