flume自定义interceptor

flume自定义interceptor来过滤不同的event

  • 需求:根据nginx日志中的不同json日志进行区分,分类存放并存入hdfs中
    • 实现flume的interceptor,重写intercept方法
    • flume采集的agent 客户端
    • flume agent的服务端
    • hdfs sink 和 hive

需求:根据nginx日志中的不同json日志进行区分,分类存放并存入hdfs中

实现flume的interceptor,重写intercept方法

代码不便于贴出,现提供如下思路
1.因json日志可能存在于日志中的某一条记录中,采用Java的Pattern和Matchr方法进行正则匹配,匹配到所需要的那些符合需求的日志,再根据日志特殊标志,如点击类,页面停留等进行筛选,放入不同的event头信息中.如果json信息涉及加密,另需要解密。如果json字符串简单,可以直接采用到后期采用hive的json Serde类类直接解析,我采用了按字段分割成所需要的类型来存储到hdfs中,代码完成后,打成jar包,上传到flume的lib包中(不推荐,比较暴力,后期如果自定义的包过多不好管理),也可以上传到flume的plus.d中(具体参考flume官网)

flume采集的agent 客户端

因为设计到跨网络,这里采用avro的结构

a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /opt/access2.log
#filter
a1.sources.r1.interceptors=i1
#a1.sources.r1.interceptors.i1.type=regex_filter
a1.sources.r1.interceptors.i1.type= com.zjrc.UserActiveInterceptor$Builder
a1.sources.r1.interceptors.i1.headerName= eventType
a1.sources.r1.interceptors.i1.regex=(ClickEvent)(.*)(apk=yygh)|(PageStopEvent)(.*)(apk=yygh)
a1.sources.r1.interceptors.i1.serializers = s1
a1.sources.r1.interceptors.i1.serializers.s1.name = eventType
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# sink
a1.sinks.k1.channel = c1
# sink type
# a1.sinks.k1.type = logger
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = {youip}
a1.sinks.k1.port = {youport}

启动命令:./bin/flume-ng agent -c conf -f conf/flume-nginx-a1.conf -n a1 -Dflume.root.logger=INFO,console

flume agent的服务端

该配置表示,当有数据来的时候,每小时滚动一次或者文件达到128M时滚动文件,当文件打开后,在半小时内没有event流入的时候关闭文件。
此处根据event的header来sink到hdfs经测试可通,但sink到文件没有测通

server.sources = a3
server.channels = c3
server.sinks = s3

server.sources.a3.type = avro
server.sources.a3.bind = {ip}
server.sources.a3.port = {port}
server.sources.a3.threads = 
server.sources.a3.compression-type = none
server.sources.a3.compression-level = 6
server.sources.a3.ssl = false
server.sources.a3.keystore-type = JKS
server.sources.a3.keystore = 
server.sources.a3.keystore-password = 
server.sources.a3.truststore-type = JKS
server.sources.a3.truststore = 
server.sources.a3.truststore-password = 
server.sources.a3.channels = c3

server.channels.c3.type = memory
server.channels.c3.capacity = 10000
server.channels.c3.transactionCapacity = 1000
server.channels.c3.channelfullcount = 10
server.channels.c3.keep-alive = 3
server.channels.c3.byteCapacity = 
server.channels.c3.byteCapacityBufferPercentage = 20

server.sinks.s3.type = hdfs
# 此处的变量sinkPre即是自定义的interceptor中根据日志内容设置的event的header
server.sinks.s3.hdfs.path = hdfs://hacluster/flume/nginx/%{sinkPre}/%y/%m/%d
server.sinks.s3.montime = 
# 文件默认名前缀
server.sinks.s3.hdfs.filePrefix = nginx
server.sinks.s3.hdfs.fileSuffix = 
server.sinks.s3.hdfs.inUsePrefix = 
# 正在打开的文件的后缀名
server.sinks.s3.hdfs.inUseSuffix = .tmp
# 当临时文件开启且某个时间内没有数据流入的时候关闭该文件
server.sinks.s3.hdfs.idleTimeout = 1800
# 一次处理多少event
server.sinks.s3.hdfs.batchSize = 1000
server.sinks.s3.hdfs.codeC =  
# 文件类型
server.sinks.s3.hdfs.fileType = DataStream
# 最大打开文件数,当超过此数量,将关闭最先打开的文件
server.sinks.s3.hdfs.maxOpenFiles = 5000
server.sinks.s3.hdfs.writeFormat = Text
# hdfs的超时时间
server.sinks.s3.hdfs.callTimeout = 10000
server.sinks.s3.hdfs.threadsPoolSize = 10
server.sinks.s3.hdfs.rollTimerPoolSize = 1
server.sinks.s3.hdfs.kerberosPrincipal = 
server.sinks.s3.hdfs.kerberosKeytab = 
server.sinks.s3.hdfs.round = false
server.sinks.s3.hdfs.roundUnit = second
# 默认使用本地时间戳
server.sinks.s3.hdfs.useLocalTimeStamp = true
# 失败多少次发出警告
server.sinks.s3.hdfs.failcount = 10
server.sinks.s3.hdfs.fileCloseByEndEvent = true
# 多长时间间隔滚动创建文件
server.sinks.s3.hdfs.rollInterval = 3600
# 文件达到多大的时候滚动文件
server.sinks.s3.hdfs.rollSize = 134217728
# 当event达到多少滚动文件,当值为0时文件的滚动和event的个数没有关系
server.sinks.s3.hdfs.rollCount = 0
server.sinks.s3.hdfs.batchCallTimeout = 1000
# 最小块复制个数
server.sinks.s3.hdfs.minBlockReplicas = 1
server.sinks.s3.serializer.appendNewline = true
server.sinks.s3.channel = c3 

启动命令:./bin/flume-ng agent -c conf -f conf/flume-nginx-server.conf -n a3 -Dflume.root.logger=INFO,console

hdfs sink 和 hive

这里的思路是,建立一个hive的外部分区表,设置定时,每天add partition

你可能感兴趣的:(bigdata)