Flume Kafka Source、正则拦截器、HDFS Sink

匿名 (未验证) 提交于 2019-12-03 00:29:01

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 时间落盘。 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!