Pig Latin分析報(bào)告_第1頁(yè)
Pig Latin分析報(bào)告_第2頁(yè)
Pig Latin分析報(bào)告_第3頁(yè)
Pig Latin分析報(bào)告_第4頁(yè)
Pig Latin分析報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、PIG LATIN 簡(jiǎn)簡(jiǎn)介介對(duì)海量數(shù)據(jù)的按需分析處理需求不斷增加,尤其是對(duì)于因特網(wǎng)公司,它們的技術(shù)革新主要依賴于對(duì)每天收集的數(shù)據(jù)的分析處理能力。要提高如此巨大數(shù)據(jù)集的存儲(chǔ)和分析效率,必須采用高度并行的系統(tǒng),例如:shared-nothing cluster。并行數(shù)據(jù)庫(kù)產(chǎn)品,如:Teradata 提供了一種解決方案,但是這種方案的 web 規(guī)模擴(kuò)展開(kāi)銷(xiāo)太大,性價(jià)比不高,而且為程序員提供了一種不太自然的編程語(yǔ)言-SQL。事實(shí)上很多程序員更加偏愛(ài)過(guò)程式程序設(shè)計(jì)語(yǔ)言,因?yàn)檫@種語(yǔ)言的數(shù)據(jù)流更加清晰,便于分析和調(diào)試。這也是 map/reduce 編程模型流行的原因之一。另外 map/reduce 的運(yùn)行于

2、普通商業(yè)硬件組成的集群,軟件框架保證了可靠性和可用性,通過(guò)低端硬件實(shí)現(xiàn)了高性能計(jì)算,這也是 map/reduce 的優(yōu)勢(shì)所在。盡管如此,map/ reduce 也存在一些限制,它的單輸入,兩階段數(shù)據(jù)流編程模式過(guò)于苛刻,對(duì)于超出該限制之外的數(shù)據(jù)分析任務(wù),需要進(jìn)行一些額外的數(shù)據(jù)轉(zhuǎn)換。另外,它沒(méi)有通用操作子,即使是對(duì)最通用的操作,如:projection 和filtering。這些限制導(dǎo)致 map/reduce 代碼重用性和可維護(hù)性不高,任務(wù)的分析語(yǔ)義不夠清晰,將對(duì)系統(tǒng)性能優(yōu)化造成影響?;谝陨蠁?wèn)題,Yahoo!開(kāi)發(fā)了一種新的基于數(shù)據(jù)流的大規(guī)模數(shù)據(jù)分析處理語(yǔ)言-Pig Latin,該語(yǔ)言借鑒了 SQ

3、L 和 map/reduce 兩者的優(yōu)點(diǎn),既具有類(lèi)似 SQL的靈活可變式性,又有過(guò)程式語(yǔ)言的數(shù)據(jù)流特點(diǎn)。首先以一個(gè)例子來(lái)直觀感受 Pig Latin 的特點(diǎn):假設(shè)我們有一個(gè)表 urls:(url,category,pagerank)下面是一個(gè)簡(jiǎn)單的 SQL 查詢,對(duì)每個(gè)足夠大的分類(lèi),找出其包含的高pagerank 的平均值。查詢?nèi)缦拢篠ELECT category,AVG(pagerank)FROM urls WHERE pagerank0.2GROUP BY category HAVING COUNT(*)106與上述 SQL 等價(jià)的 Pig Latin 程序如下:good_urls=FIL

4、TER urls BY pagerank0.2;groups=GROUP good_urls BY category;big_groups=FILTER groups BY COUNT(good_urls)106;output=FOREACH big_groups GENERATEcategory, AVG(good_urls.pagerank);可見(jiàn),Pig Latin 是一種一步一步順序執(zhí)行的編程語(yǔ)言,每一步都完成一次數(shù)據(jù)轉(zhuǎn)換。這種風(fēng)格為很多程序員所喜愛(ài)。同時(shí)每步的轉(zhuǎn)換也都是高級(jí)抽象,例如:filtering,grouping,aggregation,抽象級(jí)別類(lèi)似于 SQL。事實(shí)上,Pig

