Flume中常用Kafka Source、正则拦截器、HDFS Sink,这里把需要注意的点做一下总结,并实现数据根据事件时间和事件类型落到HDFS。
Kafka 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
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 列表
Search and Replace Interceptor
基于正则搜索和替换字符串。 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"
Regex Filtering Interceptor
基于正则过滤或反向过滤。 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
Regex Extractor Interceptor
基于正则从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、正则表达式与事件中字符串的匹配。
Hdfs 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
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 时间落盘。
