- 使用Flume的HDFS Sink,将log文件中的数据写入HDFS,进到UI发现产生了大量的小文件,每个小文件都是
1K
多,而占一个128M
的block。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f5787a98d5e0f65ab4b332d4d3502e68.png)
- 解决:关键是以下三个关键变量的配置,如果要按照某一项来,比如rollSize,则其他两项设为0。
Name | Default | Description |
---|
hdfs.rollInterval | 30 | 滚动当前文件前等待的秒数 ( 设为0 =从不根据时间间隔滚动 ) |
hdfs.rollSize | 1024 | 触发滚动的文件大小,以字节为单位 (设为0=从不基于文件大小滚动) |
hdfs.rollCount | 10 | 在滚动之前写入文件的事件数 (设为0 =从不根据事件数滚动) |
- 下面贴出 flume-smallHdfs.conf 中的配置信息,按照
10K
来滚动。
a1.sources = r1
a1.channels = c1
a1.sinks = k1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /opt/flume/checkpoint/behavior/taildir_position.json
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /opt/apache-tomcat-7.0.72-01/logs/LogsCollect/atguigu.log
a1.sources.r1.filegroups.f2 = /opt/apache-tomcat-7.0.72-02/logs/LogsCollect/atguigu.log
a1.sources.r1.fileHeader = true
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /opt/flume/checkpoint/behavior_collect
a1.channels.c1.dataDirs = /opt/flume/data/behavior_collect
a1.channels.c1.maxFileSize = 104857600
a1.channels.c1.capacity = 90000000
a1.channels.c1.keep-alive = 60
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://node2:8020/flume/datastream
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.idleTimeout = 10
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 10240
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.useLocalTimeStamp=false
- 注意:
hdfs.idleTimeout
—— 关闭非活动文件的超时时间(0 =禁用自动关闭空闲文件)。 - 下面是修改配置文件后,写入HDFS的文件大小,发现生效了。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8446f9aef0d172118ad5673ffac0b56c.png)