一種基于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