【大数据实验系列】解决日志收集框架Flume使用HDFS的Sink类型,且使用codeC=gzip压缩方式时,Flume日志信息一直卡在Got brand-new Compressor[.gz]的问题

1. 文章主要内容

       本篇博客涉及内容是大数据Flume框架,旨在解决Flume使用HDFS的SINK,且使用codeC压缩方式时,Flume日志卡死的问题。(通读本篇博客大概需要5分钟左右的时间)。

2. Flume相关基础知识(简单的介绍与此问题相关的知识)

       Flume日志收集框架由Source、Channel和SINK三大组件组成。博主的实验场景:通过spooldir的source监控某一文件夹内容是否发生改变,如果发生改变,则通过HDFS类型的SINK以压缩gzip的格式写入到HDFS的指定路径中。以下给出HDFS相关的详细配置文件:

spool-memory-hdfs.sources = spool-source
spool-memory-hdfs.channels = memeory-channel
spool-memory-hdfs.sinks = hdfs-sink

spool-memory-hdfs.sources.spool-source.type = spooldir
spool-memory-hdfs.sources.spool-source.spoolDir = /home/config/spool_data

spool-memory-hdfs.channels.memeory-channel.type = memory

spool-memory-hdfs.sinks.hdfs-sink.type = hdfs
spool-memory-hdfs.sinks.hdfs-sink.hdfs.path = hdfs://hadoop000:8020/data/flume/spool/logs/%m%d%H%M
spool-memory-hdfs.sinks.hdfs-sink.hdfs.fileType = CompressedStream 
spool-memory-hdfs.sinks.hdfs-sink.hdfs.codeC = gzip
spool-memory-hdfs.sinks.hdfs-sink.hdfs.filePrefix = events-
spool-memory-hdfs.sinks.hdfs-sink.hdfs.batchSize = 100
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollInterval = 0
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollSize = 134217728
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollCount = 1000000
spool-memory-hdfs.sinks.hdfs-sink.hdfs.useLocalTimeStamp = true
spool-memory-hdfs.sinks.hdfs-sink.hdfs.round = true
spool-memory-hdfs.sinks.hdfs-sink.hdfs.roundValue = 1
spool-memory-hdfs.sinks.hdfs-sink.hdfs.roundUnit = minute

spool-memory-hdfs.sources.spool-source.channels = memeory-channel
spool-memory-hdfs.sinks.hdfs-sink.channel = memeory-channel

       这是我之前犯错误的flume.conf配置文件,我们着重看一下HDFS的SINK这块内容。其中,因为我们要使用压缩gzip的格式上传到HDFS指定文件上,所以这里的fileType设置为CompressedStream,同时要指定codeC为gzip,具体缘由来自flume官网。为了避免上传出现多个小文件问题,这里使用了rollInterval、rollSize、batchsize和rollCount四个参数。其中batchSize每个批次上传多少events数量,rollInterval代表的是上传间隔多少时间新创建一个文件,rollSize则代表文件大小达到多少则会创建一个新文件,rollCount则为当events数据达到设定值,则会创建一个新的文件。其中rollInterval、rollSize和rollCount如果都设置为0,意思上传文件不会使用这几个参数的限制条件。

3. 解决日志卡死问题(需要特别细心)

       博主出现问题的地方是,如上图的conf文件所示,我将rollInterval设置为0,意思是不用这个参数作为上传是否创建一个新文件的标准,另外两个rollSize、rollCount设置的又比较大。当博主开启Flume监听时,将某一文件,比如是data.log(文件的大小和events数量都很少),把其拷贝到Flume监听的文件夹中,仔细查看Flume监听日志,如下图所示:
在这里插入图片描述
       正常情况下日志会出现renaming重命名的开头的一条日志,但一直卡在上图红色圈起来的部分。后来经过仔细分析才知道,因为博主的data.log文件没有满足rollSize和rollCount参数设置的条件,但又没有设置rollInterval的参数。导致一直卡在这里。
       博主的解决办法是,将rollInterval设置为5,意思即为经过5秒就创建一个新的文件,当然只要满足你设置三个参数条件的任何一个都不会卡死在日志这里,这是一个需要非常细心的地方,大家注意。 修改后的conf文件如下所示:

spool-memory-hdfs.sources = spool-source
spool-memory-hdfs.channels = memeory-channel
spool-memory-hdfs.sinks = hdfs-sink

spool-memory-hdfs.sources.spool-source.type = spooldir
spool-memory-hdfs.sources.spool-source.spoolDir = /home/config/spool_data

spool-memory-hdfs.channels.memeory-channel.type = memory

spool-memory-hdfs.sinks.hdfs-sink.type = hdfs
spool-memory-hdfs.sinks.hdfs-sink.hdfs.path = hdfs://hadoop000:8020/data/flume/spool/logs/%m%d%H%M
spool-memory-hdfs.sinks.hdfs-sink.hdfs.fileType = CompressedStream 
spool-memory-hdfs.sinks.hdfs-sink.hdfs.codeC = gzip
spool-memory-hdfs.sinks.hdfs-sink.hdfs.filePrefix = events-
spool-memory-hdfs.sinks.hdfs-sink.hdfs.batchSize = 100
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollInterval = 5
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollSize = 134217728
spool-memory-hdfs.sinks.hdfs-sink.hdfs.rollCount = 1000000
spool-memory-hdfs.sinks.hdfs-sink.hdfs.useLocalTimeStamp = true
spool-memory-hdfs.sinks.hdfs-sink.hdfs.round = true
spool-memory-hdfs.sinks.hdfs-sink.hdfs.roundValue = 1
spool-memory-hdfs.sinks.hdfs-sink.hdfs.roundUnit = minute

spool-memory-hdfs.sources.spool-source.channels = memeory-channel
spool-memory-hdfs.sinks.hdfs-sink.channel = memeory-channel

4. 总结

       本篇博客主要梳理了一些Flume的知识,并且着重分析压缩参数的使用和注意事项,一些小细节如果没有注意,会折腾很多时间,甚至想错方向。如果博文有任何不对的地方,欢迎评论区交流,谢谢大家!

猜你喜欢

转载自blog.csdn.net/qq_32575047/article/details/129900227