5、 Latin 程序更像是對(duì)查詢執(zhí)行計(jì)劃的規(guī)范。因此更易于程序員理解和控制。Pig Latin 的實(shí)現(xiàn)系統(tǒng)叫 pig,Yahoo!的程序員使用 pig 對(duì)大規(guī)模數(shù)據(jù)進(jìn)行分析處理。Pig Latin 程序被編譯為 mapreduce 作業(yè),在 hadoop 上執(zhí)行。特特點(diǎn)點(diǎn)和和動(dòng)動(dòng)機(jī)機(jī)數(shù)數(shù)據(jù)據(jù)流流語(yǔ)語(yǔ)言言Pig Latin 語(yǔ)言在編程風(fēng)格上與 SQL 有明顯差別,前者凸顯了程序的執(zhí)行數(shù)據(jù)流,后者只關(guān)注最終結(jié)果。SQL 更適合于編程經(jīng)驗(yàn)不豐富的程序員,適合小規(guī)模數(shù)據(jù)集;Pig Latin 更適合有經(jīng)驗(yàn)的程序員和大規(guī)模數(shù)據(jù)集。盡管 Pig Latin 程序提供了顯示的操作序列,但實(shí)際的執(zhí)行計(jì)劃不一定按

6、照該順序執(zhí)行,編譯器會(huì)根據(jù)一定的規(guī)則對(duì)執(zhí)行順序進(jìn)行一定的優(yōu)化。舉例如下:假設(shè)某人對(duì)類(lèi)型為 spam 網(wǎng)頁(yè)的 url 感興趣,并且要求高 pagerank,則實(shí)現(xiàn)為:spam_urls=FILTER urls BY isSpam(url);highPR_spam_urls=FILTER spam_urls BY pagerank0.8按照上述給出的語(yǔ)句,程序會(huì)先找出所有的 spam url,然后按照 pagerank 對(duì)spam url 進(jìn)行過(guò)濾。但是這種執(zhí)行順序可能是不高效的,尤其是當(dāng) isSpam(url)是一個(gè)用戶定義的大開(kāi)銷(xiāo)函數(shù)時(shí)。顯然,這種情況下更高效的方式是先對(duì)全部url 按照 pa

7、gerank 進(jìn)行過(guò)濾,再對(duì)過(guò)濾后的 url 集合判別是否是 spam_url,得出最終想要的結(jié)果集合??炜焖偎匍_(kāi)開(kāi)始始和和協(xié)協(xié)同同工工作作能能力力Pig 支持對(duì)各種存儲(chǔ)格式的查詢處理,前提是用戶要給出特定的處理函數(shù),該函數(shù)能夠分析文件內(nèi)容,提取需要的元組,因此 Pig 不需要像傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)那樣在查詢數(shù)據(jù)之前要花費(fèi)大量時(shí)間導(dǎo)入數(shù)據(jù)。類(lèi)似地,Pig 程序的輸出也會(huì)按照用戶自定義函數(shù)將元組類(lèi)型轉(zhuǎn)換為特定格式的字節(jié)序列。這就簡(jiǎn)化了后續(xù)應(yīng)用程序?qū)?Pig 輸出結(jié)果的使用,例如可視化應(yīng)用程序或者類(lèi) Exel 的電子表格應(yīng)用程序。在像 Yahoo!這樣的大公司里,數(shù)據(jù)生態(tài)系統(tǒng)中包含大量的應(yīng)用,而 P

8、ig只是其中的一個(gè),因此使 Pig 具有操作外部文件中的數(shù)據(jù),又具有一定的操作權(quán)限是非常重要的,目前 Pig 可以容易地與生態(tài)系統(tǒng)中其他應(yīng)用進(jìn)行交互。傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)需要將數(shù)據(jù)導(dǎo)入到系統(tǒng)管理表主要是出于一下三點(diǎn)考慮:1) 保證事務(wù)一致性2) 通過(guò)元組標(biāo)識(shí)符實(shí)現(xiàn)高效的點(diǎn)式查詢3) 為用戶管理數(shù)據(jù),記錄模式信息以方便其他用戶理解但是,Pig 只支持只讀式數(shù)據(jù)分析,對(duì)數(shù)據(jù)的讀取是順序的,因此不需要事務(wù)一致性保證和基于索引的查詢。Pig 通常被用于分析每天或者每?jī)商飚a(chǎn)生的臨時(shí)數(shù)據(jù)集,不需要長(zhǎng)期保留,因此數(shù)據(jù)托管和模式管理也是多余的。Pig 對(duì)模式的支持是可有可無(wú)的,用戶可以在任何時(shí)候提供模式信息,也

