一、Flume自带Channel
Flume自带两种Channel:Memory Channel 和 File Channel。
Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下使用,速度较快。如果需要关心数据丢失,那么Memory Channel就不应该被选用,因为随着程序的死亡、机器宕机或者重启都会导致数据的丢失。
File Channel将所有时间写到磁盘,因此在程序关闭或宕机的情况下不会丢失数据。
二、 Flume中的小文件问题
在Flume的官方配置文档中可以看出:flume存在小文件问题(默认10个Event,或1kb在Hdfs上创建一个文件;不够10个Event,30s秒创建一个.tmp文件)。官方配置如下所示:
hdfs.rollInterval 30 Number of seconds to wait before rolling current file (0 = never roll based on time interval)
hdfs.rollSize 1024 File size to trigger roll, in bytes (0: never roll based on file size)
hdfs.rollCount 10 Number of events written to file before it rolled (0 = never roll based on number of events)
企业解决小文件问题:
#1个小时生成一个新的文件 3600 或 半小时生成一个小文件 1800
a1.sinks.k1.hdfs.rollInterval = 3600
#设置每个文件的滚动大小大概为128MB (为了避免由于下一个event的加入导致整个文件需要进行分片)
a1.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a1.sinks.k1.hdfs.rollCount = 0
三、将数据上传到HDFS上的常见问题
当我们通过flume将数据上传到HDFS上时,通常存在数据看不懂的问题。(默认是序列化后的数据,文件类型为sequenceFile,需要将其设置为DataStream)
#设置文件类型,可支持压缩(保持数据不动)
a1.sinks.k1.hdfs.fileType = DataStream
四、flume丢失数据吗?
在Flume中一共有两个事务,一个是在Source到Channel之间,一个是Channel到Sink之间。在Source到Channel之间的叫put事务,在Channel到Sink之间的叫Take事务。(事务的存在是为了保证数据的安全性)
虽然Flume自带的事务性能一定程度保证数据的安全性,但在某些条件下仍旧存在丢失数据的可能性。那么如何保证Flume不丢数据呢?
要保证Flume不丢数据,需要选定特定的Source和Sink。具体组合如下:
Taildir Scorce(不丢数据) + File Channel(Memory在宕机等一些条件下容易丢失数据) + HDFS Sink(可能存在重复数据,但一定不丢数据)