Hadoop系列之三:函数式编程语言和MapReduce
生活随笔
收集整理的這篇文章主要介紹了
Hadoop系列之三:函数式编程语言和MapReduce
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、MapReduce和大數據問題
海量數據并行處理的核心思想無非是將一個較大的問題進行“分割包圍、逐個殲滅”。然而其難點和關鍵點在于如何將一個大的問題分分割成多個可以分別在不同的CPU上或不同的主機上進行處理的獨立小問題,而且這些獨立進行處理的小問題所產生的中間結果又該如何合并成最終結果并予以輸出。因此,看似簡單的化整為零的處理思想卻不得不面臨如下的難題:(1) 如何將大問題分割為小任務?進一步地,如何將大問題分解為可以并行處理的小任務? (2) 如何將分解好的小任務派送給分布式系統中的某主機且是較為適合解決此問題的主機上的worker(進程)完成處理? (3) 如何保證某worker獲取所需的數據? (4) 如何協調不同worker之間進行同步? (5) 如何將某worker的部分結果共享給其它需要此結果的worker? (6) 如何在出現軟件或硬件故障時仍然能保證上述工作的順利進行? 在傳統的并行或分布式編程模型中,程序員不得不顯式地解決上述的部分甚至是全部問題,而在共享內存編程中,程序員需要顯式地協調對共享數據結構的如互斥鎖的訪問、顯式地通過柵(barrier)等設備解決進程同步問題,并且要時刻警惕著程序中可能出現的死鎖或競爭條件。雖然有些編程語言也或多或少地規避了讓程序員面對上述問題,但卻也避免不了將資源分配給各worker的問題。MapReduce的優勢之一便是有效地向程序員隱藏了這些問題。 2、函數式編譯語言 MapReduce是一種類似于Lisp或ML的函數式編程語言。函數式編程的核心特性之一是基于高階函數完成程序開發,高階函數是能夠接受其它函數作為參數的函數,map和fold是兩個著名的高階函數。 如圖所示,給定一個列表,map(接受一個參數)以函數f為其參數并將其應用于列表中的所有元素,其執行結束后生成一個新的列表;fold(接受兩個參數)以函數g和一個初始值作為參數,然后將函數g應用于初始值和列表中的第一個元素,執行結果放置于中間變量中。中間變量和第二個元素將作為g函數下一次應用時的參數,而后如此操作直至將列表中的所有元素處理完畢,最后,fold返回中間變量的最終結果。map函數與fold函數通常要聯合起來使用,由map函數完成第一階段的數據轉換操作,而后由fold完成數據聚合操作。 于是,基于上述過程,我們可以把map視作利用f函數將給定數據集完成形式轉換的操作,同樣地,fold就可以被看作利用g函數完成數據聚合的操作。由此可以得知,各函數式程序在運行時彼此間是隔離的,從而,在map中將f函數應用于列表中每一個元素的操作可以并行進行,甚至這些操作可以分布于集群中的不同節點上并行執行。然而,受限于數據的本地性,fold操作需要等到列表中的每一個元素都準備停當(即所有map執行完成并生成結果)并可由函數g訪問之后才能進行。不過,好在現實生活中的應用程序并不要求一個g函數應用于列表中的所有元素,因此,要處理的列表中元素也可以被分為多個邏輯組,并將fold操作并行地應用在這些邏輯組上。此外,兩個階段的隔離進行也意味著fold并行執行的子任務個數未必與map并行執行的子任務個數相同。 上述過程也是MapReduce的工作過程的一個簡單描述。MapReduce有兩個最常用地內置高階函數map和reduce,其map就類似于上述過程中的map操作,reduce對應于上述過程中的fold操作。只不過,MapReduce的執行框架能自行協調map與reduce并將其應用于在商業服務器硬件平臺上并行處理海量數據。 更為精確地說,MapReduce有三個相互關聯卻各不相同的概念。首先,MapReduce是一個如上所述的函數式編程語言。其次,MapReduce也是一個運行框架,它能夠協調運行基于MapReduce思想開發的程序。最后,MapReduce還可以被看作編程模型和執行框架的實現,例如Google的專有實現和另一個開源實現Hadoop中的MapReduce組件。 于是,部署應用MapReduce意味著這樣的過程:在現有的多個節點上部署完成MapReduce軟件(即MapReduce的實現)并啟動集群服務,便準備好了一個MapReduce程序運行環境(即運行框架),此時只需要將用戶開發的MapReduce程序(基于MapReduce函數式編程語言API開發)及其要處理的數據提交給MapReduce運行環境即可完成數據處理過程。因此,處理數據是由用戶自己開發的MapReduce程序完成,而非運行的MapReduce集群服務。簡單來講,用戶開發的MapReduce程序其實就是包含了類似上述的f函數和g函數的程序,只不過,在MapReduce中,它們分別被稱作mapper和reducer。 參考文獻: Data-Intensive Text Processing with MapReduce
轉載于:https://blog.51cto.com/mageedu/1106172
總結
以上是生活随笔為你收集整理的Hadoop系列之三:函数式编程语言和MapReduce的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2012年最后一天,终于盼到公司发报卡了
- 下一篇: Sockets programming