9、可以不提供。以我們?cè)诘谝徊糠纸o出的例子為例,如果用戶知道存儲(chǔ) url 表文件的第三個(gè)域是 pagerank 而不想在程序中提供模式,則第一行可以等價(jià)表示為:good_urls=FILTER urls BY $20.2嵌嵌套套式式數(shù)數(shù)據(jù)據(jù)模模型型很多時(shí)候,程序員想使用嵌套數(shù)據(jù)結(jié)構(gòu),例如:為獲取術(shù)語(yǔ)在一組文件中出現(xiàn)的位置信息,程序員就一定希望為每個(gè)術(shù)語(yǔ)創(chuàng)建一個(gè)類(lèi)似于MapdocumentId,Set的結(jié)構(gòu)。對(duì)于數(shù)據(jù)庫(kù)而言,只允許扁平式表的存在,即只有原子字段可以作為列,否則會(huì)違反第一范式(1NF)。在滿足第一范式的條件下抓取術(shù)語(yǔ)位置信息就要求創(chuàng)建兩個(gè)表,對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理:term_info:(

10、termId,termString,)position_info: (termId,documentId,positon)然后按照 termId 進(jìn)行表連接,再按照 termId 和 documentId 進(jìn)行分組。Pig Latin 具有靈活的,完全嵌套的數(shù)據(jù)模型,允許復(fù)雜的非原子數(shù)據(jù)類(lèi)型(set,map,tuple)作為一個(gè)表的字段。嵌套數(shù)據(jù)類(lèi)型比 1NF 更適合 Pig 的執(zhí)行環(huán)境,主要是出于一下幾點(diǎn)考慮:嵌套式數(shù)據(jù)模型更符合程序員在編程過(guò)程中的需求,對(duì)他們來(lái)講這種數(shù)據(jù)模型比標(biāo)準(zhǔn)化數(shù)據(jù)格式更加自然。存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)本身往往具有嵌套的特點(diǎn)。比如,web 爬蟲(chóng)程序?yàn)槊總€(gè) url 和來(lái)自該

11、url 的外部連接集合產(chǎn)生輸出。Pig 是直接對(duì)文件進(jìn)行操作,將這種 web 規(guī)模的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化,然后再通過(guò)多次表連接進(jìn)行數(shù)據(jù)重組顯然是不現(xiàn)實(shí)的。嵌套數(shù)據(jù)模型有助于完成前邊介紹的代數(shù)式語(yǔ)言目標(biāo),即一步一步執(zhí)行,每步只完成一次數(shù)據(jù)轉(zhuǎn)換。例如,GROUP 原語(yǔ)產(chǎn)生的每個(gè)輸出元組都會(huì)有一個(gè)非原子字段(來(lái)自于 GROUP 輸入中屬于每個(gè)組的所有元組的嵌套集合)。嵌套數(shù)據(jù)模型有助于用戶寫(xiě)出各式各樣的用戶定義函數(shù)(UDF),關(guān)于 UDF將在下一節(jié)給出介紹。用用戶戶自自定定義義函函數(shù)數(shù)( UDF)對(duì)搜索日志,爬蟲(chóng)數(shù)據(jù),點(diǎn)擊流等數(shù)據(jù)分析的關(guān)鍵就是定制化處理。例如,一個(gè)用戶對(duì)搜索詞的自然語(yǔ)言填充感興趣,或者判

12、斷一個(gè)特殊的網(wǎng)頁(yè)是否是spam 等都需要定制化處理。為完成這種特殊的數(shù)據(jù)處理任務(wù),Pig Latin 提供 UDF 實(shí)現(xiàn)擴(kuò)展支持。事實(shí)上,Pig Latin 的所有處理(包括 grouping,filtering,joining 和 per-tuple processing)都可以通過(guò) UDF 定制。UDF 的輸入和輸出都可以使用嵌套數(shù)據(jù)模型,即可以使用非原子參數(shù)作為輸入,輸出也可以表示為非原子參數(shù)??紤]下面一個(gè)例子。繼續(xù)以第一個(gè)例子的設(shè)置為例,假設(shè)我們想為每個(gè) category,根據(jù) url 的pagerank 找出 top10 urls。可以使用 Pig Latin 表示為:groups=

