开发者学堂课程【Flume 基础应用实战-企业全场景解决方案:Apache Flume- 案例-监控采集文件夹变化(sqoopdir、HDFS)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/715/detail/12768
Apache Flume- 案例-监控采集文件夹变化(sqoopdir、HDFS)
内容介绍:
一、产生背景
二、确定组件
三、采集方案
一、产生背景
在公司服务器当中会有一个目录,在目录下,它会源源不断产生新的文件,用专业的说法,叫做滚动。比如每隔一天,每隔半小时滚动生成一个新的文件,现在要求一旦有新的文件产生滚动出来,就要把这个新的文件给它采集,收集到通过 flume上传到 HDFS 中去,这个需求听起来很简单,开发起来也很简单,要做的就是根据这个需求去确定三个组件有哪些能够满足需求。
二、确定组件
通过对 flume 官网的一个学习了解或者去调研发现当中分别有对应的组件可以满足需求。
(1)采集源,即 source-- 监控文件目录: spooldir
(2)下沉目标,即 sink--HDFS 文件系统: hdfs sink
source 和 sink 之间的传递通道 --channel,可用 file channel ,也可以用内存channel
明确了这三个组件具体的类型之后,接下来是重点——把这三个类型编写在一个采集方案的配置文件并描述清楚,这样 flume 才能够去工作。
三、采集方案
首先,第一大块是针对三个组件做一个具体详细的描述,source 叫 r1,sink 叫k1,channel 叫 c1。
Source 叫 spooldir source,这是官网支持的,它可以用于监控一个文件夹,或者叫做文件的目录。这个目录是 spoolDir,路径是 /root/logs,这个路径可以根据需求指定到服务器需要监控的那个目录下,下面加载文件的头信息。
整个采集方案最大的难点工作量在于 hdfs sink 当中,把数据放到 hdfs 上去很简单,指定一个路径放上去就可以了。问题是当中有很多优化的参数需要注意,首先a1 的 k1 的 type 等于 hdfs,这个选项表明要把数据上传到 hdfs 中去,接下来是上传的这个路径,下面的第三级和第四级目录是没有写死的动态目录。
年月日时分,这就是 flume 支持的一种语法,可以动态地获取当前的时间,开启动态获取这些功能的时候呢,需要加载一个 uselocalTimeStamp 使用本地的时间戳,它就可以根据当前本地的时间来动态的填充里面具体的值。
这个是文件的前缀信息。
文件类型:指上传到 hdfs 是以什么类型存放,是以普通的文本形式文件,或是一个序列化文件。
一个是 round,俗称 round 三兄弟,一个是 roll 三兄弟,重点来看一下,这六个参数控制什么属性。
1、roll
从草图可以看出,如果不做任何滚动,一直往文件中写数据,文件内容就会越来越多,这时候 roll 滚动是指控制文件以何种方式滚动,而不是一直写在一个文件当中。有三种方式,以时间间隔、文件大小和 event 个数。
(1)rollInterval
默认值: 30
hdfs sink 间隔多长将临时文件滚动成最终目标文件,单位:秒;
如果设置成0,则表示不根据时间来滚动文件;
注:滚动 (ro11)指的是,hdfs sink 将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据;
(2)rollSize
默认值:1024
当临时文件达到该大小(单位:bytes) 时,滚动成目标文件;
如果设置成0,则表示不根据临时文件大小来滚动文件;
(3)rollCount
默认值:10
当 events 数据达到该数量时候,将临时文件滚动成目标文件;
如果设置成0,则表示不根据 events 数据来滚动文件;
强调:如果三个都配置,谁先满足谁出发滚动;如果不想以某个属性滚动,设置为0即可。
2、round
指是否开启时间上的舍弃,控制文件夹以多少时间间隔滚动。
(1)round
默认值:false
是否启用时间上的“舍弃”,这里的“舍弃”,类似于“四舍五入”。
(2)roundValue
默认值:1
时间上进行“舍弃”的值。
(3)roundUnit
默认值:seconds
时间上进行“舍弃”的单位,包含: second,minute,hour
示例:
al.sinks.k1.hdfs.path=/flume/events/%v-%-%d/%H%M/%S
al. sinks.k1.hdfs.round=true
al.sinks.k1.hdfs.roundValue=10
al.sinks.kl.hdfs.roundUnit=minute
//这个文件夹会以十分钟的频率滚动一次
当时间为2015-10-16 17:38:59时候,hdfs.path 依然会被解析为:
/flume/events/20151016/17:30/00
因为设置的是舍弃10分钟内的时间,因此,该目录每 10分钟新生成一个文件夹。
文件的滚动和文件夹的滚动,在企业当中用的非常多。
这里有 memory channel 内存来进行数据的缓存,最大的可以存储的 event 数量是1000个,事物容量是100个,这100个要么一起成功,要么一起失败。
把这些参数都具体描述清楚之后,最后做一个主张,source 的 channel 的为 c1,sink 的 channel 也为 c1,这时候又相当于 channel 一手握着数据源,一手握着目的地,构成了一个 agent flume。
这就是满足于当下业务需求的一个采集方案,名字可以根据见名知意的规则命名起来,它可以用来监视我们文件夹的一个滚动。