不用Java進(jìn)行MapReduce編程
替代手段
MapReduce的并行處理模式給自己增添了各種問題。雖然Java常用于MapReduce程序,你不見得非要成為Java專家才能享受到Hadoop上MapReduce的好處。
三種
MapReduce開發(fā)的替代方法包括Pig, streaming MapReduce和域特定語言,比如Scalding。
Pig是一種Hadoop下不借助Java而處理大數(shù)據(jù)的平臺(tái)。Pig,它是Apache Hadoop項(xiàng)目的產(chǎn)品,用Pig Latin寫的MapReduce模型的maps腳本。Pig Latin是一種聲明性編程語言,用于大型數(shù)據(jù)集。如果你很熟悉SQL或ETL工具,那么PIG Latin對(duì)你來學(xué)簡(jiǎn)單易學(xué)。PIG Latin不是像Java,Python或C這樣的通用編程語言。你不會(huì)用它來寫復(fù)發(fā)的程序邏輯,但它非常適合于數(shù)據(jù)處理任務(wù)。
Pig Latin的功能大致可分為三個(gè)部分:加載數(shù)據(jù),處理數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)。
基本的數(shù)據(jù)加載命令可以用于結(jié)構(gòu)化數(shù)據(jù),比如制表符分隔的文件,以及非結(jié)構(gòu)化數(shù)據(jù),比如自然語言文本文件。加載命令可以用于壓縮文件,省去了你加載前的解壓工作。
一旦數(shù)據(jù)被載入Pig schemas,你就可以進(jìn)行數(shù)據(jù)轉(zhuǎn)換了。Pig Latin有關(guān)系和算數(shù)運(yùn)算。你可以使用SQL構(gòu)造,比如FILTER,GROUP和JOIN。 由于這種語言是專為大數(shù)據(jù)而設(shè)計(jì)的,因此這里有傳統(tǒng)的SQL里沒有的東西。例如,SAMPLE命令是用來隨機(jī)選擇一個(gè)數(shù)據(jù)集的子集;對(duì)大數(shù)據(jù)集樣本的計(jì)算統(tǒng)計(jì)十分有用。算術(shù)和邏輯運(yùn)算符包括了你要的功能:算數(shù)運(yùn)算,boolean和類型轉(zhuǎn)換。
你在加載數(shù)據(jù)并開始處理時(shí),你肯定想把結(jié)果存在某處。Pig Latin支持向Hadoop文件系統(tǒng)保存結(jié)果或直接交互式顯示的功能。(平臺(tái)的名字取的字面意思太明顯了,Pig交互工具叫做Grunt——類似豬的叫聲。)
Pig是處理大量數(shù)據(jù)的理想選擇,經(jīng)常是在你開始分析數(shù)據(jù)或合并多個(gè)數(shù)據(jù)集時(shí)。如果你還需要實(shí)現(xiàn)更復(fù)雜的邏輯,你應(yīng)該考慮一下streaming MapReduce或Scalding。#p#
Streaming MapReduce 與 Scalding: 取代Java
Streaming MapReduce是Hadoop的一個(gè)功能,可以讓你運(yùn)行MapReduce環(huán)境下幾乎用任何語言編寫的程序。
如果你使用命令行來執(zhí)行一個(gè)程序,而且它以標(biāo)準(zhǔn)輸入輸出流來進(jìn)行交互的,那么你就可以使用streaming MapReduce來運(yùn)行它。這種可以運(yùn)行任何語言編寫的程序的能力是有代價(jià)的:你必須把你的程序制定成映射或化簡(jiǎn)程序。
映射程序接受一個(gè)輸入數(shù)據(jù)流,并產(chǎn)生鍵值對(duì)形式的輸出。例如,如果你想要計(jì)算每種產(chǎn)品被購(gòu)買的次數(shù),你可以用Python寫一個(gè)映射函數(shù),讀取交易并輸出產(chǎn)品ID和那筆交易中該產(chǎn)品賣出的數(shù)量。當(dāng)然,這會(huì)產(chǎn)生一個(gè)你需要合計(jì)的“產(chǎn)品ID—數(shù)量”鍵值對(duì)的流。這是化簡(jiǎn)函數(shù)的工作。
底層MapReduce框架會(huì)將運(yùn)行映射功能的所有實(shí)例排序,如此一來一個(gè)特定產(chǎn)品ID的數(shù)據(jù)就會(huì)送往同樣的化簡(jiǎn)實(shí)例。這種情況下的化簡(jiǎn)程序是一個(gè)簡(jiǎn)單的程序,只是添加與產(chǎn)品ID有關(guān)的產(chǎn)品數(shù)量。最終的輸出是一個(gè)產(chǎn)品ID和總銷售量的列表。
這種函數(shù)式編程要花一些時(shí)間來習(xí)慣,不過一旦你掌握了一些模式以后,你可以隨時(shí)將你所學(xué)到的技術(shù)應(yīng)用于更廣泛的問題中。雖然你不用學(xué)Java就能用streaming MapReduce,但如果你用Pig的話,你會(huì)更頻繁的使用到MapReduce范式。如果你需要實(shí)現(xiàn)的業(yè)務(wù)邏輯不太適用于Pig Latin,那么streaming MapReduce是一個(gè)不錯(cuò)的選擇。
Pig和streaming MapReduce都是Apache Hadoop項(xiàng)目下的產(chǎn)品,但是還有一些為MapReduce而開發(fā)的工具。例如Cascading項(xiàng)目創(chuàng)建了一個(gè)隱藏MapReduce實(shí)現(xiàn)細(xì)節(jié)的抽象層。這個(gè)抽象層是作為一個(gè)Java API實(shí)現(xiàn)的,因此Cascading自身還有對(duì)Java編程的需要。但是,這個(gè)API可以被使用Java虛擬機(jī)的其他語言調(diào)用,比如Groovy,Clojure,JRuby 和 JPython。
如果你喜歡Scala這種編程語言,它也使用Java虛擬機(jī),那么你可以使用Scalding,一個(gè)用于Cascading的Scala API。Scalding是由Twitter開發(fā)的,并以開放源代碼的方式發(fā)布。Scalding是一種域特定語言,可以讓你寫出類似于Pig腳本上對(duì)數(shù)據(jù)集的迭代,過濾,分組等構(gòu)建出的代碼。
如果你用Java虛擬機(jī)語言(包括Java)但不想花太多時(shí)間浪費(fèi)在重復(fù)編寫代碼上,Cascading和Scalding是不錯(cuò)的選擇。這些域特定語言可以處理日常任務(wù),這樣你就可以專注在你程序的邏輯上。
MapReduce和Hadoop也許就是你某些數(shù)據(jù)處理和分析任務(wù)的絕佳工具。如果你還因?yàn)榭赡苄枰玫絁ava而猶豫要不要使用MapReduce,那你就不需要再等了。Pig可以很好的用于我們平時(shí)常見的提取,轉(zhuǎn)換和加載操作等基本數(shù)據(jù)處理任務(wù)。Streaming MapReduce可以讓程序員繼續(xù)以他們熟悉的語言進(jìn)行工作,同時(shí)還能從MapReduce中受益。Cascading 和 Scalding 讓開發(fā)人員在Java虛擬機(jī)語言下工作,同時(shí)還能在以Java直接編寫MapReduce函數(shù)時(shí)引入一個(gè)更高級(jí)的抽象層。
如果你想在Hadoop利用MapReduce,你可以用以上這些作為Java的替代手段。