13、 GROUP urls BY category;output= FOREACH groups GENERATE category, top10(urls)其中 top10 就是一個(gè) UDF,接收一組 url 作為輸入(每次針對(duì)一個(gè)組),為每個(gè)組輸出一個(gè)按 pagerank 排序前 10 位的 urls,該輸出包含了一個(gè)非原子字段。目前,Pig 的 UDF 需要用 java 實(shí)現(xiàn),正在開(kāi)發(fā)對(duì)其他語(yǔ)言的支持。并并行行化化需需求求Pig Latin 的目標(biāo)是處理 web 規(guī)模的數(shù)據(jù),因此它在實(shí)現(xiàn)時(shí)屏蔽了所有非并行的計(jì)算,即它只實(shí)現(xiàn)了一些容易并行處理的原語(yǔ),不容易并行處理的原語(yǔ)(如:非等價(jià)表連接以及相

14、關(guān)子查詢)都沒(méi)有被實(shí)現(xiàn)。但是,這些操作可以通過(guò) UDF 來(lái)實(shí)現(xiàn),Pig Latin 不顯式提供非并行原語(yǔ),用戶就可以很容易發(fā)現(xiàn)程序中瓶頸。調(diào)調(diào)試試環(huán)環(huán)境境任何一種語(yǔ)言實(shí)現(xiàn)的應(yīng)用程序,都要經(jīng)歷一個(gè)運(yùn)行-調(diào)試-運(yùn)行的循環(huán)迭代過(guò)程。這就需要一個(gè)調(diào)試環(huán)境,而對(duì)于 Pig 處理的數(shù)據(jù)規(guī)模而言,每次運(yùn)行往往花費(fèi)幾十分鐘甚至數(shù)小時(shí),因此需要定制一種高效的調(diào)試環(huán)境。Pig 開(kāi)發(fā)了一種特定的交互式調(diào)試環(huán)境,對(duì)程序運(yùn)行的每個(gè)步驟都以一個(gè)簡(jiǎn)單測(cè)試數(shù)據(jù)表來(lái)測(cè)試每步產(chǎn)生的輸出結(jié)果。測(cè)試數(shù)據(jù)盡可能模擬真實(shí)數(shù)據(jù),也基本可以完全表達(dá)程序的語(yǔ)義,并且,測(cè)試數(shù)據(jù)會(huì)隨著程序的進(jìn)化而自動(dòng)調(diào)整,而不是固定不變的。一步一步執(zhí)行的測(cè)試數(shù)據(jù)

15、有助于盡早發(fā)現(xiàn)錯(cuò)誤(甚至可能在全數(shù)據(jù)集上第一次迭代執(zhí)行之前),可以準(zhǔn)確定位錯(cuò)誤位置。PIG LATIN數(shù)數(shù)據(jù)據(jù)模模型型Pig 的數(shù)據(jù)模型主要有以下四種類(lèi)型構(gòu)成:Atom:一個(gè)原子類(lèi)型包括一個(gè)簡(jiǎn)單的原子值(字符串、數(shù)等),如:alice。Tuple:一個(gè)元組類(lèi)型由一些列字段組成,每個(gè)字段可以是任意類(lèi)型,例如:(alice,lakers)。Bag:一組 tuples 構(gòu)成一個(gè) bag,組成 bag 的每個(gè)元組是很靈活的,即 bag中的每個(gè) tuple 不需要具有相同的字段數(shù)和字段類(lèi)型。Tuple 可以嵌套,看一個(gè)bag 實(shí)例:Map:一個(gè) map 由一組數(shù)據(jù)項(xiàng)和它們關(guān)聯(lián)的索引鍵組成。和 bag 類(lèi)

16、型一樣,map 中每個(gè)數(shù)據(jù)項(xiàng)的模式也是很靈活的,即所有數(shù)據(jù)項(xiàng)不需要具有相同類(lèi)型。但是,索引鍵必須是原子類(lèi)型的數(shù)據(jù),主要是為了高效查詢。下面是一個(gè) map的例子:上例的 map 中,索引鍵fan of被映射為一個(gè)包含兩個(gè) tuple 類(lèi)型的 bag類(lèi)型,而索引鍵age被映射為原子類(lèi)型 20。Map 類(lèi)型對(duì)建模模式隨時(shí)間變化的數(shù)據(jù)集非常有用,例如:web 服務(wù)器可能需要新添加一個(gè)新字段來(lái)存儲(chǔ)日志信息,新字段可以通過(guò)在 map 中添加一個(gè)索引鍵來(lái)完成,不需改變現(xiàn)有程序,又可以通過(guò)新的程序完成對(duì)新字段的訪問(wèn)。再來(lái)看看 Pig Latin 的各種表達(dá)式類(lèi)型以及對(duì)它們的操作。如下表所示:由上表可見(jiàn) Pig

17、 Latin 語(yǔ)言的數(shù)據(jù)模型的靈活性,它可以任意嵌套,這種靈活性有助于完成”嵌套數(shù)據(jù)類(lèi)型”一節(jié)給出的設(shè)計(jì)動(dòng)機(jī)。規(guī)規(guī)范范數(shù)數(shù)據(jù)據(jù)輸輸入入 :LOAD規(guī)范數(shù)據(jù)輸入是 Pig Latin 程序的第一步,這一步規(guī)范了輸入數(shù)據(jù)的路徑,以及數(shù)據(jù)解序列化方式,即采用什么方法將輸入數(shù)據(jù)轉(zhuǎn)化為 Pig Latin 的數(shù)據(jù)模型。下面是一個(gè) LOAD 示例:上面的命令規(guī)范了三個(gè)方面的內(nèi)容: 輸入文件名為:query_log.txt 定制的文件解序列化方法為 myLoad() 加載的元祖由三個(gè)字段組成,分別為 userId,queryString 和 timestamp。LOAD 返回一個(gè) bag 句柄,在上例中該句

