一種分布式數(shù)據(jù)向量化處理方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)領(lǐng)域,尤其涉及一種分布式數(shù)據(jù)向量化處理方法和裝置。
【背景技術(shù)】
[0002]Apache Hadoop是一款支持?jǐn)?shù)據(jù)密集型分布式應(yīng)用并以Apache 2.0許可協(xié)議發(fā)布的開源軟件框架,其支持在商品硬件構(gòu)建的大型集群上運(yùn)行的應(yīng)用程序。Hadoop實(shí)現(xiàn)了名為MapReduce的編程范式:應(yīng)用程序被分割成若干小部分,而每個部分都能在集群中的任意節(jié)點(diǎn)上執(zhí)行或重新執(zhí)行。此外,Hadoop還提供了分布式文件系統(tǒng),用以存儲所有計算節(jié)點(diǎn)的數(shù)據(jù),這為整個集群帶來了非常高的帶寬。Hadoop使得應(yīng)用程序與成千上萬的獨(dú)立計算的電腦能夠進(jìn)行PB級的數(shù)據(jù)通信。
[0003]MapReduce是Hadoop的一種計算框架,它允許軟件將應(yīng)用程序分成Map與Reduce兩個階段,Map階段實(shí)現(xiàn)的函數(shù)用來把一組鍵值對映射成一組新的鍵值對,而Reduce階段指定并發(fā)的Reduce (歸納)函數(shù),對一個Map階段輸出的結(jié)果列表中的元素進(jìn)行適當(dāng)?shù)暮喜ⅰ?br>[0004]Spark是和MapReduce框架類似的一種分布式計算框架,其采用輕量級的調(diào)度框架,并且使用內(nèi)存來緩存中間結(jié)果,因此相對于MapReduce性能有一定的提升,但是其執(zhí)行速度還是比較慢。
[0005]MapReduce的出現(xiàn)使得即使不懂并行計算的編程人員也可以在分布式系統(tǒng)上開發(fā)軟件,但其執(zhí)行效率卻很低。MapReduce需要將一個計算任務(wù)分成多個Map任務(wù)和Reduce任務(wù),多個任務(wù)之間的中間結(jié)果要寫入磁盤,因此延時非常高。另外MapReduce是為運(yùn)行長達(dá)數(shù)小時的批量作業(yè)而設(shè)計,而組成作業(yè)的每個任務(wù)的運(yùn)行時間都是分鐘級別,因此任務(wù)調(diào)度系統(tǒng)的設(shè)計是非常粗粒度的,任務(wù)的啟動延時也很高,一般都在10秒左右。MapReduce的執(zhí)行引擎是傳統(tǒng)的逐行執(zhí)行模式,每條記錄都需要經(jīng)過序列化、反序列化、數(shù)據(jù)編解碼的過程,每個過程的開銷都很大,因此處理延時非常高。
[0006]為了解決MapReduce任務(wù)啟動延時高的問題,Spark計算框架提出了一種輕量級的調(diào)度框架,將任務(wù)啟動延時降低到I秒左右。但其仍然采用逐行執(zhí)行模式,每條記錄都需要經(jīng)過序列化、反序列化、數(shù)據(jù)編解碼的過程,并且會占用大量的內(nèi)存空間從而導(dǎo)致系統(tǒng)不穩(wěn)定。大量的實(shí)驗(yàn)數(shù)據(jù)證明,一條記錄的序列化、反序列化和編解碼過程耗費(fèi)的時間往往是實(shí)際參與計算的時間的數(shù)倍,因此Spark系統(tǒng)的執(zhí)行效率仍然不高且系統(tǒng)穩(wěn)定性很差,無法滿足企業(yè)軟件對性能和穩(wěn)定性的要求。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的一個目的是提供一種分布式數(shù)據(jù)向量化處理方法和裝置,以解決逐行執(zhí)行模式帶來的執(zhí)行效率低,耗費(fèi)時間久的問題。
[0008]根據(jù)本發(fā)明的一個方面,提供了一種分布式數(shù)據(jù)向量化處理方法,包括:
[0009]建立多行數(shù)據(jù)緩存以存儲多行基于行的字節(jié)數(shù)組;
[0010]將基于行的字節(jié)數(shù)組轉(zhuǎn)換為基于列的字節(jié)數(shù)組;
[0011]對代碼指令進(jìn)行向量化處理;
[0012]以所述向量化處理后的代碼指令對所述基于列的字節(jié)數(shù)組進(jìn)行向量化計算。
[0013]根據(jù)本發(fā)明的另一方面,還提供了一種分布式數(shù)據(jù)向量化處理裝置,包括:
[0014]緩存模塊,用于建立多行數(shù)據(jù)緩存以存儲多行基于行的字節(jié)數(shù)組;
[0015]轉(zhuǎn)換模塊,用于將基于行的字節(jié)數(shù)組轉(zhuǎn)換為基于列的字節(jié)數(shù)組;
[0016]向量化處理模塊,用于對代碼指令進(jìn)行向量化處理;
[0017]向量化計算模塊,用于以所述向量化處理后的代碼指令對所述基于列的字節(jié)數(shù)組進(jìn)行向量化計算。
[0018]現(xiàn)有的數(shù)據(jù)庫計算引擎每次從系統(tǒng)中讀出一行數(shù)據(jù)后完成整個執(zhí)行計劃的計算過程,然后再執(zhí)行下一行數(shù)據(jù)直到計算全部完成。與現(xiàn)有技術(shù)相比,本發(fā)明的一個實(shí)施例通過向量化模型每次從數(shù)據(jù)庫中讀出一定數(shù)量的行數(shù),并通過綁定到CPU cache的方式讓這些數(shù)據(jù)駐留CPU cache (高速緩存),再去執(zhí)行編譯好的執(zhí)行計劃。這種方式避免了多次讀出的系統(tǒng)開銷,并能有效的利用系統(tǒng)緩存,同時通過有效的利用CPU的高效向量化指令集,如SSE (Streaming SIMD Extens1ns,指令集),來加速計劃的執(zhí)行效率,提高系統(tǒng)的性能。此外,通過向量化代碼單元可以將原本低效的代碼二次編譯后生成向量化代碼,大幅度提尚系統(tǒng)的性能。
【附圖說明】
[0019]通過閱讀參照以下附圖所作的對非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會變得更明顯:
[0020]圖1示出本發(fā)明實(shí)施例一的分布式數(shù)據(jù)向量化處理方法的流程示意圖;
[0021]圖2示出本發(fā)明實(shí)施例二的分布式數(shù)據(jù)向量化處理方法的流程示意圖;
[0022]圖3示出本發(fā)明實(shí)施例三的分布式數(shù)據(jù)向量化處理裝置的結(jié)構(gòu)示意圖;
[0023]圖4示出本發(fā)明實(shí)施例四的分布式數(shù)據(jù)向量化處理裝置的結(jié)構(gòu)示意圖。
[0024]附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。
【具體實(shí)施方式】
[0025]下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)描述。
[0026]圖1示出本發(fā)明實(shí)施例一的分布式數(shù)據(jù)向量化處理裝置的結(jié)構(gòu)示意圖,如圖1所示,本發(fā)明實(shí)施例一的分布式數(shù)據(jù)向量化處理裝置包括:緩存模塊101、轉(zhuǎn)換模塊102、向量化處理模塊103和向量化計算模塊104。
[0027]其中,緩存模塊101,用于建立多行數(shù)據(jù)緩存以存儲多行基于行的字節(jié)數(shù)組;轉(zhuǎn)換模塊102,用于將基于行的字節(jié)數(shù)組轉(zhuǎn)換為基于列的字節(jié)數(shù)組;向量化處理模塊103,用于對代碼指令進(jìn)行向量化處理;向量化計算模塊104,用于以所述向量化處理后的代碼指令對所述基于列的字節(jié)數(shù)組進(jìn)行向量化計算。
[0028]在此,緩存模塊101建立多行數(shù)據(jù)緩存以存儲多行基于行的字節(jié)數(shù)組,緩存可以采用CPU cache(高速緩存),從而節(jié)省了從磁盤讀取數(shù)據(jù)的時間。轉(zhuǎn)換模塊102將基于行的字節(jié)數(shù)組轉(zhuǎn)換為基于列的字節(jié)數(shù)組,改變了現(xiàn)有技術(shù)中對指令代碼逐行執(zhí)行的模式,將按行存放的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為按列存放,然后對按列存放的數(shù)據(jù)批量進(jìn)行讀出、序列化、反序列化以及編解碼操作,最后參與實(shí)際運(yùn)算,以批量執(zhí)行方式來減少函數(shù)調(diào)用開銷,可以有效的利用磁盤帶寬的利用率,并且能充分利用CPU cache的快速存儲讀取功能。向量化處理模塊103對代碼指令進(jìn)行向量化處理。向量化處理是指對原計算代碼自動進(jìn)行二次編譯,以生成可向量化執(zhí)行的代碼或指令。向量化處理后的代碼指令能夠應(yīng)用在向量上而不是單個數(shù)據(jù)上。例如對于聚合算法,現(xiàn)有的普通標(biāo)量代碼指令只能基于單個數(shù)據(jù)進(jìn)行各個數(shù)據(jù)的逐級累加聚合,每當(dāng)單個數(shù)據(jù)發(fā)生變化時,都需要進(jìn)行一次運(yùn)算。而采用向量化代碼指令可以一次應(yīng)用在批量數(shù)據(jù)上,而不是逐個數(shù)據(jù)進(jìn)行聚合,一次調(diào)用向量化代碼指令,就可以對相同數(shù)據(jù)結(jié)構(gòu)下的同類數(shù)據(jù)進(jìn)行整體運(yùn)算,從而減少了代碼調(diào)用次數(shù),也就相應(yīng)減少了代碼調(diào)用時間。最后采用向量化計算模塊104以所述向量化處理后的代碼指令對所述基于列的字節(jié)數(shù)組進(jìn)行向量化計算,現(xiàn)有的CPU提供了單指令多數(shù)據(jù)的指令集以進(jìn)行向量化計算,如x86的SSE指令集,最多可以在一條指令中對512bit的數(shù)據(jù)完成計算。相對于標(biāo)量代碼指令中的一條指令一次只能計算32bit的數(shù)據(jù),向量化指令的性能提升能夠高達(dá)8倍。本發(fā)明的技術(shù)方案,將函數(shù)操作的數(shù)據(jù)從單個數(shù)據(jù)變成數(shù)組,這樣可以極大的減少函數(shù)調(diào)用的開銷。另外由于一次操作批量數(shù)據(jù),CPU cache能夠被有效的利用起來,cache missrat1 (高速緩存命中率)會有效的降低。從高級語言生成x86匯編時,由于操作的數(shù)據(jù)都是批量的,通過有效的組織數(shù)據(jù)并通過代碼生成器生成向量化指令能夠進(jìn)一步加速計算。
[0029]圖2示出本發(fā)明實(shí)施例二的分布式數(shù)據(jù)向量化處理裝置的結(jié)構(gòu)示意圖,如圖2所示,本發(fā)明實(shí)施例二的分布式數(shù)據(jù)向量化處理裝置包括:緩存模塊101、轉(zhuǎn)換模塊102、向量化處理模塊103和向量化計算模塊104。
[0030]其中,緩存模塊101,用于建立多行數(shù)據(jù)緩存以存儲多行基于行的字節(jié)數(shù)組;轉(zhuǎn)換模塊102,用于將基于行的字節(jié)數(shù)組轉(zhuǎn)換為基于列的字節(jié)數(shù)組;向量化處理模塊103,用于對代碼指令進(jìn)行向量化處理;向量化計算模塊104,用于以所述向量化處理后的代碼指令對所述基于列的字節(jié)數(shù)組進(jìn)行向量化計算。
[0031]進(jìn)一步,基于行的字節(jié)數(shù)組中,各行數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)為按照對象進(jìn)行排列;
[0032]所述轉(zhuǎn)換模塊102還用于:將按照對象排列的各行基于行的字節(jié)數(shù)組,轉(zhuǎn)換為按照所述對象的屬性排列的所述基于列的字節(jié)數(shù)組。
[0033]在此,基于行的字節(jié)數(shù)組中,各行數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)為按照各個對象進(jìn)行分類排列;基于列的字節(jié)數(shù)組中,各行數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)為按照對象的各個屬性進(jìn)行分類排列,從而將同一數(shù)據(jù)結(jié)構(gòu)下的同類數(shù)據(jù)按類存儲,便于基于向量化指令進(jìn)行批量運(yùn)算。以結(jié)構(gòu)化查詢語言(SQL,Structured Query Language)為例進(jìn)行更加詳細(xì)的說明。在SQL分布式計算過程中,一般需進(jìn)行序列化和反序列化、列與表達(dá)式計算、自定義函數(shù)計算等。例