采集目录到HDFS(监控文件目录变化)
采集需求:服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就要把文件采集到HDFS中去。
根据需求,首先定义一下3大要素:
- 采集源,即Source——监控文件目录:spooldir
- 下称目标,即Sink——HDFS文件系统:hdfs sink
- source 和 sink 之间的传递通道——channel,可用file channel,也可以用内存channel
配置文件编写:
# Name the components on this agent
a1.sources = r1 #source命名
a1.sinks = k1 #sink命名
a1.channels = c1 #channel命名
#spooldir source
a1.sources.r1.type = spooldir #source类型
a1.sources.r1.spoolDir = /root/logs #指定监控的目录
a1.sources.r1.fileHeader = true
#hdfs sink
a1.sinks.k1.type = hdfs #sink类型
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S #动态获取时间
a1.sinks.k1.hdfs.filePrefix = events- #文件的前缀信息
#roll三兄弟: 控制写入hdfs文件,以何种方式进行滚动 (控制文件的滚动)
a1.sinks.k1.hdfs.rollInterval = 3 #以时间间隔
a1.sinks.k1.hdfs.rollSize = 20 #以文件大小
a1.sinks.k1.hdfs.rollCount = 5 #以event个数
#如果上面三个都配置,谁先满足谁触发滚动
#如果不想以某个属性滚动,设置为0即可
#round三兄弟 是否开启时间上的舍弃 (控制文件夹的滚动)
#默认是不开启的,以下为例:以每10分钟开启一个新的文件夹
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.batchSize = 1
a1.sinks.k1.hdfs.userlocalTimeStamp=trule #使用本地的时间戳
a1.sinks.k1.hdfs.fileType=DataStream #文件类型
#channel,此处使用是内存缓存的方式
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000 #event个数为1000
a1.channels.transactionCapacity=100 #事务的容量为100
#channel 连接source和sink
a1.sources.r1.channels=c1 #soource的channel为c1
a1.sinks.k1.channels=c1 #sink的channel也为c1
- spooldir source
- 注意其监控的文件夹下面不能有同名文件的产生
- 如果有,报错且罢工,后续就不能再进行数据的监视采集了
- 在企业中通常给文件追加时间戳命名的方式保证文件不会重名
启动agent去采集数据
bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console
-c conf 指定 flume 自身的配置文件所在目录
-f conf/netcat-logger.con 指定我们所描述的采集方案
-n a1 指定我们这个 agent 的名字
注意:
batchsize <= 事务容量(transactionCapacity) <= channel容量