18、柄指向 queries,可以直接作為后續(xù)命令的輸入。實(shí)際上,該操作的實(shí)際效果并沒(méi)有像數(shù)據(jù)庫(kù)那樣將數(shù)據(jù)載入表中,bag 句柄在 Pig Latin 中只是一個(gè)邏輯上的概念,即 LOAD 命令僅僅規(guī)范了輸入文件名以其讀取方式,而并沒(méi)有將數(shù)據(jù)讀取出來(lái),除非用戶顯式給出命令,如 STORE 命令,該命令將在后面具體介紹。每每元元組組處處理理: FOREACH數(shù)據(jù)通過(guò) LOAD 命令載入后,就要指定對(duì)數(shù)據(jù)處理的方法。其中一個(gè)基本的操作是對(duì)數(shù)據(jù)集中每個(gè)元組的處理操作,通過(guò) FOREACH 命令完成。舉例如下:上述命令對(duì) queries 中每個(gè)元組(tuple)分別處理,每次處理產(chǎn)生一個(gè)輸出元組。輸出元組中

19、第一個(gè)字段是輸入元組的 userId 字段,第二個(gè)字段由用戶自定義函數(shù) expandQuery 產(chǎn)生,expandQuery 的輸入是輸入元組的 queryString 字段。假設(shè) expandQuery 會(huì)產(chǎn)生一個(gè) bag 類(lèi)型,作為輸入查詢串的擴(kuò)展。則上述命令完成的數(shù)據(jù)轉(zhuǎn)換功能可以用圖 1 表示:圖 1 在 FOREACH+FLATTEN 實(shí)例在 FOREACH 命令中,對(duì)每個(gè)元組的處理是相互獨(dú)立的,可以完全并行處理,這符合 Pig Latin 語(yǔ)言的完全并行化目標(biāo)。圖 1 中最后一步數(shù)據(jù)轉(zhuǎn)換涉及一個(gè) flattening 處理,它的作用是對(duì)嵌套數(shù)據(jù)類(lèi)型的消解,每個(gè) FLATTEN 消除一

20、層嵌套。命令如下:數(shù)數(shù)據(jù)據(jù)過(guò)過(guò)濾濾命命令令: FILTER該命令 Pig Latin 中又一個(gè)非常常用的命令,功能是保留一些想要的子數(shù)據(jù)集,丟棄其余,下面是一個(gè)具體的例子:該例子完成的功能是過(guò)濾掉用戶bot的信息,采用的操作子為 neq,是一種字符串比較操作子,與其對(duì)應(yīng)的還有 eq,另外還有其他類(lèi)型的過(guò)濾操作子,如:數(shù)字比較操作子(=,!=)和邏輯連接子(AND,OR,NOT)。FILTER 命令的比較標(biāo)準(zhǔn)可以采用任意的表達(dá)式實(shí)現(xiàn),因此,我們也可以采用 UDFs 的方式實(shí)現(xiàn)上述功能,考慮,上述命令在實(shí)際中可能不會(huì)很好地實(shí)現(xiàn)我們想要達(dá)到的效果,因?yàn)橛脩鬮ot可能不唯一,因此一種更好的實(shí)現(xiàn)方式如下

21、:分分組組聚聚集集: COGROUP數(shù)據(jù)處理過(guò)程中經(jīng)常需要將一個(gè)或多個(gè)數(shù)據(jù)集中的元組按照它們的相關(guān)性進(jìn)行分組聚集,以便于對(duì)它們進(jìn)行聯(lián)合處理。在 Pig Latin 中這種功能通過(guò)COGROUP 命令完成。假設(shè)我們通過(guò) LOAD 命令得到兩個(gè)數(shù)據(jù)集,分別為:其中 results 包含了不同的搜索串,用 url 表示的搜索結(jié)果以及它們?cè)谒阉鹘Y(jié)果列表中出現(xiàn)的位置。而 revenue 包含不同的搜索串,廣告位置以及搜索串關(guān)聯(lián)的廣告在指定位置獲取的廣告費(fèi)收入。下面按照 queryString 字段對(duì)兩個(gè)數(shù)據(jù)集進(jìn)行分組聚集,命令如下:該命令產(chǎn)生的結(jié)果如圖 2 所示:圖 2 COGROUP 與 JOIN一般

