Pig與Hive已經(jīng)成為企業(yè)實現(xiàn)大規(guī)模數(shù)據(jù)交互的必要工具,其突出優(yōu)勢在于無需編寫復(fù)雜的MapReduce代碼。作為Hadoop生態(tài)系統(tǒng)中的重要力量,這兩款組件都提供一套立足于核心執(zhí)行程序的抽象層。Hive的初步設(shè)計思路在于提供與SQL類似的使用體驗,同時簡化了RDBMS的過渡流程。Pig則擁有更多規(guī)程化方案,旨在幫助使用者在無需編寫MapReduce的前提下實現(xiàn)數(shù)據(jù)操作。
本篇文章將通過示例及代碼對Pig與Hive進行一番全面比較。
Hive的固有優(yōu)勢
Apache Hive是一款極為強大的大數(shù)據(jù)組件,其主要長項在于數(shù)據(jù)整理與提取。在處理已經(jīng)存在關(guān)聯(lián)模式的數(shù)據(jù)時,Hive擁有極為出色的表現(xiàn)。另外,Hive metastore工具還能夠根據(jù)用戶指定的條件對全部數(shù)據(jù)進行劃分,這將進一步提升數(shù)據(jù)的檢索速度。然而,在利用大量分區(qū)進行單一查詢時,大家需要當心Hive可能造成的以下問題:
1)查詢當中分區(qū)數(shù)量的增加意味著與之相關(guān)的路徑數(shù)量亦將同步增加。我們假設(shè)在某一用例當中,某條查詢需要指向一套包含10000個頂級分區(qū)的表,且其中各個分區(qū)又包含更多嵌套分區(qū)。有些朋友可能已經(jīng)意識到,Hive在這時會嘗試在任務(wù)配置中為全部分區(qū)設(shè)置路徑,同時將該查詢轉(zhuǎn)譯為MapReduce任務(wù)。因此,分區(qū)數(shù)量會直接影響到任務(wù)的自身大小。由于默認jobconf的大小為5 MB,因此超出這一上限將引發(fā)運行時執(zhí)行錯誤。舉例來說,其可能顯示“java.io.IOException: Exceeded max jobconf size: 14762369 limit: 5242880”。大家可以點擊此處查看更多相關(guān)細節(jié)信息。
2)通過“MSCK REPAIR TABLE 表名稱”實現(xiàn)的批量分區(qū)注冊(例如10000 x 100000個分區(qū))同樣會受到Hadoop Heap大小以及GCOverheadlimit的限制。超出這一上限顯然會導(dǎo)致錯誤或者如下所示的stackoverflow執(zhí)行崩潰錯誤: