一種數(shù)據(jù)傾斜處理方法及裝置的制造方法【專利摘要】本發(fā)明實施例提供一種數(shù)據(jù)傾斜處理方法及裝置,涉及計算機應(yīng)用
技術(shù)領(lǐng)域:
。其中,所述方法包括:當(dāng)進行映射關(guān)聯(lián)mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值;將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。本發(fā)明實施例提供的技術(shù)方案能有效避免mapreduce的shuffle(置亂)過程以及在單一reduce中處理同一個key(關(guān)鍵字)的大量數(shù)據(jù),可在一定程度上解決大部分的數(shù)據(jù)傾斜問題;換句話說,本發(fā)明實施例提供的技術(shù)方案是以資源來換取效率,大大提高會發(fā)生數(shù)據(jù)傾斜的hive任務(wù)的效率?!緦@f明】一種數(shù)據(jù)傾斜處理方法及裝置
技術(shù)領(lǐng)域:
[0001]本發(fā)明實施例涉及計算機應(yīng)用
技術(shù)領(lǐng)域:
,尤其涉及一種數(shù)據(jù)傾斜處理方法及裝置。【
背景技術(shù):
】[0002]目前,面對日益增長的海量數(shù)據(jù),用以支撐主流搜索引擎公司、電子商務(wù)、社交網(wǎng)站的傳統(tǒng)數(shù)據(jù)倉庫系統(tǒng)早已不堪重負(fù),而構(gòu)建于Hadoop集群之上的Hive的出現(xiàn)實現(xiàn)了大數(shù)據(jù)時代分布式數(shù)據(jù)倉庫,能有效的解決現(xiàn)有問題。數(shù)據(jù)關(guān)聯(lián)是關(guān)系數(shù)據(jù)庫功能的基本操作,是任何資源在萬維網(wǎng)上發(fā)布的一種方式?;诜植际竭\算(mapreduce)的數(shù)據(jù)倉庫Hive也支持在海量數(shù)據(jù)集上進行數(shù)據(jù)關(guān)聯(lián)操作,通常Hive進行數(shù)據(jù)倉庫(DW)數(shù)據(jù)關(guān)聯(lián)時,都是由兩個或多個海量數(shù)據(jù)集進行。例如,電子商務(wù)常見的數(shù)據(jù)模式為:將數(shù)十億的用戶流量和數(shù)億的商品、千萬級訂單數(shù)據(jù)集進行關(guān)聯(lián)運算來產(chǎn)生用戶、商品搜索推薦結(jié)果和電子郵箱相關(guān)聯(lián)的營銷數(shù)據(jù)。此類數(shù)據(jù)關(guān)聯(lián)操作的特點是海量數(shù)據(jù),同時數(shù)據(jù)分布不均勻,存在熱點數(shù)據(jù)。[0003]基于Hive的海量數(shù)據(jù)關(guān)聯(lián)的底層實現(xiàn)是由mapreduce提供的,S卩在Map(映射)階段根據(jù)數(shù)據(jù)的大小劃分為多個分布式計算任務(wù),盡可能利用數(shù)據(jù)本地化處理速度快的優(yōu)勢在本地進行運算,然后進行分區(qū)(即根據(jù)相同的關(guān)鍵字的數(shù)據(jù)進入同一數(shù)據(jù)處理列),最后在reduce(歸約)階段進行合并關(guān)聯(lián)運算。[0004]Mapreduce在進行數(shù)據(jù)關(guān)聯(lián)時,可在map階段和reduce階段分別進行。Map端聚合的適用條件是關(guān)聯(lián)方有一個數(shù)據(jù)集足夠小(一般不超過25MB)可以放在分布式緩存里,而reduce階段關(guān)聯(lián)的場景是關(guān)聯(lián)成員的數(shù)據(jù)集都很大,無法緩存。故對于海量數(shù)據(jù),無法進行map端關(guān)聯(lián)的,只能在reduce階段進行關(guān)聯(lián)。然而,此時數(shù)據(jù)關(guān)聯(lián)的瓶頸點已不在于數(shù)據(jù)規(guī)模的大小,而在與數(shù)據(jù)分布的不均勾。當(dāng)mapreduce在執(zhí)行程序進行數(shù)據(jù)關(guān)聯(lián)時,大部分reduce節(jié)點已執(zhí)行完畢,但是有一個或幾個reduce節(jié)點運行很慢,導(dǎo)致整個程序的執(zhí)行時間很長,這是因為某一個關(guān)聯(lián)關(guān)鍵字的數(shù)據(jù)條數(shù)比其他關(guān)聯(lián)關(guān)鍵字多很多(有時是百倍或者千倍),那么這個關(guān)聯(lián)關(guān)鍵字所在的reduce節(jié)點所處理的數(shù)據(jù)量要比其他節(jié)點就大很多,從而導(dǎo)致某一個或幾個節(jié)點遲遲運行不完,此稱之為數(shù)據(jù)傾斜。解決海量數(shù)據(jù)關(guān)聯(lián)的關(guān)鍵點就是解決數(shù)據(jù)傾斜問題。[0005]目前,mapjoin操作適用的條件是關(guān)聯(lián)表中有一張小表,數(shù)據(jù)量適合分布式緩存,在執(zhí)行過程中,mapjoin會把小表全部讀入本地內(nèi)存中,在map階段直接拿另外一個表的數(shù)據(jù)和內(nèi)存中表數(shù)據(jù)做匹配,這樣避免了reduce端關(guān)聯(lián),因此效率是最高的。但是上述方法對于小表的數(shù)據(jù)量有著很大的限制。當(dāng)小表的數(shù)據(jù)量超過一定的閾值時(mapjoin的閾值要根據(jù)集群的具體情況來具體設(shè)置,目前一般為100MB左右),就無法轉(zhuǎn)換為mapjoin。如果這兩個表中存在數(shù)據(jù)傾斜的問題,就會導(dǎo)致運算的速度特別緩慢,有的需要好幾天才能執(zhí)行完畢,有時候甚至根本就得到所需的結(jié)果。盡管我們調(diào)大了mapjoin的約束參數(shù),但是大部分業(yè)務(wù)場景仍然無法緩存最小的數(shù)據(jù)集,故此種方法不是通用的解決方式,無法解決我們的問題?!?br/>發(fā)明內(nèi)容】[0006]本發(fā)明實施例提供一種數(shù)據(jù)傾斜處理方法及裝置,用以解決現(xiàn)有技術(shù)中mapjoin操作對數(shù)據(jù)量限制的問題。[0007]本發(fā)明實施例提供一種數(shù)據(jù)傾斜處理方法,包括:[0008]當(dāng)進行映射關(guān)聯(lián)mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值;[0009]將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。[0010]可選地,上述的所述方法,還包括:[0011]獲取進行mapjoin操作的兩個數(shù)據(jù)集的數(shù)據(jù)量;[0012]比較所述兩個數(shù)據(jù)集的數(shù)據(jù)量,并根據(jù)比較結(jié)果將所述數(shù)據(jù)量小的數(shù)據(jù)集作為所述第一數(shù)據(jù)集,所述數(shù)據(jù)量大的數(shù)據(jù)集作為所述第二數(shù)據(jù)集。[0013]可選地,上述的方法中,所述將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,包括:[0014]獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量;[0015]根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N;[0016]將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。[0017]可選地,上述的方法中,將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作,包括:[0018]分別對所述N個子數(shù)據(jù)集進行序列化,得到N個哈希表HashTable文件;[0019]將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊,其中,M大于或等于2;[0020]啟動M*N個映射map任務(wù),對所述N個HashTabIe文件和所述M個數(shù)據(jù)塊執(zhí)行關(guān)聯(lián)join操作。[0021]可選地,上述的方法中,所述啟動M*N個map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行join操作,具體為:?0022]啟動Μ*Ν個map任務(wù),每個map任務(wù)讀取一個所述子數(shù)據(jù)集到內(nèi)存中,并獲取一個所述數(shù)據(jù)塊和內(nèi)存中的所述子數(shù)據(jù)集進行join操作。[0023]可選地,上述的方法中,所述分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTabIe文件,具體為:[0024]使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。[0025]可選地,上述的方法,還包括:[0026]按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTable文件分別命名;[0027]將已命名的所述N個HashTable文件存儲至預(yù)置的Hadoop分布式文件系統(tǒng)HDFS目錄下。[0028]可選地,上述的方法,還包括:[0029]將所述mapjoin操作產(chǎn)生的結(jié)果寫入HDFS的中間結(jié)果文件目錄中。[0030]本發(fā)明實施例提供一種數(shù)據(jù)傾斜處理裝置,包括:[0031]拆分模塊,用于當(dāng)進行mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值;[0032]執(zhí)行模塊,用于將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。[0033]可選地,上述的裝置,還包括:[0034]獲取模塊,用于獲取進行mapjoin操作的兩個數(shù)據(jù)集的數(shù)據(jù)量;[0035]比較模塊,用于比較所述兩個數(shù)據(jù)集的數(shù)據(jù)量,并根據(jù)比較結(jié)果將所述數(shù)據(jù)量小的數(shù)據(jù)集作為所述第一數(shù)據(jù)集,所述數(shù)據(jù)量大的數(shù)據(jù)集作為所述第二數(shù)據(jù)集。[0036]可選地,上述的裝置中,所述拆分模塊,包括:[0037]獲取單元,用于獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量;[0038]計算單元,用于根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N;[0039]拆分單元,用于將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。[0040]可選地,上述的裝置中,所述執(zhí)行模塊,包括:[0041]處理單元,用于分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTable文件;[0042]切分單元,用于將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊,其中,M大于或等于2;[0043]執(zhí)行單元,用于啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行join操作。[0044]可選地,上述的裝置中,所述執(zhí)行單元,具體用于啟動M*N個map任務(wù),每個map任務(wù)讀取一個所述子數(shù)據(jù)集到內(nèi)存中,并獲取一個所述數(shù)據(jù)塊和內(nèi)存中的所述子數(shù)據(jù)集進行join操作。[0(Μ5]可選的,上述的裝置中,所述處理單元,具體用于使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTabIe文件。[0046]可選地,上述裝置中,所述執(zhí)行模塊,還包括:[0047]命名單元,用于按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTable文件分別命名;[0048]存儲單元,用于將已命名的所述N個HashTable文件存儲至預(yù)置的HDFS目錄下。[0049]可選地,上述裝置,還包括:[0050]寫入模塊,用于將所述mapjoin操作產(chǎn)生的結(jié)果寫入HDFS的中間結(jié)果文件目錄中。[0051]本發(fā)明實施例通過將數(shù)據(jù)量大于mapjoin操作預(yù)置閾值的表拆分為多個滿足mapjoin所允許閾值的分表,然后生成并啟動多個map任務(wù)來執(zhí)行join操作,以實現(xiàn)進行mapjoin操作的兩個數(shù)據(jù)集也能在map端關(guān)聯(lián),能有效避免mapreduce的shuffle(置亂)過程以及在單一reduce中處理同一個key(關(guān)鍵字)的大量數(shù)據(jù),可在一定程度上解決大部分的數(shù)據(jù)傾斜問題;換句話說,本發(fā)明實施例提供的技術(shù)方案是以資源來換取效率,大大提高會發(fā)生數(shù)據(jù)傾斜的hive任務(wù)的效率?!靖綀D說明】[0052]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0053]圖1為本發(fā)明實施例一提供的一種數(shù)據(jù)傾斜處理方法的流程示意圖;[0054]圖2為本發(fā)明實施例二提供的一種數(shù)據(jù)傾斜處理方法的流程示意圖[0055]圖3為本發(fā)明實施例三提供的一種數(shù)據(jù)傾斜處理裝置的結(jié)構(gòu)示意圖。【具體實施方式】[0056]為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。[0057]采用本發(fā)明實施例提供的技術(shù)方案,可將hive的參與mapjoin操作的表的數(shù)據(jù)量限制從原先的25MB?200MB的級別提高到了IGB?100GB級別。本發(fā)明實施例提供的技術(shù)方案可以理解為是一種對現(xiàn)有hive的mapjoin方案的加強,能解決大部分的數(shù)據(jù)傾斜問題。[0058]圖1為本發(fā)明實施例一提供的一種數(shù)據(jù)傾斜處理方法的流程示意圖。如圖1所示,所述方法包括:[0059]步驟101、當(dāng)進行mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集。[0060]其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值。其中拆分的步驟可采用如下方法實現(xiàn):[0061]首先,獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量。[0062]然后,根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N。[0063]在具體實施例時,可采用如下公式計算拆分?jǐn)?shù)量N:[0064]N=數(shù)據(jù)量/預(yù)置閾值[0065]最后,將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。[0066]這里需要說明的是:本領(lǐng)域技術(shù)人員知道,進行mapjoin操作的兩個數(shù)據(jù)集通常為一個大表(即數(shù)據(jù)量大的表)和一個小表(即數(shù)據(jù)量小的表),將小表全部讀入本地內(nèi)存中,在map階段直接拿大表的數(shù)據(jù)與內(nèi)存中的表數(shù)據(jù)做匹配。因此,當(dāng)本發(fā)明實施例中所述第一數(shù)據(jù)量和第二數(shù)據(jù)量為兩個數(shù)據(jù)量不同的數(shù)據(jù)集,特別是數(shù)據(jù)量差別比較大時,本發(fā)明實施例提供的技術(shù)方案也可將其中一個數(shù)據(jù)量小的表進行拆分,可減少拆分后的子數(shù)據(jù)集的個數(shù)。即本發(fā)明實施例提供的所述方法,還包括:[0067]步驟S1、獲取進行mapjoin操作的兩個數(shù)據(jù)集的數(shù)據(jù)量。[0068]步驟S2、比較所述兩個數(shù)據(jù)集的數(shù)據(jù)量,并根據(jù)比較結(jié)果將所述數(shù)據(jù)量小的數(shù)據(jù)集作為所述第一數(shù)據(jù)集,所述數(shù)據(jù)量大的數(shù)據(jù)集作為所述第二數(shù)據(jù)集。[0069]步驟102、將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。[0070]在具體實施時,本步驟的實現(xiàn)過程如下:[0071]步驟1021、分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTable文件。[0072]在具體實施時,可使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。使用kryo作為java的序列化庫,能夠有效的減少壓縮文件的大小。[0073]步驟1022、將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊。[0074]其中,M大于或等于2。在實際應(yīng)用中,Mapjoin的計算步驟分兩步,將小表的數(shù)據(jù)變成hashtable廣播到所有的map端,將大表的數(shù)據(jù)進行合理的切分,然后在map階段的時候用大表的數(shù)據(jù)一行一行的去探測(probe)小表的hashtable,如果joinkey相等,就寫入HDFS(HadoopDistributedFileSystem,Hadoop分布式文件系統(tǒng))。大表的切分是hadoop層面的,大表的數(shù)據(jù)存儲在hdfs上的。其中,hdfs上的文件時分塊存儲的,每個塊的大小是有配置參數(shù)決定的(目前集群是512MB)。由此可知,本發(fā)明實施例提供的上述步驟中,M=第二數(shù)據(jù)集的數(shù)據(jù)量/配置參數(shù)。若第二數(shù)據(jù)集的數(shù)據(jù)量小于或等于配置參數(shù),則M就等于I;若第二數(shù)據(jù)集的數(shù)據(jù)量大于配置參數(shù),則M就大于或等于2。[0075]步驟1023、啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行關(guān)聯(lián)join操作。[0076]啟動M*N個map任務(wù),每個map任務(wù)讀取一個所述子數(shù)據(jù)集到內(nèi)存中,并獲取一個所述數(shù)據(jù)塊和內(nèi)存中的所述子數(shù)據(jù)集進行join操作。假設(shè),第一數(shù)據(jù)集被拆分為2個,分別為子數(shù)據(jù)集I和子數(shù)據(jù)集2;第二數(shù)據(jù)集被切分為3個數(shù)據(jù)塊,分別為數(shù)據(jù)塊1、數(shù)據(jù)塊2和數(shù)據(jù)塊3;那么就需要啟動6個map任務(wù),這6個map任務(wù)并行執(zhí)行。這里為了方便說明,我們分別表示為map任務(wù)1、map任務(wù)2、map任務(wù)3、map任務(wù)4、map任務(wù)5和map任務(wù)6。其中,[0077]map任務(wù)I,讀取子數(shù)據(jù)集I到內(nèi)存中,并獲取數(shù)據(jù)塊I和子數(shù)據(jù)集I進行join操作;[0078]map任務(wù)2,讀取子數(shù)據(jù)集I到內(nèi)存中,并獲取數(shù)據(jù)塊2和子數(shù)據(jù)集I進行join操作;[0079]map任務(wù)3,讀取子數(shù)據(jù)集I到內(nèi)存中,并獲取數(shù)據(jù)塊3和子數(shù)據(jù)集I進行join操作;[0080]map任務(wù)4,讀取子數(shù)據(jù)集2到內(nèi)存中,并獲取數(shù)據(jù)塊I和子數(shù)據(jù)集2進行join操作;[0081]map任務(wù)5,讀取子數(shù)據(jù)集2到內(nèi)存中,并獲取數(shù)據(jù)塊2和子數(shù)據(jù)集2進行join操作;[0082]map任務(wù)6,讀取子數(shù)據(jù)集2到內(nèi)存中,并獲取數(shù)據(jù)塊3和子數(shù)據(jù)集2進行join操作。[0083]這里需要說明的是:啟動M*N個map任務(wù),是根據(jù)hive生成的執(zhí)行計劃來啟動的。具體的,該執(zhí)行計劃的生成過程為:首先,需要對現(xiàn)有的hive的源碼進行修改,并利用hive指定的mapjoin的hint(提示),進行語法分析,生成執(zhí)行計劃。然后,重寫執(zhí)行計劃,生成新的計劃樹。例如,假設(shè)子數(shù)據(jù)集的個數(shù)N為3,則重寫為3個各自的mapjoin任務(wù),同時還要給下游計劃添加依賴,且上游任務(wù)執(zhí)行完畢后添加觸發(fā)這3個mapjoin任務(wù)的觸發(fā)指令。給下游計劃添加依賴的目的是,在執(zhí)行完成mapjoin操作后即觸發(fā)下游的操作,直至任務(wù)全部執(zhí)行完畢。其中,下游計劃可為現(xiàn)有技術(shù)中執(zhí)行完mapjoin操作后的一些操作,其不是本發(fā)明實施例的重點,因此,本文不進行詳細(xì)說明。[0084]利用hadoop的DistributedCache,將所有子數(shù)據(jù)集分發(fā)到各個mapjoin任務(wù)的節(jié)點,例如,假設(shè)子數(shù)據(jù)集的個數(shù)N為3,則利用hadoop的DistributedCache將這3個子數(shù)據(jù)集分別分發(fā)到3個mapjoin任務(wù)的節(jié)點。在mapreduce框架下,根據(jù)前述生成的執(zhí)行計劃,同時啟動M*N個map。每個map任務(wù)將讀取一個子數(shù)據(jù)集到內(nèi)存中,在map階段的時候用第二數(shù)據(jù)集的數(shù)據(jù)一行一行的去探測(probe)小表的hashtable。如果joinkey相等,就寫入HDFS。其中,M*N個map任務(wù)是并行進行的。[0085]進一步的,本發(fā)明實施例提供的所述方法,還可包括:[0086]步驟103、按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTabIe文件分別命名。[0087]其中,命名規(guī)則可人為約定,例如,打161、打162,……filen,本發(fā)明實施例對此不作具體限定。[0088]步驟104、將已命名的所述N個HashTable文件存儲至預(yù)置的HDFS目錄下。[0089]例如,可將已命名的所述N個HashTable文件存儲在一個具有唯一標(biāo)識的HDFS目錄dir下。[0090]進一步的,本發(fā)明實施例提供的所述方法,還可包括:[0091]步驟105、將所述mapjoin操作產(chǎn)生的結(jié)果寫入HDFS的中間結(jié)果文件目錄中。[0092]本發(fā)明實施例通過將數(shù)據(jù)量大于mapjoin操作預(yù)置閾值的表拆分為多個滿足mapjoin所允許閾值的分表,然后生成并啟動多個map任務(wù)來執(zhí)行join操作,以實現(xiàn)進行mapjoin操作的兩個數(shù)據(jù)集也能在map端關(guān)聯(lián),能有效避免mapreduce的shuffle(置亂)過程以及在單一reduce中處理同一個key(關(guān)鍵字)的大量數(shù)據(jù),可在一定程度上解決大部分的數(shù)據(jù)傾斜問題;換句話說,本發(fā)明實施例提供的技術(shù)方案是以資源來換取效率,大大提高會發(fā)生數(shù)據(jù)傾斜的hive任務(wù)的效率。[0093]如圖2所示,本發(fā)明實施例二提供的一種數(shù)據(jù)傾斜處理方法的流程示意圖。如圖2所示,所述方法包括:[0094]步驟201、獲取進行mapjoin操作的兩個數(shù)據(jù)集的數(shù)據(jù)量。[0095]步驟202、比較所述兩個數(shù)據(jù)集的數(shù)據(jù)量,并根據(jù)比較結(jié)果將所述數(shù)據(jù)量小的數(shù)據(jù)集作為所述第一數(shù)據(jù)集,所述數(shù)據(jù)量大的數(shù)據(jù)集作為所述第二數(shù)據(jù)集。[0096]步驟203、根據(jù)所述第一數(shù)據(jù)集的數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N。[0097]步驟204、將第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。[0098]步驟205、對N個子數(shù)據(jù)集進行序列化,得到N個HashTable文件。[0099]在具體實施時,可使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。使用kryo作為java的序列化庫,能夠有效的減少壓縮文件的大小。[0100]步驟206、將N個HashTable文件存儲到一個預(yù)置HDFS目錄下。[0?0?]步驟207、根據(jù)HDFS目錄下的文件,生成N個mapjoin任務(wù)。[0102]步驟208、將N個HashTable文件分別分發(fā)到對應(yīng)的mapjoin任務(wù)。[0?03]在具體實施例時,可利用hadoop的DiStributedCache,將所有子數(shù)據(jù)集分發(fā)到各個mapjoin任務(wù)的節(jié)點,例如,假設(shè)子數(shù)據(jù)集的個數(shù)N為3,則利用hadoop的Distributecache將這3個子數(shù)據(jù)集分別分發(fā)到3個mapjoin任務(wù)的節(jié)點。[0104]步驟209、將第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊。[0105]其中,M大于或等于2。在實際應(yīng)用中,Mapjoin的計算步驟分兩步,將小表的數(shù)據(jù)變成hashtable廣播到所有的map端,將大表的數(shù)據(jù)進行合理的切分,然后在map階段的時候用大表的數(shù)據(jù)一行一行的去探測(probe)小表的hashtable,如果joinkey相等,就寫入HDFS(HadoopDistributedFileSystem,Hadoop分布式文件系統(tǒng))。大表的切分是hadoop層面的,大表的數(shù)據(jù)存儲在hdfs上的。其中,hdfs上的文件時分塊存儲的,每個塊的大小是有配置參數(shù)決定的(目前集群是512MB)。由此可知,本發(fā)明實施例提供的上述步驟中,M=第二數(shù)據(jù)集的數(shù)據(jù)量/配置參數(shù)。若第二數(shù)據(jù)集的數(shù)據(jù)量小于或等于配置參數(shù),則M就等于I;若第二數(shù)據(jù)集的數(shù)據(jù)量大于配置參數(shù),則M就大于或等于2。[0106]步驟210、啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行關(guān)聯(lián)join操作。[0107]其中,這里需要說明的是:啟動M*N個map任務(wù),是根據(jù)hive生成的執(zhí)行計劃來啟動的。具體的,該執(zhí)行計劃的生成過程為:首先,需要對現(xiàn)有的hive的源碼進行修改,并利用hive指定的mapjoin的hint(提示),進行語法分析,生成執(zhí)行計劃。然后,重寫執(zhí)行計劃,生成新的計劃樹。例如,假設(shè)子數(shù)據(jù)集的個數(shù)N為3,則重寫為3個各自的mapjoin任務(wù),同時還要給下游計劃添加依賴,且上游任務(wù)執(zhí)行完畢后添加觸發(fā)這3個mapjoin任務(wù)的觸發(fā)指令。[0108]步驟211、將所述mapjoin操作產(chǎn)生的結(jié)果寫入HDFS的中間結(jié)果文件目錄中。[0109]這里需要說明的是:執(zhí)行完步驟211后即可觸發(fā)后續(xù)的操作,后續(xù)的操作即同現(xiàn)有技術(shù),此處不再贅述。[0110]本發(fā)明實施例通過將數(shù)據(jù)量大于mapjoin操作預(yù)置閾值的表拆分為多個滿足mapjoin所允許閾值的分表,然后生成并啟動多個map任務(wù)來執(zhí)行join操作,以實現(xiàn)進行mapjoin操作的兩個數(shù)據(jù)集也能在map端關(guān)聯(lián),能有效避免mapreduce的shuffle(置亂)過程以及在單一reduce中處理同一個key(關(guān)鍵字)的大量數(shù)據(jù),可在一定程度上解決大部分的數(shù)據(jù)傾斜問題;換句話說,本發(fā)明實施例提供的技術(shù)方案是以資源來換取效率,大大提高會發(fā)生數(shù)據(jù)傾斜的hive任務(wù)的效率。[0111]需要說明的是:對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。[0112]圖3為本發(fā)明實施例三提供的一種數(shù)據(jù)傾斜處理裝置的結(jié)構(gòu)示意圖。如圖3所示,本實施例提供的數(shù)據(jù)傾斜處理裝置包括:拆分模塊10和執(zhí)行模塊20。其中,[0113]拆分模塊10,用于當(dāng)進行mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值。[0114]執(zhí)行模塊20,用于將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。[0115]進一步的,本發(fā)明實施例提供的數(shù)據(jù)傾斜處理裝置還可包括:獲取模塊和比較模塊,其中,[0116]獲取模塊,用于獲取進行mapjoin操作的兩個數(shù)據(jù)集的數(shù)據(jù)量。[0117]比較模塊,用于比較所述兩個數(shù)據(jù)集的數(shù)據(jù)量,并根據(jù)比較結(jié)果將所述數(shù)據(jù)量小的數(shù)據(jù)集作為所述第一數(shù)據(jù)集,所述數(shù)據(jù)量大的數(shù)據(jù)集作為所述第二數(shù)據(jù)集。[0118]進一步的,上述的拆分模塊可包括:獲取單元、計算單元和拆分單元。其中,[0119]獲取單元,用于獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量。[0120]計算單元,用于根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N。[0121]拆分單元,用于將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。[0122]進一步的,上述的執(zhí)行模塊可包括:處理單元、切分單元和執(zhí)行單元。其中,[0123]處理單元,用于分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTable文件;[0124]切分單元,用于將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊,其中,M大于或等于2;[0125]執(zhí)行單元,用于啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行join操作。[Ο126]進一步的,上述的執(zhí)行單元具體用于啟動Μ*Ν個map任務(wù),每個map任務(wù)讀取一個所述子數(shù)據(jù)集到內(nèi)存中,并獲取一個所述數(shù)據(jù)塊和內(nèi)存中的所述子數(shù)據(jù)集進行join操作。[0127]進一步的,上述的處理單元,具體用于使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。[0128]進一步的,上述的執(zhí)行模塊,還可包括:命名單元和存儲單元。其中,[0129]命名單元,用于按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTable文件分別命名。[0130]存儲單元,用于將已命名的所述N個HashTable文件存儲至預(yù)置的HDFS目錄下。[0131]進一步的,本發(fā)明實施例提供的數(shù)據(jù)傾斜處理裝置,還可包括:寫入模塊。其中,寫入模塊,用于將所述mapjoin操作產(chǎn)生的結(jié)果寫入HDFS的中間結(jié)果文件目錄中。[0132]本發(fā)明實施例通過將數(shù)據(jù)量大于mapjoin操作預(yù)置閾值的表拆分為多個滿足mapjoin所允許閾值的分表,然后生成并啟動多個map任務(wù)來執(zhí)行join操作,以實現(xiàn)進行mapjoin操作的兩個數(shù)據(jù)集也能在map端關(guān)聯(lián),能有效避免mapreduce的shuffle(置亂)過程以及在單一reduce中處理同一個key(關(guān)鍵字)的大量數(shù)據(jù),可在一定程度上解決大部分的數(shù)據(jù)傾斜問題;換句話說,本發(fā)明實施例提供的技術(shù)方案是以資源來換取效率,大大提高會發(fā)生數(shù)據(jù)傾斜的hive任務(wù)的效率。[0133]本實施例提供的所述裝置可實現(xiàn)上述實施例一提供的所述方法,具體的實現(xiàn)原理可參見上述對應(yīng)的部分的內(nèi)容,此次不再贅述。[0134]以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性的勞動的情況下,即可以理解并實施。[0135]通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到各實施方式可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當(dāng)然也可以通過硬件?;谶@樣的理解,上述技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在計算機可讀存儲介質(zhì)中,如R0M/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行各個實施例或者實施例的某些部分所述的方法。[0136]最后應(yīng)說明的是:以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述實施例對本發(fā)明進行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精神和范圍?!局鳈?quán)項】1.一種數(shù)據(jù)傾斜處理方法,其特征在于,包括:當(dāng)進行映射關(guān)聯(lián)mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值;將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,包括:獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量;根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N;將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作,包括:分別對所述N個子數(shù)據(jù)集進行序列化,得到N個哈希表HashTable文件;將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊,其中,M大于或等于2;啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行關(guān)聯(lián)join操作。4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTabIe文件,具體為:使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。5.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作,還包括:按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTable文件分別命名;將已命名的所述N個HashTable文件存儲至預(yù)置的Hadoop分布式文件系統(tǒng)HDFS目錄下。6.一種數(shù)據(jù)傾斜處理裝置,其特征在于,包括:拆分模塊,用于當(dāng)進行mapjoin操作的第一數(shù)據(jù)集和第二數(shù)據(jù)集的數(shù)據(jù)量均大于預(yù)置閾值時,將所述第一數(shù)據(jù)集拆分為N個子數(shù)據(jù)集,其中,N大于或等于2,所述子數(shù)據(jù)集的數(shù)據(jù)量小于或等于所述預(yù)置閾值;執(zhí)行模塊,用于將所述第二數(shù)據(jù)集分別與所述N個子數(shù)據(jù)集進行mapjoin操作。7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述拆分模塊,包括:獲取單元,用于獲取所述第一數(shù)據(jù)集的數(shù)據(jù)量;計算單元,用于根據(jù)所述數(shù)據(jù)量和所述預(yù)置閾值,計算出拆分?jǐn)?shù)量N;拆分單元,用于將所述第一數(shù)據(jù)集拆分出N個子數(shù)據(jù)集。8.根據(jù)權(quán)利要求6或7所述的裝置,其特征在于,所述執(zhí)行模塊,包括:處理單元,用于分別對所述N個子數(shù)據(jù)集進行序列化,得到N個HashTable文件;切分單元,用于將所述第二數(shù)據(jù)集切分為M個數(shù)據(jù)塊,其中,M大于或等于2;執(zhí)行單元,用于啟動M*N個映射map任務(wù),對所述N個HashTable文件和所述M個數(shù)據(jù)塊執(zhí)行join操作。9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述處理單元,具體用于使用java的kryo序列化庫,分別對所述N個子數(shù)據(jù)集進行序列化,得到N個所述HashTable文件。10.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述執(zhí)行模塊,還包括:命名單元,用于按照預(yù)設(shè)的命名規(guī)則,為所述N個HashTable文件分別命名;存儲單元,用于將已命名的所述N個HashTable文件存儲至預(yù)置的HDFS目錄下。【文檔編號】G06F17/30GK105930479SQ201610279684【公開日】2016年9月7日【申請日】2016年4月28日【發(fā)明人】劉光華【申請人】樂視控股(北京)有限公司,樂視網(wǎng)信息技術(shù)(北京)股份有限公司