Hive大數(shù)據(jù)存儲與處理 課件 第6章 廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化_第1頁
Hive大數(shù)據(jù)存儲與處理 課件 第6章 廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化_第2頁
Hive大數(shù)據(jù)存儲與處理 課件 第6章 廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化_第3頁
Hive大數(shù)據(jù)存儲與處理 課件 第6章 廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化_第4頁
Hive大數(shù)據(jù)存儲與處理 課件 第6章 廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

廣電用戶收視行為數(shù)據(jù)查詢優(yōu)化任務(wù)背景通過前面章節(jié)的學(xué)習(xí),讀者對在HiveCLI中通過執(zhí)行HQL語句對Hive表進(jìn)行查詢的方法有了一定的了解,也熟悉了各種Hive函數(shù)的使用場景,掌握了調(diào)用函數(shù)編寫HQL語句實(shí)現(xiàn)查詢的方法。然而,為了進(jìn)一步提高查詢性能和效率,讀者該如何合理地、高效地選擇函數(shù)和編寫HQL語句,依舊是值得探究的主題。任務(wù)背景在數(shù)據(jù)量很小的場景下可以不考慮對HQL語句進(jìn)行優(yōu)化,因?yàn)閿?shù)據(jù)量很小,所以優(yōu)化效果可能不顯著。然而,在大數(shù)據(jù)場景下,語句優(yōu)化就尤為關(guān)鍵,在面對以百萬或以億計(jì)的數(shù)據(jù)量時,即使細(xì)微地優(yōu)化,都會在執(zhí)行效率上有質(zhì)的飛越。依“舊例”辦事固然很少出錯,但執(zhí)行速度會極慢,在高要求的背景下,大家需要做到“守正創(chuàng)新”,實(shí)現(xiàn)飛躍發(fā)展。廣電案例中的用戶收視行為數(shù)據(jù)表含有100多萬條數(shù)據(jù),相應(yīng)的查詢屬于大數(shù)據(jù)場景下的查詢,因此查詢語句的優(yōu)化是十分有必要的。任務(wù)背景本章將對廣電用戶收視行為數(shù)據(jù)表進(jìn)行查詢優(yōu)化。首先介紹視圖的創(chuàng)建及其操作方法其次介紹Hive的設(shè)置優(yōu)化,如配置Fetch抓取、設(shè)置map和reduce任務(wù)數(shù)等再介紹Hive的語句優(yōu)化,如使用子查詢優(yōu)化查詢語句,通過介紹Hive查詢的優(yōu)化方法,并結(jié)合廣電用戶收視行為數(shù)據(jù)表,以實(shí)現(xiàn)各任務(wù)為目標(biāo),幫助讀者掌握Hive的優(yōu)化查詢方法。使用視圖統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)優(yōu)化統(tǒng)計(jì)直播頻道數(shù)使用子查詢統(tǒng)計(jì)節(jié)目類型為直播的頻道Top10任務(wù)描述隨著互聯(lián)網(wǎng)的發(fā)展,電視與互聯(lián)網(wǎng)相結(jié)合,已經(jīng)實(shí)現(xiàn)了節(jié)目點(diǎn)播或回放,人們可以隨時觀看自己喜歡的節(jié)目。為了解不同節(jié)目的用戶觀看人數(shù),探索人們是觀看直播節(jié)目居多,還是因時間沖突,只能以點(diǎn)播或回放的方式觀看節(jié)目。本任務(wù)介紹使用Hive視圖降低查詢復(fù)雜度,優(yōu)化統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)查詢語句。創(chuàng)建視圖視圖是基于數(shù)據(jù)庫的基本表創(chuàng)建的一種偽表,因此數(shù)據(jù)庫只存儲視圖的定義,不存儲數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng)仍然存在基本表中。視圖可作為抽象層,將數(shù)據(jù)發(fā)布給下游用戶。視圖只能用于查詢,但不能進(jìn)行數(shù)據(jù)的插入和修改,提高了數(shù)據(jù)的安全性。在創(chuàng)建視圖時,視圖就已經(jīng)固定,因此對基本表的后續(xù)更改(如添加列等操作)將不會反映在視圖中。視圖允許從多個表中抽取字段組成可查詢的偽表。使用視圖可以降低查詢的復(fù)雜度,達(dá)到優(yōu)化查詢的目的。創(chuàng)建視圖在Hive中可以使用CREATEVIEW關(guān)鍵字創(chuàng)建視圖。創(chuàng)建視圖的語法如下。CREATEVIEW[IFNOTEXISTS][db_name.]view_name[(column_name[COMMENTcolumn_comment],...)][COMMENTview_comment][TBLPROPERTIES(property_name=property_value,...)]ASSELECT...;創(chuàng)建視圖創(chuàng)建Hive視圖的語法中的參數(shù)如下表所示。參數(shù)說明IFNOTEXISTS當(dāng)創(chuàng)建視圖時,如果已經(jīng)存在同名的視圖,那么將引發(fā)錯誤。在創(chuàng)建視圖時可以使用IFNOTEXISTS判斷是否存在同名的視圖COMMENT注釋,不僅可以為選擇的字段添加注釋,而且也可以為視圖添加注釋TBLPROPERTIES用戶可在創(chuàng)建視圖時添加自定義或預(yù)定義的數(shù)據(jù)屬性,并設(shè)置數(shù)據(jù)屬性的賦值A(chǔ)SSELECT用戶可選擇所基于的基本表內(nèi)容創(chuàng)建視圖,定義視圖的結(jié)構(gòu)和數(shù)據(jù)。如果在創(chuàng)建視圖時未定義列名,那么視圖列的名稱將自動由定義的SELECT表達(dá)式派生(如果SELECT包含無別名的標(biāo)量表達(dá)式,如“x+y”,那么視圖列名將以“_C0”“_C1”的形式生成)。重命名列時,還可以選擇提供列注釋(注釋不會自動繼承自基礎(chǔ)列)創(chuàng)建視圖廣電用戶收視行為數(shù)據(jù)表中,記錄了不同節(jié)目的收視情況?,F(xiàn)通過從Hive的廣電用戶收視行為數(shù)據(jù)表media_index中選取用戶編號、直播頻道名稱、觀看行為開始時間和觀看行為結(jié)束時間,形成一個可供查詢的視圖media_index_time_view。查看與刪除視圖視圖是一個沒有關(guān)聯(lián)存儲的純邏輯對象。當(dāng)查詢引用視圖時,會評估視圖的定義以生成一組行數(shù)據(jù)供進(jìn)一步地查詢。視圖是一個概念性描述,實(shí)際上作為查詢優(yōu)化的一部分,Hive將視圖的定義與查詢的定義結(jié)合起來,如在查詢視圖內(nèi)容時,Hive根據(jù)視圖的定義選擇引用表中對應(yīng)的字段內(nèi)容進(jìn)行查詢。在上小節(jié)中已創(chuàng)建了media_index_time_view視圖,在ZJSM數(shù)據(jù)庫中使用“SHOWTABLES;”語句,可查看當(dāng)前數(shù)據(jù)庫中的表和視圖,如下圖所示。查看與刪除視圖除了使用“SHOWTABLES;”語句可查看當(dāng)前數(shù)據(jù)庫中的視圖外,Hive2.2.0及其后的版本開始支持使用“SHOWVIEWS;”語句查看當(dāng)前數(shù)據(jù)庫中的視圖,如下圖所示。查看與刪除視圖從上圖中可看到,數(shù)據(jù)庫中已經(jīng)存在了media_index_time_view視圖,可使用“DESCmedia_index_time_view;”語句查看視圖結(jié)構(gòu),如下圖所示。查看與刪除視圖視圖內(nèi)容查詢方法與表內(nèi)容查詢方法一致,查詢media_index_time_view視圖的前10行數(shù)據(jù),結(jié)果下圖所示。查看與刪除視圖視圖是基于基本表創(chuàng)建的偽表,并沒有將真實(shí)數(shù)據(jù)存儲在Hive中,若刪除視圖關(guān)聯(lián)的基本表,則查詢視圖內(nèi)容時將會報(bào)錯。若刪除ZJSM數(shù)據(jù)庫中的media_index表,則再次執(zhí)行上面代碼所示命令后,查看media_index_time_view視圖內(nèi)容時將會報(bào)錯,如下圖所示。查看與刪除視圖刪除視圖可使用“DROPVIEWview_name;”語句。對視圖使用“DROPTABLE”語句是非法的,這不會刪除視圖。使用“DROPVIEWmedia_index_time_view;”語句刪除media_index_time_view視圖,如下圖所示。任務(wù)實(shí)現(xiàn)本任務(wù)的目標(biāo)是實(shí)現(xiàn)使用視圖統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)。廣電用戶收視行為數(shù)據(jù)表的字段眾多,使用視圖篩選出相關(guān)字段可以降低查詢的復(fù)雜度,實(shí)現(xiàn)Hive查詢優(yōu)化。實(shí)現(xiàn)該任務(wù)的步驟如下。根據(jù)media_index表中的phone_no(用戶編號)和res_type(節(jié)目類型)字段創(chuàng)建視圖media_index_type_view。任務(wù)實(shí)現(xiàn)使用media_index_type_view視圖統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)。執(zhí)行上面代碼所示的命令可得到不同節(jié)目的用戶觀看人數(shù)的統(tǒng)計(jì)結(jié)果,如下圖所示,可得出觀看電視直播節(jié)目的用戶有6333人,觀看點(diǎn)播或回放節(jié)目的用戶有2448人。因此可得觀看電視直播節(jié)目的用戶人數(shù)約是觀看點(diǎn)播或回放節(jié)目的用戶人數(shù)的2.6倍。使用視圖統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)優(yōu)化統(tǒng)計(jì)直播頻道數(shù)使用子查詢統(tǒng)計(jì)節(jié)目類型為直播的頻道Top10任務(wù)描述隨著有線數(shù)字電視的發(fā)展與普及,用戶能夠觀看更多的直播頻道。用戶除了可以觀看基本的免費(fèi)直播節(jié)目外,還可以通過付費(fèi)的方式觀看更多的付費(fèi)節(jié)目?,F(xiàn)今電視節(jié)目豐富多彩,直播頻道相對較多。本任務(wù)介紹優(yōu)化Hive配置并統(tǒng)計(jì)廣電直播頻道數(shù),提高查詢效率。配置Fetch抓取Fetch抓取是指在Hive中對某些數(shù)據(jù)的查詢可以不必使用MapReduce計(jì)算,而是讀取存儲目錄下的文件,再輸出查詢結(jié)果到控制臺,如全局查詢、字段查詢和使用LIMIT語句查詢。在特殊的場景下配置Fetch抓取,可以提高查詢的效率。配置Fetch抓取Hive安裝目錄的conf目錄下存在一個hive-default.xml.template配置文件,該文件中存在一個hive.fetch.task.conversion參數(shù),對該參數(shù)可以設(shè)置3種值,分別為none、minimal和more,3種參數(shù)值的含義解析如下表所示。參數(shù)值含義解析none表示所有查詢都會運(yùn)行MapReduceminimal表示在查詢的開始階段、選擇某些分區(qū)的字段和使用LIMIT語句查詢時不會執(zhí)行MapReducemore表示在全局查詢、字段查詢和使用LIMIT查詢時都不會執(zhí)行MapReduce配置Fetch抓取將hive.fetch.task.conversion參數(shù)的值設(shè)置為more,即可實(shí)現(xiàn)Fetch抓取。Hive3.1.2中的hive.fetch.task.conversion參數(shù)的值默認(rèn)設(shè)置為more。例如,在Hive3.1.2的CLI中簡單地查詢廣電用戶收視行為數(shù)據(jù)表的前5行數(shù)據(jù),查詢時將不會執(zhí)行MapReduce,如下圖所示。配置Fetch抓取若將hive.fetch.task.conversion的值設(shè)置為none,再次查詢廣電用戶收視行為數(shù)據(jù)表的前5行數(shù)據(jù),則查詢時將執(zhí)行MapReduce,執(zhí)行結(jié)果如下圖所示。配置Fetch抓取對比上兩張圖所示的執(zhí)行時間可得:當(dāng)將hive.fetch.task.conversion的值設(shè)置為more時,查詢時間為0.381秒當(dāng)將hive.fetch.task.conversion的值設(shè)置為none時,查詢時間為72.547秒因此配置Fetch抓取對執(zhí)行簡單查詢的效率有顯著的提升。合理設(shè)置map和reduce任務(wù)數(shù)當(dāng)使用Hive進(jìn)行聚合查詢時,將不通過Fetch抓取讀取存儲目錄文件,而是使用MapReduce作業(yè)執(zhí)行聚合查詢的過程。在通常情況下,MapReduce作業(yè)通過讀取數(shù)據(jù)文件將產(chǎn)生一個或多個map任務(wù),產(chǎn)生的map任務(wù)數(shù)主要取決于讀取到的文件數(shù)和集群設(shè)置的文件塊大小。而在默認(rèn)的情況下,reduce任務(wù)數(shù)則是通過Hive的內(nèi)置算法決定的。合理設(shè)置map和reduce任務(wù)數(shù)調(diào)整map任務(wù)數(shù)并不是map任務(wù)數(shù)越多,其執(zhí)行效率就越高。假設(shè)一個任務(wù)存在多個小文件,每一個小文件都會啟動一個map任務(wù),當(dāng)一個map任務(wù)啟動和初始化的時間遠(yuǎn)遠(yuǎn)大于邏輯處理的時間,會造成很大的資源浪費(fèi),并且可執(zhí)行的map任務(wù)數(shù)是有限的。因此,可以設(shè)置在map任務(wù)執(zhí)行前合并小文件以達(dá)到減少map任務(wù)數(shù)的目的。合理設(shè)置map和reduce任務(wù)數(shù)當(dāng)然,map任務(wù)數(shù)也不是越少越好。假設(shè)處理的文件較大,任務(wù)邏輯復(fù)雜,map任務(wù)執(zhí)行較慢的時候,可考慮增加map任務(wù)數(shù),降低每個map任務(wù)處理的數(shù)據(jù)量,從而提高任務(wù)的執(zhí)行效率。增加map任務(wù)數(shù)可以通過減小Hadoop塊實(shí)現(xiàn)。廣電用戶收視行為數(shù)據(jù)表大小約為780MB,使用“SETmapreduce.input.fileinputformat.split.maxsize;”語句查看最大切分?jǐn)?shù)據(jù)塊,結(jié)果如下圖所示。本書Hive環(huán)境中默認(rèn)最大切分?jǐn)?shù)據(jù)塊的大小為256MB。合理設(shè)置map和reduce任務(wù)數(shù)使用count()聚合函數(shù)統(tǒng)計(jì)廣電用戶收視行為數(shù)據(jù)表的記錄數(shù),結(jié)果如右圖所示,該查詢過程所需要的執(zhí)行時間為62.273秒。由右圖可得,處理廣電用戶收視行為數(shù)據(jù)表將會產(chǎn)生4個map任務(wù),map任務(wù)數(shù)較少,因此每個map任務(wù)所需處理的數(shù)據(jù)量較大。合理設(shè)置map和reduce任務(wù)數(shù)將最大切分?jǐn)?shù)據(jù)塊的大小設(shè)置為128MB,再統(tǒng)計(jì)廣電用戶收視行為數(shù)據(jù)表的記錄數(shù),預(yù)計(jì)將產(chǎn)生7個map任務(wù),執(zhí)行效率將會提升。執(zhí)行結(jié)果如下圖所示。下圖所示的結(jié)果與預(yù)測結(jié)果一致,將最大切分?jǐn)?shù)據(jù)塊的大小設(shè)置為128MB后,MapReduce任務(wù)產(chǎn)生了7個map任務(wù),執(zhí)行時間也從62.273秒降低為52.472秒,表明通過合理設(shè)置map任務(wù)數(shù)能夠有效地提高執(zhí)行效率。合理設(shè)置map和reduce任務(wù)數(shù)調(diào)整reduce任務(wù)數(shù)Hive3.1.2中每個reduce任務(wù)處理的數(shù)據(jù)塊大小默認(rèn)是256MB,每個MapReduce任務(wù)的最大可執(zhí)行reduce任務(wù)數(shù)為1009個,結(jié)果如下圖所示。合理設(shè)置map和reduce任務(wù)數(shù)若不設(shè)置reduce任務(wù)數(shù),則Hive將使用內(nèi)置算法確定reduce任務(wù)數(shù),這將對執(zhí)行效率有很大的影響。在處理的數(shù)據(jù)量較大時,若reduce任務(wù)數(shù)較少,則會導(dǎo)致reduce任務(wù)執(zhí)行過慢,甚至?xí)霈F(xiàn)內(nèi)存過載的錯誤。若reduce任務(wù)數(shù)較多,則會產(chǎn)生大量的小文件,造成文件合并代價太高,NameNode的內(nèi)存占用也會增大。因此,合理地設(shè)置reduce任務(wù)數(shù)尤為關(guān)鍵。合理的reduce任務(wù)數(shù)等于讀取的文件大小除以每個reduce任務(wù)能夠處理的數(shù)據(jù)量大小。如廣電用戶收視行為數(shù)據(jù)表的大小約為780MB,合理的reduce任務(wù)數(shù)應(yīng)該為4。配置并行執(zhí)行在Hive中執(zhí)行HQL語句查詢時,會將查詢轉(zhuǎn)化成一個或多個階段來完成查詢?nèi)蝿?wù),包括MapReduce階段、全局查詢階段、合并階段或使用LIMIT語句查詢階段等。在Hive的默認(rèn)環(huán)境下,Hive執(zhí)行任務(wù)時將按照劃分好的階段逐步執(zhí)行,換而言之,Hive一次只會執(zhí)行一個階段。其實(shí)在Hive作業(yè)的眾多階段中,并非所有的階段都是完全相互依賴的,因此存在某些階段是允許并行執(zhí)行的。通過配置并行執(zhí)行,可以使得整個Hive作業(yè)的執(zhí)行時間縮短。Hive的并行執(zhí)行配置。配置并行執(zhí)行Hive的并行執(zhí)行默認(rèn)狀態(tài)是false(即關(guān)閉),需要設(shè)置為true(開啟)。Hive中執(zhí)行同一條HQL語句所支持的并行度默認(rèn)值為8,換而言之,Hive可以同時執(zhí)行8個互不相關(guān)的階段。讀者可以根據(jù)所執(zhí)行的HQL語句的復(fù)雜程度調(diào)整最大并行度。值得注意的是,在Hive集群當(dāng)中,如果Hive作業(yè)中并行執(zhí)行階段增多,那么集群資源利用率也會增大。并行執(zhí)行會占用大量的集群資源以加速HQL語句的執(zhí)行,因此一定要清楚集群資源的總量與當(dāng)前利用率,否則并行執(zhí)行將失敗。任務(wù)實(shí)現(xiàn)本任務(wù)的目標(biāo)是實(shí)現(xiàn)優(yōu)化Hive配置,并且統(tǒng)計(jì)直播頻道數(shù),任務(wù)實(shí)現(xiàn)步驟如下。創(chuàng)建media_index_station_view視圖,從廣電用戶收視行為數(shù)據(jù)表中篩選出直播頻道字段。將Hive中的最大切分?jǐn)?shù)據(jù)塊的大小設(shè)置為128MB,增加map任務(wù)數(shù)。開啟任務(wù)并行執(zhí)行。去重統(tǒng)計(jì)直播頻道數(shù)。任務(wù)實(shí)現(xiàn)優(yōu)化統(tǒng)計(jì)直播頻道數(shù),將生成1個MapReduce作業(yè),且讀取media_index_station_view視圖數(shù)據(jù)時,生成7個map任務(wù)。因?yàn)槭褂肅OUNT(DISTINCT)語句去重,所以只會生成1個reduce任務(wù),MapReduce作業(yè)執(zhí)行總用時為50.399s,結(jié)果如下圖所示。使用視圖統(tǒng)計(jì)不同節(jié)目的用戶觀看人數(shù)優(yōu)化統(tǒng)計(jì)直播頻道數(shù)使用子查詢統(tǒng)計(jì)節(jié)目類型為直播的頻道Top10任務(wù)描述現(xiàn)今廣電直播頻道數(shù)量眾多,電視節(jié)目日益全球化,任務(wù)6.2統(tǒng)計(jì)出廣電公司擁有147個直播頻道。廣電公司需要對每個直播頻道進(jìn)行投資,因此了解用戶感興趣的節(jié)目,進(jìn)行直播頻道熱度統(tǒng)計(jì),對廣電公司進(jìn)行節(jié)目投資十分重要。本任務(wù)介紹使用子查詢統(tǒng)計(jì)出節(jié)目類型為直播的頻道Top10。使用子查詢優(yōu)化查詢語句Hive作為分布式的數(shù)據(jù)倉庫,在執(zhí)行分布式計(jì)算和分布式存儲時,都會消耗大量的磁盤和網(wǎng)絡(luò)I/O(Input/Output,輸入輸出)資源,因此如何減少I/O資源消耗是一個優(yōu)化的焦點(diǎn)。Hive的查詢依賴于MapReduce計(jì)算框架,而每一個MapReduce作業(yè)的啟動需要消耗大量的I/O資源,原因是MapReduce存在Shuffle操作,中間結(jié)果將產(chǎn)生大量的磁盤落地。HQL語句的查詢?nèi)蝿?wù)會轉(zhuǎn)化為MapReduce程序來執(zhí)行,若存在多個作業(yè),則作業(yè)與作業(yè)之間的中間結(jié)果會先溢寫到磁盤上。因此優(yōu)化HQL語句減少中間結(jié)果數(shù)據(jù)的產(chǎn)生,也能夠達(dá)到減少I/O資源消耗的效果。使用子查詢優(yōu)化查詢語句子查詢指在一個查詢語句中嵌套使用一個或多個查詢語句,子查詢放在FROM關(guān)鍵字之后,且因?yàn)镕ROM子句中的每個表都必須具有名稱,所以需要為子查詢指定表名稱。子查詢SELECT列表中的列(字段)名稱也必須唯一。從Hive0.13開始允許使用AS關(guān)鍵字進(jìn)行子查詢表命名,同時也開始支持在WHERE之后使用關(guān)鍵字IN或NOTIN實(shí)現(xiàn)子查詢。使用子查詢優(yōu)化查詢語句在Hive中,盡量先多使用子查詢和使用WHERE語句降低表數(shù)據(jù)的復(fù)雜度,再使用JOIN連接查詢。如果先進(jìn)行表連接,那么查詢將先進(jìn)行全表掃描,最后才使用WHERE語句篩選,執(zhí)行效率將會降低。如果先使用子查詢,那么可利用WHERE語句過濾不相關(guān)字段,不但能增加map任務(wù)數(shù),還能減小數(shù)據(jù)量。使用子查詢,查詢用戶數(shù)小于500的用戶等級名稱,查詢到EA級的用戶數(shù)小于500,結(jié)果如下圖所示。優(yōu)化配置GROUPBY語句在使用GROUPBY語句進(jìn)行數(shù)據(jù)分組時,在默認(rèn)情況下,Map階段相同的key數(shù)據(jù)將發(fā)送給同一個reduce任務(wù)處理。當(dāng)某一個key數(shù)據(jù)過大時,將產(chǎn)生數(shù)據(jù)傾斜,導(dǎo)致某個reduce任務(wù)需要處理的數(shù)據(jù)量過大,使得該reduce任務(wù)執(zhí)行緩慢,甚至造成任務(wù)掛失。其實(shí)并非所有的聚合操作都需要在Reduce階段完成,許多聚合操作在不影響最終結(jié)果的情況下可以在Map階段進(jìn)行預(yù)聚合(如求和以及求最值),最后在Reduce階段進(jìn)行結(jié)果輸出即可。優(yōu)化配置GROUPBY語句在Hive中開啟Map階段預(yù)聚合的參數(shù)設(shè)置如下。設(shè)置允許在Map端進(jìn)行聚合,聚合設(shè)置默認(rèn)為true(開啟)。設(shè)置允許在Map端進(jìn)行聚合操作的數(shù)據(jù)量時應(yīng)對所需處理的數(shù)據(jù)量有一定的了解,若設(shè)置的可聚合數(shù)量過小,則會影響執(zhí)行效率。優(yōu)化配置GROUPBY語句設(shè)置允許在發(fā)生數(shù)據(jù)傾斜時進(jìn)行負(fù)載均衡,負(fù)載均衡默認(rèn)為false(關(guān)閉),需要將其設(shè)置為true(開啟)。當(dāng)開啟負(fù)載均衡時,將生成兩個MapReduce作業(yè)。第一個MapReduce作業(yè)的Map端的輸出結(jié)果將被隨機(jī)分布到Reduce端,對每個reduce任務(wù)進(jìn)行部分?jǐn)?shù)據(jù)聚合操作,并輸出結(jié)果,目的是將相同的key分發(fā)到不同的reduce任務(wù)中,以達(dá)到負(fù)載均衡。第二個MapReduce作業(yè)根據(jù)第一個MapReduce作業(yè)處理好的結(jié)果按key分組聚合并發(fā)送到相同的reduce任務(wù)中。優(yōu)化配置GROUPBY語句以分組統(tǒng)計(jì)廣電用戶收視行為數(shù)據(jù)表中的用戶等級名稱為例,對比在優(yōu)化配置GROUPBY語句前后的任務(wù)執(zhí)行時間。使用Hive默認(rèn)配置分組統(tǒng)計(jì)用戶等級名稱,將產(chǎn)生一個MapReduce作業(yè),作業(yè)執(zhí)行時間為105.8秒,如右圖所示。優(yōu)化配置GROUPBY語句使用語句優(yōu)化配置GROUPBY語句后,再次分組統(tǒng)計(jì)用戶等級名稱,將產(chǎn)生兩個MapReduce作業(yè).第一個作業(yè)的作用是實(shí)現(xiàn)部分?jǐn)?shù)據(jù)預(yù)聚合與reduce任務(wù)負(fù)載均衡。第二個作業(yè)的作用是實(shí)現(xiàn)全部數(shù)據(jù)分組聚合輸出。兩個作業(yè)的總執(zhí)行時間為82.268秒,相比于使用Hive默認(rèn)配置分組統(tǒng)計(jì)用戶等級名稱的執(zhí)行時間105.8秒,執(zhí)行時間減少了大約23.5秒,如右圖所示。使用GROUPBY代替COUNT(DISTINCT)去重統(tǒng)計(jì)在數(shù)據(jù)量較小的場景下,使用COUNT(DISTINCT)去重統(tǒng)計(jì)與使用GROUPBY去重統(tǒng)計(jì)在執(zhí)行效率上區(qū)別不大。在數(shù)據(jù)量較大的場景下,不建議使用COUNT(DISTINCT),因?yàn)镃OUNT(DISTINCT)只會啟動一個reduce任務(wù),該reduce任務(wù)需要處理的數(shù)據(jù)量較大,將導(dǎo)致整個MapReduce作業(yè)難以完成??煽紤]先使用GROUPBY分組后再使用COUNT函數(shù)統(tǒng)計(jì)的方式實(shí)現(xiàn)去重。使用GROUPBY代替COUNT(DISTINCT)去重統(tǒng)計(jì)使用COUNT(DISTINCT)去重統(tǒng)計(jì)用戶數(shù),將啟用一個reduce任務(wù)執(zhí)行,執(zhí)行時間為51.115秒,結(jié)果如下圖所示。使用GROUPBY代替COUNT(DISTINCT)去重統(tǒng)計(jì)使用GROUPBY分組后再使用COUNT函數(shù)統(tǒng)計(jì)的方式實(shí)現(xiàn)去重統(tǒng)計(jì)用戶數(shù),將會啟動兩個MapReduce作業(yè),也就是對應(yīng)的先分組后統(tǒng)計(jì)。啟動MapReduce作業(yè)后,將產(chǎn)生4個reduce任務(wù),兩個MapReduce作業(yè)的總執(zhí)行時間為77.993秒,如右圖所示。相比于使用COUNT(DISTINCT)去重統(tǒng)計(jì)用戶數(shù),采用GROUPBY分組后再使用COUNT函數(shù)統(tǒng)計(jì)的方式雖然會啟動兩個MapReduce作業(yè),在執(zhí)行時間上稍慢,但是相比于只用一個reduce任務(wù),采用4個reduce任務(wù)執(zhí)行更能保證數(shù)據(jù)的安全和作業(yè)的穩(wěn)定執(zhí)行。優(yōu)化配置LIMIT語句LIMIT語句用于限制查詢返回的行數(shù)。如果不優(yōu)化LIMIT語句,將會在全表查詢后返回限制的行數(shù)。在Hive中可開啟LIMIT語句優(yōu)化參數(shù),優(yōu)化后將對數(shù)據(jù)抽樣返回。開啟LIMIT語句優(yōu)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論