一種哈希連接的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001 ] 本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種哈希連接的方法及裝置。
【背景技術(shù)】
[0002]Spark是一個(gè)基于內(nèi)存計(jì)算的開(kāi)源的集群計(jì)算系統(tǒng),目的是讓數(shù)據(jù)分析更加快速。Spark非常小巧玲瓏,由加州伯克利大學(xué)AMP實(shí)驗(yàn)室的Matei為主的小團(tuán)隊(duì)所開(kāi)發(fā)。使用的語(yǔ)言是Scala,雖然Spark與Hadoop有相似之處,但它提供了具有有用差異的一個(gè)新的集群計(jì)算框架。首先,Spark是為集群計(jì)算中的特定類型的工作負(fù)載而設(shè)計(jì),即那些在并行操作之間重用工作數(shù)據(jù)集(比如機(jī)器學(xué)習(xí)算法)的工作負(fù)載。為了優(yōu)化這些類型的工作負(fù)載,Spark引進(jìn)了內(nèi)存集群計(jì)算的概念,可在內(nèi)存集群計(jì)算中將數(shù)據(jù)集緩存在內(nèi)存中,以縮短訪問(wèn)延遲。
[0003]在hadoop 發(fā)展過(guò)程中,為了 給熟悉 RDBMS (Relat1nal Database ManagementSystem,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))但又不理解MapReduce的技術(shù)人員提供快速上手的工具,hive應(yīng)運(yùn)而生,是當(dāng)時(shí)唯一運(yùn)行在hadoop上的SQL-on-Hadoop工具。但是,MapReduce計(jì)算過(guò)程中大量的中間磁盤(pán)落地過(guò)程消耗了大量的1/0,降低的運(yùn)行效率,為了提高SQL-on-Hadoop 的效率,大量的 SQL-on-Hadoop 工具開(kāi)始產(chǎn)生,MapR 的 Drill、Cloudera 的Impala、Shark都是在這一背景下產(chǎn)生的工具,其中Shark是伯克利實(shí)驗(yàn)室spark生態(tài)環(huán)境的組件之一,它修改了下圖所示的右下角的內(nèi)存管理、物理計(jì)劃、執(zhí)行三個(gè)模塊,并使之能運(yùn)行在spark引擎上,從而使得SQL查詢的速度得到10-100倍的提升。
[0004]隨著Spark的發(fā)展,Shark對(duì)于hive的太多依賴(如采用hive的語(yǔ)法解析器、查詢優(yōu)化器等等),制約了 spark各個(gè)組件的相互集成,所以提出了 sparkSQL項(xiàng)目。SparkSQL拋棄原有Shark的代碼,汲取了 Shark的一些優(yōu)點(diǎn),如內(nèi)存列存儲(chǔ)(In-Memory ColumnarStorage)、Hive兼容性等,重新開(kāi)發(fā)了 SparkSQL代碼,由于擺脫了對(duì)hive的依賴性,SparkSQL無(wú)論在數(shù)據(jù)兼容、性能優(yōu)化、組件擴(kuò)展方面都得到了極大的方便。
[0005]Hive中join操作主要有map join和reduce join組成,這兩種join操作均使用的是mapreduce的計(jì)算架構(gòu),sparksql上的join操作針對(duì)mapreduce架構(gòu)內(nèi)存利用不足的問(wèn)題提出了自己的計(jì)算模型?,F(xiàn)有的hash join(哈希連接)操作中,將整個(gè)需要實(shí)現(xiàn)join操作的數(shù)據(jù)表存儲(chǔ)到內(nèi)存中進(jìn)行hash join,無(wú)法利用現(xiàn)有空閑的內(nèi)存,只能利用較大的內(nèi)存進(jìn)行處理,join效率較低。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明提供了一種哈希連接的方法及裝置,能夠提高join效率。
[0007]—方面,本發(fā)明提供了一種哈希連接的方法,包括:
[0008]S1:獲取待操作的第一表中待操作的第一數(shù)據(jù)和待操作的第二表中待操作的第二數(shù)據(jù);
[0009]S2:計(jì)算每個(gè)第一數(shù)據(jù)的哈希值,根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),并計(jì)算每個(gè)第二數(shù)據(jù)的哈希值,根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào);
[0010]S3:將對(duì)應(yīng)相同分區(qū)號(hào)的數(shù)據(jù)讀入到內(nèi)存的同一個(gè)分區(qū)中;
[0011]S4:分別將同一個(gè)分區(qū)中的第一數(shù)據(jù)和第二數(shù)據(jù)進(jìn)行哈希連接hash join操作。
[0012]進(jìn)一步地,該方法還包括:
[0013]實(shí)時(shí)檢測(cè)所述內(nèi)存的剩余量是否小于等于預(yù)設(shè)值,如果是,則將所述內(nèi)存的任一分區(qū)中的未進(jìn)行hash join操作的第一數(shù)據(jù)和/或第二數(shù)據(jù)移出內(nèi)存,否則,將從內(nèi)存中移出的未進(jìn)行hash join操作的數(shù)據(jù)讀入到所述內(nèi)存中。
[0014]進(jìn)一步地,所述S2中,所述根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),包括:
[0015]根據(jù)公式一確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),其中,公式一為:
[0016]numl = a | mod length ;
[0017]其中,numl是第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),a為第一數(shù)據(jù)的哈希值,length為預(yù)設(shè)的內(nèi)存中分區(qū)的數(shù)量;
[0018]所述S2中,所述根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),包括:
[0019]根據(jù)公式二確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),其中,公式二為:
[0020]num2 = b | mod length ;
[0021]其中,nUm2是第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),b為第二數(shù)據(jù)的哈希值,length為預(yù)設(shè)的內(nèi)存中分區(qū)的數(shù)量。
[0022]進(jìn)一步地,在所述SI之前,還包括:
[0023]Dl:分別在存儲(chǔ)所述第一表的第一磁盤(pán)中和存儲(chǔ)所述第二表的第二磁盤(pán)中,劃分出哈希桶,為每個(gè)哈希桶分配哈希桶號(hào);
[0024]D2:計(jì)算每個(gè)第一數(shù)據(jù)的哈希值,根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),并計(jì)算每個(gè)第二數(shù)據(jù)的哈希值,根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào);
[0025]D3:根據(jù)每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),將每個(gè)第一數(shù)據(jù)存儲(chǔ)在所述第一磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中,并根據(jù)每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),將每個(gè)第二數(shù)據(jù)存儲(chǔ)在所述第二磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中;
[0026]所述SI,包括:
[0027]分別從第一磁盤(pán)和第二磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中獲取所述第一數(shù)據(jù)和所述第二數(shù)據(jù)。
[0028]進(jìn)一步地,所述S4,包括:
[0029]為每個(gè)分區(qū)分配hash join操作線程,通過(guò)每個(gè)分區(qū)對(duì)應(yīng)的所述hash join操作線程,將每個(gè)分區(qū)中的第一數(shù)據(jù)和第二數(shù)據(jù)進(jìn)行hash join操作。
[0030]另一方面,本發(fā)明提供了一種哈希連接的裝置,包括:
[0031]獲取單元,用于獲取待操作的第一表中待操作的第一數(shù)據(jù)和待操作的第二表中待操作的第二數(shù)據(jù);
[0032]分區(qū)號(hào)確定單元,用于計(jì)算每個(gè)第一數(shù)據(jù)的哈希值,根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),并計(jì)算每個(gè)第二數(shù)據(jù)的哈希值,根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào);
[0033]讀入單元,用于將對(duì)應(yīng)相同分區(qū)號(hào)的數(shù)據(jù)讀入到內(nèi)存的同一個(gè)分區(qū)中;
[0034]操作單元,用于分別將同一個(gè)分區(qū)中的第一數(shù)據(jù)和第二數(shù)據(jù)進(jìn)行哈希連接hashjoin操作。
[0035]進(jìn)一步地,該裝置還包括:
[0036]檢測(cè)單元,用于實(shí)時(shí)檢測(cè)所述內(nèi)存的剩余量是否小于等于預(yù)設(shè)值,如果是,則將所述內(nèi)存的任一分區(qū)中的未進(jìn)行hash join操作的第一數(shù)據(jù)和/或第二數(shù)據(jù)移出內(nèi)存,否則,將從內(nèi)存中移出的未進(jìn)行hash join操作的數(shù)據(jù)讀入到所述內(nèi)存中。
[0037]進(jìn)一步地,所述分區(qū)號(hào)確定單元,在執(zhí)行所述根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào)時(shí),具體執(zhí)行:根據(jù)公式一確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),其中,公式一為:
[0038]numl = a | mod length ;
[0039]其中,numl是第一數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),a為第一數(shù)據(jù)的哈希值,length為預(yù)設(shè)的內(nèi)存中分區(qū)的數(shù)量;
[0040]所述分區(qū)號(hào)確定單元,在執(zhí)行根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào)時(shí),具體執(zhí)行:
[0041]根據(jù)公式二確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),其中,公式二為:
[0042]num2 = b | mod length ;
[0043]其中,nUm2是第二數(shù)據(jù)對(duì)應(yīng)的分區(qū)號(hào),b為第二數(shù)據(jù)的哈希值,length為預(yù)設(shè)的內(nèi)存中分區(qū)的數(shù)量。
[0044]進(jìn)一步地,該裝置還包括:
[0045]分桶單元,用于分別在存儲(chǔ)所述第一表的第一磁盤(pán)中和存儲(chǔ)所述第二表的第二磁盤(pán)中,劃分出哈希桶,為每個(gè)哈希桶分配哈希桶號(hào);
[0046]桶號(hào)確定單元,用于計(jì)算每個(gè)第一數(shù)據(jù)的哈希值,根據(jù)每個(gè)第一數(shù)據(jù)的哈希值,確定每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),并計(jì)算每個(gè)第二數(shù)據(jù)的哈希值,根據(jù)每個(gè)第二數(shù)據(jù)的哈希值,確定每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào);
[0047]存儲(chǔ)單元,用于根據(jù)每個(gè)第一數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),將每個(gè)第一數(shù)據(jù)存儲(chǔ)在所述第一磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中,并根據(jù)每個(gè)第二數(shù)據(jù)對(duì)應(yīng)的哈希桶號(hào),將每個(gè)第二數(shù)據(jù)存儲(chǔ)在所述第二磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中;
[0048]所述獲取單元,用于分別從第一磁盤(pán)和第二磁盤(pán)中的具有相同哈希桶號(hào)的哈希桶中獲取所述第一數(shù)據(jù)和所述第二數(shù)據(jù)。
[0049]進(jìn)一步地,所述操作單元,用于為每個(gè)分區(qū)分配hash join操作線程,通過(guò)每個(gè)分區(qū)對(duì)應(yīng)的所述hash join操作線程,將每個(gè)分區(qū)中的第一數(shù)據(jù)和第二數(shù)據(jù)進(jìn)行hash join操作。