本文主要介绍自己在生产中使用flume的实际配置,以便以后查询。如果能够为他人提供参考,荣幸之至。
在Flume中分为三个部分source、channel和sink。source主要用于接收数据,sink用于写出数据,channel作为source和sink的连接、保存和转发使用。其中非常好用的是,channel可以使用Kafka,从而使得Flume具有了超强的存储能力,如果在加上可靠的source和sink,完全可以保证数据零丢失。
本文使用的例子中采用的是内存channel,这种channel的缺点是存储长度有限,重启数据丢失,有点就是速度快,低延迟。至于source,使用的是avro。最后是sink,因为我得目的是将数据写入到HDFS中,以后Hadoop集群或Spark集群进行计算,因此使用的hdfs类型的sink。
配置文件如下:
补充说明
Flume的集群的节点个数为4,也就是说有4个进程,每台机器上一个。通过source和channel的关系可以看出,有两个source进行接收数据,每个source连接两个channel,每个channel一个sink。filePrefix配置为这样,是怕生成文件的时候有冲突,而且这样定义也方便查找问题,根据文件名可以知道对应的Flume实例。数据的存储是按小时区分的,方便计算数据的时候使用。
因为使用的hdfs类型的sink,因此flume的环境中还要包含Hadoop的环境配置,这样sink才能写输入到HDFS中。
配置的详细解释,请参考Flume配置相关的信息。
写入source使用的依赖如下:
代码参考如下:
备注:这种写入Flume的方式是非可靠的,因为flumeClient.appendBatch()方法没有返回任何参数,无法确保零数据丢失。但是如果Flume节点挂了,会抛出异常,因此可以通过捕获异常,对数据进行必要的处理以免无谓的丢失。