22、,COGROUP 命令的輸出包含一些列元組,每個(gè)組對(duì)應(yīng)一個(gè)元組。每個(gè)元組的第一個(gè)字段是組標(biāo)識(shí)符,唯一標(biāo)識(shí)了一個(gè)組。后續(xù)每個(gè)字段都是一個(gè)bag,每個(gè)來(lái)自于一個(gè)輸入數(shù)據(jù)集。第 i 個(gè) bag 包含第 i 個(gè)輸入中對(duì)應(yīng)每個(gè)組的所有輸入元組。有人可能會(huì)質(zhì)疑 COGROUP 原語(yǔ)的必要性,因?yàn)樗墓δ芎?JOIN 操作很類(lèi)似,圖 2 對(duì)兩者做出了比較。顯然,JOIN 等價(jià)于對(duì) COGROUP 結(jié)果中每個(gè)bag 字段進(jìn)行叉積。其實(shí) JOIN 只是 COGROUP 的目標(biāo)之一,在叉積之前,通過(guò)對(duì) COGROUP 結(jié)果進(jìn)行定制化操作可以得到多種結(jié)果,而不單單是 JOIN 的效果。這一點(diǎn)可以通過(guò)下面一個(gè)例子做進(jìn)

23、一步解釋說(shuō)明:該例子的目標(biāo)是找出搜索產(chǎn)生的每個(gè) url 對(duì)搜索產(chǎn)生的廣告收入的貢獻(xiàn),從而判斷每個(gè) url 價(jià)值,可以采用如下命令完成:DistributeRevenue 是一個(gè)用戶定制的處理函數(shù),它以某次查詢串搜索產(chǎn)生的 results 和 revenue 信息作為輸入?yún)?shù)。輸出一個(gè)由一些列(url,revenue)元組構(gòu)成的 bag。假設(shè)該函數(shù)的處理邏輯是搜索串產(chǎn)生的 top 位置廣告收入全部來(lái)自于 url 列表中的第一個(gè),slide 位置的廣告收入平均分配到每個(gè) url。這種處理邏輯下產(chǎn)生的輸出結(jié)果如圖 2 所示。要使用 SQL 來(lái)完成同樣的功能,首先 JOIN BY queryStrin

24、g,然后 GROUP BY queryString,最后應(yīng)用一個(gè)定制化的 aggregation。但是在執(zhí)行連接操作時(shí)系統(tǒng)會(huì)計(jì)算兩個(gè)表的叉積,而執(zhí)行 aggregation 是又要去掉叉積的效果,整個(gè)處理過(guò)程會(huì)相當(dāng)?shù)托?,查詢也?huì)變得難以理解。其實(shí),COGROUP 語(yǔ)句是 Pig Latin 與 SQL 之間的關(guān)鍵區(qū)別,COGROUP遵循前邊闡述的 Pig Latin 代數(shù)式語(yǔ)言的設(shè)計(jì)目標(biāo),即分布執(zhí)行,每步只處理一個(gè)數(shù)據(jù)轉(zhuǎn)換。COGROUP 只完成將對(duì)所有輸入數(shù)據(jù)集的元組聚集,對(duì)于之后的處理,用戶可以選擇在這些元組上應(yīng)用一個(gè) aggregation,或者對(duì)它們進(jìn)行叉積以實(shí)現(xiàn) JOIN 的效果,還

25、可以定制其他處理邏輯。而在 SQL 中,分組操作不能獨(dú)立存在,要么與 aggregation 聯(lián)合(group-by-aggregate 查詢),要么根叉積操作聯(lián)合(JOIN 操作)。需要注意的是,Pig Latin 的嵌套式數(shù)據(jù)模型是 COGROUP 能獨(dú)立存在的根本原因。它將所有輸入的元組按照一定的規(guī)則進(jìn)行分組,然后存入嵌套 bags 中。這類(lèi)原語(yǔ)不可能在 SQL 中出現(xiàn),原因是它的數(shù)據(jù)模型是扁平化的,不允許嵌套。當(dāng)然,嵌套數(shù)據(jù)可能會(huì)引起執(zhí)行效率的問(wèn)題,對(duì)這一點(diǎn),在后面進(jìn)行詳細(xì)說(shuō)明。單數(shù)據(jù)集 COGROUP:GROUPGROUP 是 COGROUP 在單一輸入數(shù)據(jù)集上的特例。這種情況就直接

