一种基于hdfs的大规模数据集装载的方法

文档序号:9330648阅读:953来源:国知局
一种基于hdfs的大规模数据集装载的方法
【技术领域】
[0001]本发明涉及互联网技术领域,一种基于HDFS的大规模数据集装载的方法。
【背景技术】
[0002]随着计算机技术、互联网技术的迅猛发展,Blog、RSS、视频共享、图片共享、社交应用的不断加入,使得海量数据的存储、管理和处理已经成为当今互联网公司面临的严峻问题。传统的数据存储与管理方式已经很难足海量数据存储在在容量、性能、存储效率和安全性等方面的要求。目前比较成熟的海量数据存储方法是在存储集群上部署分布式文件系统对数据进行分布式存储和管理。国内外常见的分布式文件系统有GFS、HDFS、Lustre、Ceph、GridFS、MogileFS、TFS、FastDFS等,各自适用于不同的领域。其中HDFS是基于Hadoop的分布式文件系统,具有高容错性的特点,设计用来部署在低廉的硬件上,提供高吞吐量访问应用程序的数据,适合有超大数据集的应用程序。
[0003]HDFS自带的copyFromLocalFile方法可以将客户端的文件装载到HDFS上,该方法循环遍历用户指定的文件(若指定的是文件夹,则递归遍历该文件夹下的所有文件),将读取的每一个文件以文件流的形式写入HDFS集群。
[0004]然而,HDFS自带的copyFromLocalFile方法,使用的是单线程技术,每次只能读取一个文件,读取单个文件时每次是将文件的流缓存一部分再传送到HDFS上,使用的是单生产者单消费者模式,读取文件的时候,网络是空闲的;网络传输的时候,磁盘的读写是空闲的,这种方法更适合小文件的传输。但是,HDFS在进行小文件处理时,名称节点需要耗费大量的内存来保存小文件的元数据信息,而且小文件的上传和下载的效率并不理想,对于大规模的小文件的传输来说并不合适,会使得传输时间大幅度增加。

【发明内容】

[0005]本发明采用多生产者多消费者的设计模式,解决了将大规模小数据集装载到HDFS时时间消耗巨大的问题。
[0006]本发明所采用的技术方案为:
[0007]—种基于HDFS的大规模数据集装载的方法,包括以下步骤:
[0008](I)文件分散存储
[0009]采用传输工具将数据文件分散存储在本地主机的多个磁盘上,产生小数据文件;
[0010](2)小数据文件的合并
[0011]判断上述多个磁盘上的小数据文件是否读取,将为读取的小数据文件,判断单个线程中所有小数据文件大小是否达到预定值,如果达到进行小数据文件合并,产生合并数据文件;
[0012](3)合并数据文件的转载
[0013]采用多生产者和多消费者模式将合并数据文件装载到HDFS的集群上。
[0014]所述的⑴文件分散存储:
[0015]为使用FTP、Sqoop, KafKa, Flume等工具将数据文件分散地储存在本地主机的多个磁盘上,产生小数据文件。
[0016]所述的⑵小数据文件的合并:
[0017]为在文件合并的起始点上,paths对象储存了所有需要装载到HDFS上的小数据文件地址,通过调用processFileltems方法,根据每个小数据文件的md5值判断该小数据文件是否曾经读取过,将没有读取过的小数据文件放到targets对象中储存。targets对象储存了单个线程单次所要处理的小数据文件集合,可以设置单个线程单次所有处理的小数据文件集合中所有小数据文件大小的阈值filemerge,当单个线程拿到了总大小超过设定的阀值filemerge时,这个时候就会进行小数据文件合并操作,产生合并数据文件。
[0018]所述的(3)合并数据文件的转载:
[0019]为采用多生产者和多消费者模式将合并数据文件装载到HDFS的集群上,生成者线程负责将读取到的合并数据文件写入到内存中;在生产者线程Load方法中,定义一个内存流对象的实例pureOut,将pureOut封装成压缩流,经过1Utils的copyBytes方法就可以将读取到的合并数据文件以流的形式压缩存储到内存流PureOut中,最后使用ConcurrentLinkedQueue实例化的对象outputStreamQueue来储存写入到内存中的pureOut ;消费者线程负责将内存中的流一一通过网络运输到HDFS的集群上;当内存队列中有数据的时候,作为消费者线程池中的线程就开始去读取内存队列中的流,将其装载到HDFS 上。
[0020]读取文件流的多生产者线程可以不停的往内存中写数据,读取内存流的多消费者线程可以不停的往HDFS集群传输数据,磁盘的读写和网络的传输可以保证高使用率,极大的提高了整个装载效率。
【附图说明】
[0021]图1:单台机器分散存储数据文件示意图;
[0022]图2:小文件合并流程示意图;
[0023]图3:大文件装载流程示意图;
[0024]图4:装载前的本地部分数据截图;
[0025]图5:装载后的HDFS集群中部分数据截图;
【具体实施方式】
[0026]以下结合说明书附图对本发明做出具体阐述:
[0027](I)文件分散存储:
[0028]为使用FTP、Sqoop, KafKa, Flume等工具将数据文件分散地储存在本地主机的多个磁盘上,产生小数据文件。
[0029](2)小数据文件的合并:
[0030]为在文件合并的起始点上,paths对象储存了所有需要装载到HDFS上的小数据文件地址,通过调用processFileltems方法,根据每个小数据文件的md5值判断该小数据文件是否曾经读取过,将没有读取过的小数据文件放到targets对象中储存。targets对象储存了单个线程单次所要处理的小数据文件集合,可以设置单个线程单次所有处理的小数据文件集合中所有小数据文件大小的阈值filemerge,当单个线程拿到了总大小超过设定的阀值filemerge时,这个时候就会进行小数据文件合并操作,产生合并数据文件。
[0031](3)合并数据文件的转载:
[0032]为采用多生产者和多消费者模式将合并数据文件装载到HDFS的集群上,生成者线程负责将读取到的合并数据文件写入到内存中;在生产者线程Load方法中,定义一个内存流对象的实例pureOut,将pureOut封装成压缩流,经过1Utils的copyBytes方法就可以将读取到的合并数据文件以流的形式压缩存储到内存流pureOut中,最后使用ConcurrentLinkedQueue实例化的对象outputStreamQueue来储存写入到内存中的pureOut ;消费者线程负责将内存中的流一一通过网络运输到HDFS的集群上;当内存队列中有数据的时候,作为消费者线程池中的线程就开始去读取内存队列中的流,将其装载到HDFS 上。
[0033]更具体的:
[0034]如图1所示,单台机器通过FTP、Sqoop, KafKa, Flume等工具将数据文件分散地存储在其所有挂载的多个磁盘上,产生小数据文件。这样,在往HDFS装载数据时,生产者线程池中的线程读取合并数据文件,就可以在所有磁盘上同时读取合并数据文件,避免了多线程在单个磁盘上读取合并数据文件时因磁盘的读取能力受限而阻塞。
[0035]如图2所示,小数据文件的合并流程。由于HDFS存储大量小数据文件的时候,HDFS的主结点会在内存中储存全部的小数据文件信息,会消耗大量的内存,因此HDFS不适合储存大量小数据文件。因此,我们在文件装载前,首先会进行小文件的合并,产生合并数据文件。具体的小文件合并流程为:
[0036]I)在合并小数据文件的起始点上,通过paths对象储存所有需要装载到HDFS上的本地小数据文件地址;
[003
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1