开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第二阶段):网站流量日志 Flume 收集--hdfs--基于文件闲置策略滚动】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/694/detail/12186
网站流量日志 Flume 收集--hdfs--基于文件闲置策略滚动
内容介绍:
一、 问题介绍
二、 解决方案
三、 具体操作
四、 检验参数效果
一、 问题介绍
在使用 flume往hdfs进行文件上传的时候,可以控制文件以何种方式进行滚动。将前面所采集的数据控制文件与文件的大小进行滚动,大小是128M,但是发现了一个现象,当数据没有满足滚动条件时,这个文件将会一直处在临时状态,原因是没有满足条件,所以无法进行滚动。
必须满足128M,才可以把这个文件关闭,然后重新打开一个新的文件往里面写数据。这在企业当中将会显得非常尴尬,因为这个文件一直是一个临时文件的状态。如果手动把这个 flume 结束,那么会完成滚动,但是企业当中肯定不能做。
进行演示:打开 flume 路径,ctrl+c结束滚动,flume 境关闭,然后刷新浏览器,发现文件名的.m去掉了
说明它不再是一个临时性文件,但这样做在企业中是不现实的,这时候产生了一个问题:当通过 flume 上传文件至 hdfs 当中,如果控制文件滚动的条件不满足怎么办?
二、 解决方案
通过配置文件,可以看到当下有三种条件:第一个是时间的间隔控制滚动。第二个是文件的大小控制滚动,第三个是 event 数量滚动。如果不满足,位于我们hdfs上的文件将会一直处于临时状态,这个文件后面会加一个.tmp。
事实上在 flume 当中,还有一个参数叫做基于文件的闲置时间的策略。闲置时间英文叫做 timeout,用 flume 往 hdfs 写文件的时候,如果经过多长时间没有数据,这时候也要发生一次文件的滚动,这个参数的默认值是零,就是说默认情况下闲置时间是没有的,就是没有数据的才会一直等待。既然有了这个参数,就可以把这个参数做修改。比如说设置为30秒,那么这30秒意味着如果经过30秒时间依然没有数据写入,那么这个时间也满足,也会发生一次滚动。这时候解决这个问题就非常的方便,需要在配置当中加入这个参数。
三、 具体操作:基于文件空闲时间滚动
在 flume 当中开启这样一个参数hdfs.idleTimeout
,默认值是0。如果配置指定时间比如配置30秒,意味着如果30秒之内文件没有数据写入,那么即使其他的滚动条件不满足,此时依然进行文件的滚动,避免文件一直处于临时状态。
这就是 flume 提供的一个小功能,接下来看怎么让它生效。打开服务器,首先cd到conf当中,使用 vim 打开配置文件 taildir,这篇文件是跟 hdfs 相关的,要写在sink当中,按insert进入编辑模式,在里面加上参数,前面的参数可以照着写,a1.sinks.k1.hdfs
.,然后加上idleTimeout
,再在后面写一个等号,它的默认单位是秒。
比如这里写20秒,这个意味着如果20秒没有数据写入,比如说这个文件空闲超过20秒的话,它依然会进行滚动。
四、 检验参数效果
确认无误之后保存这个参数,保存之后重新启动,用刚才的命令启动回车,启动完之后为了方便,把刚才这个文件名字重新改一个名字,cd到根目录下,之前叫做20181101,用cp命令给它改个名字叫20181102,保证两个文件不重复。
接下来把这一个新的文件20181102再放到weblog/test2
路径下,这个时候执行相当于这个路径下又产生了一个新的文件,而且这个文件的格式也符合监控的格式。回车,文件已经发生变化,接下来开始往里面写,发现这个文件现在是一个.tmp文件,说明它还没有满足滚动,但是下来已经没有数据了,等待一会儿,显示write call back
,打开浏览器刷新,发现文件发生了滚动。
相当于刚才配置的参数在做一个兜底操作,也就是说如果没有满足128M并且达到了这个空闲闲置的时间,那么依然进行文件的滚动,这样操作就会非常方便。这个间隔可以根据企业当中来自己配置,它的单位是秒,可以配置20秒,可以配置30秒,可以配置50秒,这样可以避免因为后面没有数据或者没有相关的东西,使得条件不满足,一直处于临时状态,这就是 flume 提供的一些参数属性。具体其他的想了解可以打开 flume 官网做一个具体的了解,但这个参数非常的重要,控制文件闲置的时间策略,如果文件控制多少时间没有数据依然进行文件的滚动,这样就符合实际情况了。