26、使用關(guān)鍵字 GROUP,繼續(xù)上邊的例子,假如我們想統(tǒng)計(jì)每個(gè)查詢串帶來(lái)的總體廣告收入(一個(gè)典型的 group-by-aggregate 查詢),可以通過(guò)下列語(yǔ)句完成:PIG LATIN 中的 JOIN上邊通過(guò) COGROUP 與 JOIN 的對(duì)比,體現(xiàn)了 COGROUP 的靈活性,但是,并不是所有的用戶都需要這種靈活性,很多情況下,只需要一個(gè)簡(jiǎn)單的等價(jià)連接就可以滿足用戶要求。因此,Pig Latin 通過(guò)關(guān)鍵字 JOIN 為用戶提供了等價(jià)連接命令,舉例如下:事實(shí)上,JOIN 在語(yǔ)義上與 COGROUP 后接 flattening 是等價(jià)的,因此上邊 JOIN命令可以改寫(xiě)為如下等價(jià)命令:PIG L

27、ATIN 中的 MAP-REDUCE在 Pig Latin 中 map-reduce 不再作為一個(gè)編程模型而存在,它們實(shí)際上以及成為了 Pig Latin 的 UDFs。map 函數(shù)每次對(duì)一個(gè)輸入元組進(jìn)行操作,輸出一個(gè)bag,該 bag 包含一組 key-value,而 reduce 函數(shù)每次對(duì)一個(gè) key 關(guān)聯(lián)的一組values 進(jìn)行操作,產(chǎn)生最后的結(jié)果。舉例如下:第一行語(yǔ)句對(duì)輸入數(shù)據(jù)集的每個(gè)元組應(yīng)用 map 操作(這里的*號(hào)與 SQL 中意義相同,表示輸入元組的每個(gè)字段都傳入 map),然后對(duì) map 輸出扁平化處理,產(chǎn)生一組 key-value 對(duì)。存存儲(chǔ)儲(chǔ)命命令令 :STORE用戶可以

28、通過(guò)該命令將 Pig Latin 表達(dá)式序列結(jié)果序列化到一個(gè)具體的文件,具體命令如下:該例采用了一個(gè)定制化函數(shù) myStore()完成具體的序列化功能。也可以省略USING 短語(yǔ),這是系統(tǒng)會(huì)默認(rèn)使用一個(gè)基于空格分隔的純文本文件序列化函數(shù),系統(tǒng)還提供了內(nèi)置的序列化和去序列化函數(shù),支持 LOAD/STORE 任意嵌套數(shù)據(jù)。類(lèi)類(lèi) SQL 命命令令Pig Latin 有很多類(lèi)似于 SQL 的命令,分別為: UNION:返回兩個(gè)或者多個(gè) bags 的聯(lián)合體。 CROSS:返回兩個(gè)或者多個(gè) bags 的叉積。 ORDER:按照某些字段對(duì)一個(gè) bag 進(jìn)行排序。 DISTINCT:實(shí)現(xiàn)一個(gè) bag 中的元組

29、去重,實(shí)際上,該命令是首先按照一個(gè) bag 的所有字段進(jìn)行分組聚集,然后進(jìn)行投影的簡(jiǎn)化表示。PIG LATIN 實(shí)實(shí)現(xiàn)現(xiàn)Pig Latin 的實(shí)現(xiàn)系統(tǒng)叫做 Pig,它的架構(gòu)目標(biāo)是高擴(kuò)展性,允許不同系統(tǒng)以插件的方式作為 Pig Latin 的執(zhí)行平臺(tái)。目前的實(shí)現(xiàn),使用 Hadoop 作為執(zhí)行平臺(tái),Hadoop 是一個(gè)開(kāi)源可擴(kuò)展的 map-reduce 實(shí)現(xiàn),Pig Latin 程序被編譯為map-reduce 作業(yè),然后在 hadoop 執(zhí)行。下面具體介紹設(shè)計(jì)上的三個(gè)關(guān)鍵技術(shù)。構(gòu)構(gòu)建建邏邏輯輯執(zhí)執(zhí)行行計(jì)計(jì)劃劃客戶端提交 Pig Latin 命令后,首先由 Pig 解釋器對(duì)命令進(jìn)行分析,檢驗(yàn)輸入文

