一种基于Flume与Alluxio的数据收集方法
技术领域
本发明涉及信息技术领域,特别涉及一种云计算平台技术领域中基于Flume与Alluxio的数据快速收集的方法与装置。
背景技术
在云计算时代,面对海量数据,传统的ETL(Extraction-Transformation-Loading)工具显然力不从心,主要是数据转换开销太大,在性能上无法满足海量数据的采集需求。为了提高海量数据收集的性能,目前已经产生了各种成熟并且效果非常好的海量数据收集组件,比如常用的Apache基金会的开源Flume组件。Flume是一个分布式、可靠和高可用的海量数据聚合系统,其支持在系统中收集不同类型的数据源的数据,同时,提供对数据进行简单处理,并下沉到不同数据接收方的能力。
如图1中所示,Agent是一个独立的Flume数据收集进程,它主要包括以下几个子组件:
Source子组件:负责接收数据单元,并将数据单元批量的放置到一个或多个Channel子组件。
Sink子组件:负责将数据单元传输到下一跳或最终的目标存储,成功后将数据单元从Channel子组件中删除。
Channel子组件:位于Source子组件与Sink子组件之间,用于缓存传递进来的数据单元。
Sink子组件也称作数据下沉组件,现有的数据下沉组件主要有hdfs-sink、kafka-sink、hbase-sink等组件,并且数据都是下沉到基于HDD(Hard Disk Drive)硬盘驱动器的文件系统,因此Flume数据收集的数据下沉过程的性能瓶颈就在HDD的I/O操作上。即使将数据下沉到基于SSD(Solid State Drive)固态硬盘的文件系统,不仅大大增加了硬件的投入成本,而且数据下沉组件的性能提升也有限。为此,迫切需要一种能够提升数据收集性能的收集方法。
本发明中部分术语与解释如下:
ETL(Extraction-Transformation-Loading)数据提取转换和加载
HDFS(Hadoop Distributed File System)Hadoop分布式文件系统
MEM(Memory)内存
SSD(Solid State Drive)固态硬盘
HDD(Hard Disk Drive)硬盘驱动器
LRFU(Least Recently/Frequently Used)最近最久/频繁未使用
发明内容
针对上述问题,本发明提出了一种基于Flume与Alluxio的数据快速收集装置与收集方法。引入了Alluxio(原名为Tachyon)分布式内存文件系统,它是以内存为中心的虚拟的分布式存储系统,它统一了数据访问的方式,为上层的计算框架和底层存储系统提供了沟通的桥梁。
利用Alluxio组件的异步持久化与层次化存储等特性降低硬件的投入成本,并且提升了Flume的数据下沉组件的性能。层次化存储是指Alluxio根据I/O性能的高低从上向下配置存储层,它支持MEM、SSD、HDD这三种存储类型。异步持久化是指数据块写入内存中即可完成数据写入的I/O操作,持久化操作由Alluxio组件异步完成,因此节省了针对HDD或SSD的I/O操作时间,提升了数据下沉的效率。
更具体而言,本发明提出了一种基于Flume与Alluxio的数据收集装置与数据收集方法。其中,该数据收集装置包括:数据提取端、代理端、Alluxio端以及数据保存端;
其中,数据提取端用于采集获取海量的原始数据单元;
其中,代理端用于将数据提取端所提取的原始数据单元进行数据转换,得到统一格式的数据;其具体包括:Source子组件、Channel子组件以及flume-alluxio-Sink数据下沉组件;
其中,Alluxio端用于接收来自代理端的经过转换处理过的数据单元,并将数据单元传输到数据保存端执行数据异步持久化操作;
其中,数据保存端用于将数据单元持久化保存起来。
较佳地,Source子组件负责接收数据单元,并将数据单元批量的放置到一个或多个Channel子组件;
较佳地,Channel子组件位于Source与flume-alluxio-Sink数据下沉组件之间,用于缓存进来的数据单元。
较佳地,flume-alluxio-Sink数据下沉组件负责将数据单元传输到下一跳或最终的目标存储,成功后将数据单元从Channel中删除。
较佳地,flume-alluxio-Sink数据下沉组件具有Alluxio系统的异步持久化特性,flume-alluxio-sink数据下沉组件的异步持久化使得Channel组件中的数据写入到内存中就可以结束数据单元批量下沉的事务,而数据的持久化则由Alluxio的异步操作完成;
较佳地,flume-alluxio-Sink数据下沉组件还具有Alluxio系统的层次存储特性,由于Alluxio管理的数据块不只在内存中,它通过分配策略和回收策略管理数据块的存放和移动,使得flume-alluxio-sink数据下沉组件增加了可利用的内存容量。
本发明采用Alluxio分布式内存文件系统作为Flume Sink子组件的目标存储,设计了flume-alluxio-Sink数据下沉组件。通过利用Alluxio系统的异步持久化特性提高了数据下沉的效率,通过利用Alluxio系统的层次存储特性后,使得flume-alluxio-sink数据下沉组件大大增加了可利用的内存容量。
此外,本发明还提出一种基于Flume与Alluxio的数据收集方法,方案如下:
首先,安装部署启用层次存储的Alluxio集群;
第二步,设计实现flume-alluxio-sink数据下沉组件,并将设计的flume-alluxio-sink数据下沉组件的Jar包分发到Flume的每个节点机器的类加载路径;
第三步,最后配置数据收集的flume-alluxio-sink数据下沉组件的Type为alluxio。
完成以上三个步骤之后,第四步,启动所有Flume组件的Agent进程,即可使用基于Flume与Alluxio的数据快速收集方法。
其中,第二步中,flume-alluxio-sink组件的实现主要包括以下几部分内容:
Alluxio启用分层存储后配置分配策略、回收策略和预留空间;
设计实现继承自AbstractSink抽象类并实现了Configurable接口的AlluxioEventSink类;
定义flume-alluxio-sink组件sink类型参数的值为alluxio。
AlluxioEventSink类实现Configurable接口的Configure(Context context)方法读取有关Alluxio的相关配置参数;
AlluxioEventSink类实现抽象类AbstractSink的process()方法,通过循环处理接收到的数据单元,即将它们按照Hdfs中对应的文件格式写入Alluxio分布式内存文件系统;
针对HDFS中的不同文件类型,设计HDFS中多种格式数据文件与byte[]数组或ByteBuffer二进制缓冲区数据转换类;
Alluxio在将数据单元写入Alluxio之前会依赖所述的数据转换类转化数据类型。
本发明采用Alluxio作为Flume收集数据下沉的目标存储文件系统,设计实现了数据下沉组件flume-alluxio-sink。flume-alluxio-sink组件通过利用Alluxio的异步写入和层次存储特性降低了硬件的投入成本,并且提高了数据下沉的效率,提升了Flume数据收集的性能。通过配置的分配策略将数据尽量平均地分配到集群中的每个节点上,避免了一定程度的数据倾斜问题。
附图说明
图1是现有技术中数据收集装置的体系架构图;
图2是本发明实施例中数据收集装置的体系架构图;
图3是本发明实施例中类继承图;
图4是本发明实施例中数据收集方法的工作流程示意图;
具体实施例
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
参见图2,本发明提供一种基于Flume与Alluxio的数据收集装置1,其中,该数据收集装置1包括:数据提取端2、代理端3、Alluxio端4以及数据保存端5;
其中,数据提取端2用于采集获取海量的原始数据单元;
其中,代理端3用于将数据提取端所提取的原始数据单元进行数据转换,得到统一格式的数据;其具体包括:Source子组件31、Channel子组件32以及flume-alluxio-Sink数据下沉组件33;
其中,Alluxio端4用于接收来自代理端的经过转换处理过的数据单元,并将数据单元传输到数据保存端执行数据异步持久化操作;
其中,数据保存端5用于将数据单元持久化保存起来。
较佳地,Source子组件31负责接收数据单元,并将数据单元批量的放置到一个或多个Channel子组件32;
较佳地,Channel子组件32位于Source子组件31与flume-alluxio-Sink数据下沉组件33之间,用于缓存进来的数据单元。
较佳地,flume-alluxio-Sink数据下沉组件33负责将数据单元传输到下一跳或最终的目标存储,成功后将数据单元从Channel子组件32中删除。
较佳地,flume-alluxio-Sink数据下沉组件33具有Alluxio系统的异步持久化特性,flume-alluxio-sink数据下沉组件33的异步持久化使得Channel组件中的数据写入到内存中就可以结束数据单元批量下沉的事务,而数据的持久化则由Alluxio的异步操作完成;
较佳地,flume-alluxio-Sink数据下沉组件33还具有Alluxio系统的层次存储特性,由于Alluxio管理的数据块不只在内存中,它通过分配策略和回收策略管理数据块的存放和移动,使得flume-alluxio-sink数据下沉组件增加了可利用的内存容量。
本实施例所提出的数据采集装置采用Alluxio分布式内存文件系统作为FlumeSink子组件的目标存储,设计了flume-alluxio-Sink数据下沉组件。
本实施例中通过利用Alluxio系统的异步持久化特性提高了数据下沉的效率,异步持久化使得flume-alluxio-sink数据下沉组件将Channel组件中的数据写入到内存中就可以结束数据单元批量下沉的事务,而数据的持久化则由Alluxio的异步操作中完成。
本实施例中通过利用Alluxio系统的层次存储特性后,使得flume-alluxio-sink数据下沉组件大大增加了可利用的内存容量(基本上不会用尽),这是由于Alluxio管理的数据块不只在内存中,它通过分配策略和回收策略管理数据块的存放和移动。
另一方面,本发明的实施例提供一种基于Flume与Alluxio的数据收集方法,参见图4,包括如下步骤:
步骤101,安装部署并启用层次存储的Alluxio集群;
步骤102,设计实现flume-alluxio-sink数据下沉组件,并将设计实现的flume-alluxio-sink数据下沉组件的Jar包分发到Flume的每个节点机器的类加载路径;
步骤103,配置数据收集的flume-alluxio-sink数据下沉组件的Type为alluxio;
完成以上三个步骤之后,执行步骤104,启动所有Flume组件的Agent进程,即可使用基于Flume与Alluxio的数据快速收集方法。
较佳地,所述步骤102中,flume-alluxio-sink组件的实现主要包括以下步骤:
步骤1021,Alluxio启用分层存储后需要配置分配、回收策略和预留空间。
采用轮询调度分配策略,即分配数据块到有空间的最高存储层,存储目录通过轮询调度选出;采用LRFU回收策略,即基于权重分配的最近最少使用和最不经常使用策略移除数据块。每层存储预留空间比例,一般MEM预留0.4,SSD预留0.2,HDD不启用预留。
步骤1022,设计实现继承自AbstractSink抽象类并实现了Configurable接口的AlluxioEventSink类,如图3所示。
步骤1023,定义flume-alluxio-sink组件sink类型参数的值为alluxio。
步骤1024,AlluxioEventSink类实现Configurable接口的Configure(Contextcontext)方法读取有关Alluxio的相关配置参数,如:Alluxio的URI地址,文件路径,文件类型,文件名称生成策略,以及文件滚动策略等。
步骤1025,AlluxioEventSink类实现抽象类AbstractSink的process()方法,通过循环处理接收到的数据单元,即将它们按照Hdfs中对应的文件格式(如文本、顺序文件、Avro文件等)写入Alluxio分布式内存文件系统。
需要注意的是:写入数据到文件的事务处理以及写类型(WriteType.ASYNC_THROUGH)等。
步骤1026,针对HDFS中的不同文件类型,设计研发了HDFS中Text、Sequence、Avro等格式数据文件与byte[]数组或ByteBuffer二进制缓冲区数据转换类。如TextByteArrayConverter、TextByteBufferConverter等类。
步骤1027,Alluxio在将数据单元写入Alluxio之前会依赖上一条所述的转换类转化数据类型。
本发明采用Alluxio作为Flume收集数据下沉的目标存储文件系统,设计实现了数据下沉组件flume-alluxio-sink。flume-alluxio-sink组件通过利用Alluxio的异步写入和层次存储特性降低了硬件的投入成本,并且提高了数据下沉的效率,提升了Flume数据收集的性能。通过配置的分配策略将数据尽量平均地分配到集群中的每个节点上,避免了一定程度的数据倾斜问题。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其他实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是符合与本文所公开的原理和新颖特点相一致的最宽的范围。