本發(fā)明涉及大數(shù)據(jù)質(zhì)量高效評估領(lǐng)域,具體涉及一種考慮任務(wù)相關(guān)性的Hive優(yōu)化方法及系統(tǒng)。
背景技術(shù):
隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)呈爆炸式增長,種類也越來越多。數(shù)據(jù)庫也隨之發(fā)展,經(jīng)歷了一個從各種模式百花齊放,然后關(guān)系型數(shù)據(jù)庫一支獨(dú)秀,再到后關(guān)系型數(shù)據(jù)庫出現(xiàn),新型非關(guān)系型數(shù)據(jù)再度興起的過程,為應(yīng)對海量數(shù)據(jù)低成本、可擴(kuò)展、高可靠存儲及快速處理的挑戰(zhàn),產(chǎn)業(yè)界、學(xué)術(shù)界也掀起大數(shù)據(jù)處理的浪潮,現(xiàn)在可以方便得搭建大規(guī)模集群來處理這些問題,典型代表是Hadoop生態(tài)系統(tǒng),Hadoop生態(tài)系統(tǒng)借鑒了Google實現(xiàn)。Hadoop實現(xiàn)了分布式文件系統(tǒng)HDFS,以及MapReduce編程模型,為大數(shù)據(jù)處理提供了存儲與計算平臺。進(jìn)而在其上演化出了挖掘工具Hive,提供類SQL的查詢功能,即HQL(HiveQL)的查詢。MapReduce編程模型需要用戶手動編寫map函數(shù)和reduce函數(shù),這個低層次的應(yīng)用程序接口提高了程序的靈活性,但是增加了排錯的難度,高層次的描述性語言例如Hive,簡化了MapReduce編程。
Hive數(shù)據(jù)倉庫適合處理大量的離線數(shù)據(jù),但仍存在速度過慢的缺點。
技術(shù)實現(xiàn)要素:
本發(fā)明提供一種考慮任務(wù)相關(guān)性的Hive優(yōu)化方法及系統(tǒng),其目的是考慮任務(wù)之間的相關(guān)性,最小化MapReduce Job數(shù)量。
本發(fā)明的目的是采用下述技術(shù)方案實現(xiàn)的:
一種考慮任務(wù)相關(guān)性的Hive優(yōu)化方法,其改進(jìn)之處在于,包括:
將HQL語句轉(zhuǎn)化為MapReduce物理計劃,并獲取所述MapReduce物理計劃中各MapReduce Job在shuffle階段用于排序的鍵shuffle key;
根據(jù)相關(guān)性規(guī)則,合并所述各MapReduce Job中相關(guān)MapReduce Job。
優(yōu)選的,所述相關(guān)性規(guī)則包括:
規(guī)則a.若n個MapReduce Job間不包含父子關(guān)系且shuffle key相同,則所述n個MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并,其中,n為正整數(shù)且n小于所述MapReduce物理計劃中MapReduce Job的總個數(shù);
規(guī)則b.若父MapReduce Job與其所有子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并;
規(guī)則c.若父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并。
進(jìn)一步的,所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述n個MapReduce Job讀磁盤時讀取所述n個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)并將所述n個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù)的n個shuffle key分別與n個標(biāo)記{tag1,tag2...tagi...tagn}進(jìn)行合并,獲取合并結(jié)果其中,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù),為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵的屬性值,為第i個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù),為第i個MapReduce Job對應(yīng)的shuffle key且列相同,第i個MapReduce Job對應(yīng)的shuffle key的屬性值,tagi與為唯一對應(yīng)關(guān)系,用于標(biāo)記shuffle key與MapReduce Job的對應(yīng)關(guān)系;
將所述合并結(jié)果放入shuffle過程,通過shuffle key對應(yīng)的標(biāo)記確定數(shù)據(jù)來源,將第i個標(biāo)記tagi對應(yīng)的發(fā)送至所述第i個MapReduce Job的reduce函數(shù)。
進(jìn)一步的,所述對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job的所有子MapReduce Job互為所述規(guī)則a定義的相關(guān)MapReduce Job,則將所述父MapReduce Job的所有子MapReduce Job按所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并的合并方式進(jìn)行合并;
將所述父MapReduce Job的所有子MapReduce Job對應(yīng)的reduce函數(shù)處理結(jié)果直接發(fā)送至所述父MapReduce Job的map函數(shù),且所述父MapReduce Job的map函數(shù)直接將所述父MapReduce Job的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job的reduce函數(shù)。
進(jìn)一步的,所述對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job讀磁盤時讀取與其不相關(guān)的子MapReduce Job的存盤結(jié)果和與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù);
將所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)并獲取所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù),將所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù)的輸出結(jié)果直接發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù),并直接將所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù);
將所述與其不相關(guān)的子MapReduce Job的存盤結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù)并獲取所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù)。
一種考慮任務(wù)相關(guān)性的Hive優(yōu)化系統(tǒng),其改進(jìn)之處在于,所述系統(tǒng)包括:相互連接的HQL解釋器和查詢優(yōu)化器,其中,所述HQL解釋器,用于將HQL語句轉(zhuǎn)化為MapReduce物理計劃,并獲取所述MapReduce物理計劃中各MapReduce Job在shuffle階段用于排序的鍵shuffle key,所述查詢優(yōu)化器,用于接收所述MapReduce物理計劃并根據(jù)相關(guān)性規(guī)則,合并所述MapReduce物理計劃中各MapReduce Job中相關(guān)MapReduce Job。
優(yōu)選的,所述相關(guān)性規(guī)則包括:
規(guī)則a.若n個MapReduce Job間不包含父子關(guān)系且shuffle key相同,則所述n個MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并,其中,n為正整數(shù)且n小于所述MapReduce物理計劃中MapReduce Job的總個數(shù);
規(guī)則b.若父MapReduce Job與其所有子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并;
規(guī)則c.若父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并。
進(jìn)一步的,所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述n個MapReduce Job讀磁盤時讀取所述n個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)并將所述n個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù)的n個shuffle key分別與n個標(biāo)記{tag1,tag2...tagi...tagn}進(jìn)行合并,獲取合并結(jié)果其中,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù),為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵的屬性值,為第i個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù),為第i個MapReduce Job對應(yīng)的shuffle key且列相同,第i個MapReduce Job對應(yīng)的shuffle key的屬性值,tagi與為唯一對應(yīng)關(guān)系,用于標(biāo)記shuffle key與MapReduce Job的對應(yīng)關(guān)系;
將所述合并結(jié)果放入shuffle過程,通過shuffle key對應(yīng)的標(biāo)記確定數(shù)據(jù)來源,將第i個標(biāo)記tagi對應(yīng)的發(fā)送至所述第i個MapReduce Job的reduce函數(shù)。
進(jìn)一步的,所述對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job的所有子MapReduce Job互為所述規(guī)則a定義的相關(guān)MapReduce Job,則將所述父MapReduce Job的所有子MapReduce Job按所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并的合并方式進(jìn)行合并;
將所述父MapReduce Job的所有子MapReduce Job對應(yīng)的reduce函數(shù)處理結(jié)果直接發(fā)送至所述父MapReduce Job的map函數(shù),且所述父MapReduce Job的map函數(shù)直接將所述父MapReduce Job的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job的reduce函數(shù)。
進(jìn)一步的,所述對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job讀磁盤時讀取與其不相關(guān)的子MapReduce Job的存盤結(jié)果和與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù);
將所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)并獲取所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù),將所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù)的輸出結(jié)果直接發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù),并直接將所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù);
將所述與其不相關(guān)的子MapReduce Job的存盤結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù)并獲取所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù)。與最接近的現(xiàn)有技術(shù)比,本發(fā)明具有的優(yōu)異效果如下:
本發(fā)明提供的技術(shù)方案,定義了MapReduce Job的相關(guān)性規(guī)則,根據(jù)MapReduce Job的相關(guān)性規(guī)則,在Hive執(zhí)行過程中,能夠?qū)ο嚓P(guān)MapReduce Job進(jìn)行合并,減少M(fèi)apReduce Job數(shù)目,避免了Hive執(zhí)行過程中過多的重復(fù)操作,提高了Hive的運(yùn)行效率,極大的方便了大數(shù)據(jù)質(zhì)量評估。
附圖說明
圖1是本發(fā)明一種考慮任務(wù)相關(guān)性的Hive優(yōu)化方法的流程圖;
圖2是本發(fā)明實施例提供的3個MapReduce Job的應(yīng)用示意圖;
圖3是本發(fā)明實施例提供的3個MapReduce Job合并的應(yīng)用示意圖;
圖4是本發(fā)明實施例提供的將TPCH的Q17翻譯為4個MapReduce Job的應(yīng)用示意圖;
圖5是本發(fā)明實施例提供的4個MapReduce Job合并的應(yīng)用示意圖;
圖6是本發(fā)明一種考慮任務(wù)相關(guān)性的Hive優(yōu)化系統(tǒng)的結(jié)構(gòu)示意圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明的具體實施方式作詳細(xì)說明。
為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明提供的一種考慮任務(wù)相關(guān)性的Hive優(yōu)化方法,如圖1所示,包括:
101.將HQL語句轉(zhuǎn)化為MapReduce物理計劃,并獲取所述MapReduce物理計劃中各MapReduce Job在shuffle階段用于排序的鍵shuffle key;
其中,在運(yùn)行一個MapReduce Job計算任務(wù)時候,任務(wù)過程被分為map階段和reduce階段,該任務(wù)過程中還包括一個階段比較少提,就是shuffle階段,shuffle階段用于在MapReduce計算框架中銜接map階段和reduce階段,因為是MapReduce計算框架自動實現(xiàn),所以一般不提及,但是仍然存在,map階段和reduce階段都是用鍵值對(key/value)作為輸入(input)和輸出(output)。需通過人工定義兩個階段的函數(shù),即map函數(shù)和reduce函數(shù)。
102.根據(jù)相關(guān)性規(guī)則,合并所述各MapReduce Job中相關(guān)MapReduce Job。
其中,所述相關(guān)性規(guī)則包括:
規(guī)則a.若n個MapReduce Job間不包含父子關(guān)系且shuffle key相同,則所述n個MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并,其中,n為正整數(shù)且n小于所述MapReduce物理計劃中MapReduce Job的總個數(shù);
其中,所述父子關(guān)系包含孫子關(guān)系,指不能有上下層關(guān)系的MapReduce Job;
規(guī)則b.若父MapReduce Job與其所有子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并;
規(guī)則c.若父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并。
其中,所述子MapReduce Job指所述父MapReduce Job的直接兒子;
進(jìn)一步的,所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述n個MapReduce Job讀磁盤時讀取所述n個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)并將所述n個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù)的n個shuffle key分別與n個標(biāo)記{tag1,tag2...tagi...tagn}進(jìn)行合并,獲取合并結(jié)果其中,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù),為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵的屬性值,為第i個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù),為第i個MapReduce Job對應(yīng)的shuffle key且列相同,第i個MapReduce Job對應(yīng)的shuffle key的屬性值,tagi與為唯一對應(yīng)關(guān)系,用于標(biāo)記shuffle key與MapReduce Job的對應(yīng)關(guān)系;
將所述合并結(jié)果放入shuffle過程,通過shuffle key對應(yīng)的標(biāo)記確定數(shù)據(jù)來源,將第i個標(biāo)記tagi對應(yīng)的發(fā)送至所述第i個MapReduce Job的reduce函數(shù)。
所述對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job的所有子MapReduce Job互為所述規(guī)則a定義的相關(guān)MapReduce Job,則將所述父MapReduce Job的所有子MapReduce Job按所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并的合并方式進(jìn)行合并;
將所述父MapReduce Job的所有子MapReduce Job對應(yīng)的reduce函數(shù)處理結(jié)果直接發(fā)送至所述父MapReduce Job的map函數(shù),且所述父MapReduce Job的map函數(shù)直接將所述父MapReduce Job的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job的reduce函數(shù)。
其中,若所述父MapReduce Job還有數(shù)據(jù)來自表文件,則表文件相當(dāng)于下述規(guī)則c中與父MapReduce Job不相關(guān)的子MapReduce Job文件,處理方式同包括:所述父MapReduce Job讀取所述父MapReduce Job對應(yīng)map函數(shù)的處理數(shù)據(jù),及表數(shù)據(jù),并獲取所述并獲取所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù)。
所述對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job讀磁盤時讀取與其不相關(guān)的子MapReduce Job的存盤結(jié)果和與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù);
將所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)并獲取所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù),將所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù)的輸出結(jié)果直接發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù),并直接將所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù);
將所述與其不相關(guān)的子MapReduce Job的存盤結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù)并獲取所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù)。
例如:如圖2所示,3個MapReduce Job,Job1和Job2無子任務(wù),可以直接執(zhí)行,Job3是Job1和Job2的父任務(wù),且Job3與Job1的shuffle key相同,能夠根據(jù)所述規(guī)則c進(jìn)行合并,則重寫MapReduce物理計劃,如圖3所示,將Job1對應(yīng)的map函數(shù)map1的處理數(shù)據(jù),即表數(shù)據(jù),發(fā)送至Job1對應(yīng)的map函數(shù)map1并獲取Job1對應(yīng)的map函數(shù)map1的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至Job1對應(yīng)的reduce函數(shù)reduce1,將Job1對應(yīng)的reduce函數(shù)reduce1的輸出結(jié)果直接發(fā)送至Job3對應(yīng)的map函數(shù)map3,并直接將Job3對應(yīng)的map函數(shù)map3的輸出結(jié)果發(fā)送至Job3對應(yīng)的reduce函數(shù)reduce3;
將Job2的存盤結(jié)果發(fā)送至Job3對應(yīng)的map函數(shù)map3并獲取Job3對應(yīng)的map函數(shù)map3的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至Job3對應(yīng)的reduce函數(shù)reduce3。
實施例
本發(fā)明提供的實施例,如圖4所示,利用事務(wù)處理性能委員會(TPC)組織的一個通用的測試集TPCH的Q17為例,Hive將TPCH Q17翻譯成了4個MapReduce Job,其中MapReduce Job1和MapReduce Job2沒有子任務(wù),讀磁盤取的是表數(shù)據(jù),可以直接執(zhí)行,MapReduce Job3的子任務(wù)是MapReduce Job1和MapReduce Job2,讀磁盤取的是MapReduce Job1和MapReduce Job2的結(jié)果,需要MapReduce Job1和MapReduce Job2執(zhí)行完畢才能執(zhí)行,MapReduce Job4的子任務(wù)是MapReduce Job3,讀磁盤取的是MapReduce Job3的結(jié)果,需要MapReduce Job3執(zhí)行完畢才能執(zhí)行,具體地,Hive自動地生成了4個map函數(shù):Map1函數(shù)、Map2函數(shù)、Map3函數(shù)、Map4函數(shù)和4個reduce函數(shù):Reduce1函數(shù)、Reduce2函數(shù)、Reduce3函數(shù)、Reduce4函數(shù)。每個map函數(shù)處理完后就調(diào)用相應(yīng)接口函數(shù),將數(shù)據(jù)交給shuffle,shuffle在將數(shù)據(jù)交給reduce函數(shù),reduce通過調(diào)用相應(yīng)接口函數(shù)獲得數(shù)據(jù),本發(fā)明的優(yōu)化過程并不會改寫map函數(shù)和reduce函數(shù)對數(shù)據(jù)的處理部分,也不會修改MapReduce框架,僅修改map函數(shù)和reduce函數(shù)中關(guān)于結(jié)果傳遞的代碼,也就是說只修改調(diào)用接口讀取或發(fā)送數(shù)據(jù)的部分,再例如map函數(shù)的結(jié)果原本是調(diào)用接口,傳給shuffle,現(xiàn)在可能將調(diào)用接口的內(nèi)容刪去,增加直接傳給reduce函數(shù)的語句,也可能將map函數(shù)的結(jié)果的鍵值對中的鍵加一個tag字段,值不變,仍然將這個鍵值對交給shuffle。圖2中,任務(wù)1、2、3的shuffle key是一個字段,具有相關(guān)性,滿足合并的情況,則將其合并到一個任務(wù)中執(zhí)行,如圖5所示,合并后不修改原來4個map函數(shù)和reduce函數(shù)內(nèi)部關(guān)于數(shù)據(jù)的處理過程,只是讀磁盤時,同時讀取Map1函數(shù)和Map2函數(shù)需要的數(shù)據(jù),Hive會根據(jù)讀取文件的路徑自動判斷是傳給Map1函數(shù)還是Map2函數(shù),假設(shè)Map1函數(shù)處理完輸入發(fā)出的數(shù)據(jù)是(k21,v21),Map2函數(shù)處理完輸入發(fā)出的數(shù)據(jù)是(k22,v22),因為任務(wù)1和任務(wù)2的shuffle key相同,所以k21和k22實際上是一個字段(后面合稱為k2),可以一起放入shuffle過程,與Hive生成的原生態(tài)的Map1函數(shù)和Map2函數(shù)略有不同,在Map1函數(shù)和Map2函數(shù)原來的輸出(不改變原函數(shù)執(zhí)行內(nèi)容)基礎(chǔ)上,獲得原函數(shù)的輸出結(jié)果,MapReduce重寫模塊將修改k2的內(nèi)容,將k2和一個tag(標(biāo)記)合并為一個字段記為k2',標(biāo)記作用是標(biāo)記它是來自Map1函數(shù)還是Map2函數(shù),最后傳給shuffle的內(nèi)容是(k2',v21或v22),當(dāng)k2'中tag為0表示內(nèi)容是(k2',v21),tag為1表示內(nèi)容是(k2',v22)。Shuffle過后得到結(jié)果(k2',k21或k22),在原Hive生成的Reduce1函數(shù)和Reduce2函數(shù)執(zhí)行之前,獲得shuffle的結(jié)果然后根據(jù)tag確定數(shù)據(jù)來源,并從k2'中提取k21和k22,然后分別發(fā)送給Reduce1和Reduce2,這樣Reduce1和Reduce2獲得的內(nèi)容就是(k21,v21)和(k22,v22),它們所處理的數(shù)據(jù)與任務(wù)合并之前完全一樣,所以對Reduce1和Reduce2不需做任何更改,假設(shè)map3函數(shù)獲取的數(shù)據(jù)為(k13,v13),在未優(yōu)化的情況下,Map3函數(shù)讀取的是Reduce1和Reduce2的輸出(k21,v21)和(k22,v22)的存磁盤的結(jié)果,這里可以將(k21,v21)和(k22,v22)直接傳給Map3函數(shù),也就是說將Reduce1和Reduce2的結(jié)果不存磁盤,而是傳給Map3函數(shù),和前面一樣,Map3會根據(jù)路徑自動識別輸入時來自Reduce1還是Reduce2,因為附圖3中傳給map3函數(shù)的數(shù)據(jù)是經(jīng)過shuffle排序的,且排序鍵不變,所以次序不需要重排(重排仍會得到相同結(jié)果,不會改變次序),將Map3函數(shù)的結(jié)果直接傳給Reduce3函數(shù),最后Reduce3的結(jié)果存磁盤,交給MapReduce Job2。
本發(fā)明提供的一種考慮任務(wù)相關(guān)性的Hive優(yōu)化系統(tǒng),如圖6所示,所述系統(tǒng)包括:相互連接的HQL解釋器和查詢優(yōu)化器,其中,所述HQL解釋器,用于將HQL語句轉(zhuǎn)化為MapReduce物理計劃,并獲取所述MapReduce物理計劃中各MapReduce Job在shuffle階段用于排序的鍵shuffle key,所述查詢優(yōu)化器,用于接收所述MapReduce物理計劃并根據(jù)相關(guān)性規(guī)則,合并所述MapReduce物理計劃中各MapReduce Job中相關(guān)MapReduce Job。
其中,所述相關(guān)性規(guī)則包括:
規(guī)則a.若n個MapReduce Job間不包含父子關(guān)系且shuffle key相同,則所述n個MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并,其中,n為正整數(shù)且n小于所述MapReduce物理計劃中MapReduce Job的總個數(shù);
規(guī)則b.若父MapReduce Job與其所有子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并;
規(guī)則c.若父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job的shuffle key相同,則所述父MapReduce Job與其所有子MapReduce Job中的一個子MapReduce Job互為相關(guān)MapReduce Job,并對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并。
進(jìn)一步的,所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述n個MapReduce Job讀磁盤時讀取所述n個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)并將所述n個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù)的n個shuffle key分別與n個標(biāo)記{tag1,tag2...tagi...tagn}進(jìn)行合并,獲取合并結(jié)果其中,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù),為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵,為第i個MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)的排序鍵的屬性值,為第i個MapReduce Job對應(yīng)的map函數(shù)輸出數(shù)據(jù),為第i個MapReduce Job對應(yīng)的shuffle key且列相同,第i個MapReduce Job對應(yīng)的shuffle key的屬性值,tagi與為唯一對應(yīng)關(guān)系,用于標(biāo)記shuffle key與MapReduce Job的對應(yīng)關(guān)系;
將所述合并結(jié)果放入shuffle過程,通過shuffle key對應(yīng)的標(biāo)記確定數(shù)據(jù)來源,將第i個標(biāo)記tagi對應(yīng)的發(fā)送至所述第i個MapReduce Job的reduce函數(shù)。
所述對所述規(guī)則b確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job的所有子MapReduce Job互為所述規(guī)則a定義的相關(guān)MapReduce Job,則將所述父MapReduce Job的所有子MapReduce Job按所述對所述規(guī)則a確定的相關(guān)MapReduce Job進(jìn)行合并的合并方式進(jìn)行合并;
將所述父MapReduce Job的所有子MapReduce Job對應(yīng)的reduce函數(shù)處理結(jié)果直接發(fā)送至所述父MapReduce Job的map函數(shù),且所述父MapReduce Job的map函數(shù)直接將所述父MapReduce Job的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job的reduce函數(shù)。
若所述父MapReduce Job還有數(shù)據(jù)來自表文件,則表文件相當(dāng)于規(guī)則c中無法合并的MapReduce Job的執(zhí)行結(jié)果文件,處理方式同規(guī)則c。
所述對所述規(guī)則c確定的相關(guān)MapReduce Job進(jìn)行合并包括:
所述父MapReduce Job讀磁盤時讀取與其不相關(guān)的子MapReduce Job的存盤結(jié)果和與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù);
將所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的處理數(shù)據(jù)發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)并獲取所述與其相關(guān)的子MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù),將所述與其相關(guān)的子MapReduce Job對應(yīng)的reduce函數(shù)的輸出結(jié)果直接發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù),并直接將所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù);
將所述與其不相關(guān)的子MapReduce Job的存盤結(jié)果發(fā)送至所述父MapReduce Job對應(yīng)的map函數(shù)并獲取所述父MapReduce Job對應(yīng)的map函數(shù)的輸出結(jié)果,將該輸出結(jié)果放入shuffle過程,再發(fā)送至所述父MapReduce Job對應(yīng)的reduce函數(shù)。最后應(yīng)當(dāng)說明的是:以上實施例僅用以說明本發(fā)明的技術(shù)方案而非對其限制,盡管參照上述實施例對本發(fā)明進(jìn)行了詳細(xì)的說明,所屬領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:依然可以對本發(fā)明的具體實施方式進(jìn)行修改或者等同替換,而未脫離本發(fā)明精神和范圍的任何修改或者等同替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求保護(hù)范圍之內(nèi)。