30、件和語(yǔ)句中出現(xiàn)的 bags 的有效性。例如,c=COGROUP a BY .,b BY .命令,Pig 會(huì)檢驗(yàn) a 和 b 兩個(gè) bags 已經(jīng)被定義,邏輯計(jì)劃的構(gòu)建過(guò)程具有遞歸性和依賴性,以上例進(jìn)行說(shuō)明,c 的邏輯計(jì)劃要依賴于 a 和 b 的邏輯計(jì)劃,因此只有當(dāng) a 的邏輯計(jì)劃和 b 的邏輯計(jì)劃構(gòu)建完畢才能構(gòu)建 c 的邏輯計(jì)劃。所有邏輯計(jì)劃,只是一個(gè)處理流程,而沒(méi)有任何處理過(guò)程發(fā)生,處理過(guò)程是在調(diào)用 STORE 之后發(fā)生的。調(diào)用 STORE 之后,邏輯計(jì)劃就被編譯成具體的執(zhí)行計(jì)劃并被調(diào)度執(zhí)行。這種懶惰執(zhí)行方式有很多好處,比如允許內(nèi)存管道,再比如跨多個(gè) Pig Latin 命令的重定序。Pig

31、 系統(tǒng)采用預(yù)處理與處理分離的架構(gòu),即程序的分析,邏輯計(jì)劃的生成獨(dú)立于執(zhí)行平臺(tái)。只有邏輯計(jì)劃被編譯為具體的執(zhí)行計(jì)劃時(shí)才依賴于具體的執(zhí)行平臺(tái)。目前,Pig 采用比較成熟的開(kāi)源 map-reduce 實(shí)現(xiàn) hadoop 作為執(zhí)行平臺(tái)。這種分離體系結(jié)構(gòu),有助于系統(tǒng)的發(fā)展。MAP-REDUCE 計(jì)計(jì)劃劃的的生生成成圖 3 MAP-REDUCE 計(jì)劃Pig Latin 邏輯計(jì)劃到具體的 MAP-REDUCE 執(zhí)行計(jì)劃的編譯過(guò)程遵循 MAP-REDUCE 處理模式的本質(zhì)特點(diǎn),MAP-REDUCE 處理模式本質(zhì)上具有大規(guī)模分組聚集的能力,即 map 任務(wù)通過(guò)指派 keys 對(duì)數(shù)據(jù)進(jìn)行分組,reduce 任務(wù)每

32、次處理一個(gè)組的數(shù)據(jù)。Pig 編譯器遵循這種特點(diǎn)將邏輯計(jì)劃中每個(gè) COGROUP 命令轉(zhuǎn)化為一個(gè)不同的 map-reduce 作業(yè)。如圖 3 所示。與 COGROUP 命令 C 相關(guān)聯(lián)的 map 函數(shù)首先根據(jù) C 中的 BY 短語(yǔ)將 keys 指派為相應(yīng)的元組,而 reduce 最初不進(jìn)行任何操作。這樣每個(gè) COGROUP 命令就成為兩個(gè)不同的 map-reduce 任務(wù)的界限。第一個(gè) COGROUP 命令 C1的命令都由C1對(duì)應(yīng)的 map 函數(shù)處理,如圖 3 所示。記第 i 個(gè) COGROUP 命令為 Ci,則在 Ci與 Ci+1之間的命令序列要么(a)由 Ci的 reduce 函數(shù)處理,要么

33、(b)由 Ci+1的 map 函數(shù)處理??紤] grouping 后常跟 aggregation,Pig 選擇方案(a),認(rèn)為這種方案有利于減少不同 map-reduce 作業(yè)之間序列化的數(shù)據(jù)量。當(dāng) COGROUP 操作的輸入為多數(shù)據(jù)集時(shí),map 函數(shù)會(huì)為每個(gè)元組附加一個(gè)字段以標(biāo)識(shí)元組是源于哪個(gè)數(shù)據(jù)集。相應(yīng)的 reduce 函數(shù)對(duì)該信息進(jìn)行解碼,利用該信息將元組插入到適當(dāng)?shù)奈恢?。LOAD 的并行性通過(guò) HDFS 實(shí)現(xiàn)(文件存儲(chǔ)在 HDFS 上)。對(duì)于一個(gè) map-reduce 作業(yè),多個(gè) map 和 reduce 運(yùn)行實(shí)例是并行的,從而可以實(shí)現(xiàn) FILTER 和FOREACH 操作的自動(dòng)并行化。多個(gè) map 實(shí)例產(chǎn)生的輸出按照一定的劃分規(guī)則劃分為不同部分,每個(gè)對(duì)應(yīng)一個(gè) reduce 實(shí)例,它們以并行化方式執(zhí)行,從而實(shí)現(xiàn)了(CO)GROUP 的并行性。ORDER 命令被編譯為兩個(gè) map-reduce 作業(yè)。第一個(gè)作業(yè)通過(guò)對(duì)輸入進(jìn)行取樣來(lái)確定排序

溫馨提示

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

評(píng)論

0/150

提交評(píng)論