2022-11-17
計算 數據 分布式 mapreduce
為什么要學習MapReduce
2004年,谷歌發表了一篇名為《MapReduce》的論文,主要介紹了如何在分布式的存儲系統上對數據進行高效率的計算。2005年,Nutch團隊使用Java語言實現了這個技術,并命名為MapReduce。時至今日,MapReduce是Apache Hadoop的核心模塊之一,是運行在HDFS上的分布式運算程序的編程框架,用于大規模數據集(大于1TB)的并行運算。其中的概念,"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式編程語言里借來的,還有從矢量編程語言里借來的特性。
在過去的很長一段時間里,CPU的性能都會遵循”摩爾定律“,在性能上每隔18個月左右就是提高一倍。那個時候,不需要對程序做任何改變,僅僅通過使用更優秀的CPU,就可以進行性能提升。但是現在,在CPU性能提升的道路上,人類已經到達了制作工藝的瓶頸,因此,我們不能再把希望寄托在性能更高的CPU身上了。
現在這個時候,大規模數據存儲在分布式文件系統上,人們也開始采用分布式并行編程來提高程序的性能。分布式程序運行在大規模計算機集群上,集群是大量的廉價服務器,可以并行執行大規模數據處理任務,這樣就獲得了海量的計算能力
分布式并行編程比傳統的程序有明顯的區別,它運行在大量計算機構成的集群上,可以充分利用集群的并行處理能力;同時,通過向集群中增加新的計算節點,就可以很容易的實現集群計算能力的擴展。
MapReduce主要解決的是分布式文件存儲系統上,數據的分布式計算的問題。在上述導讀部分我們介紹過一個WordCount的案例,就是一個非常典型的分布式計算的案例。如果我們將所有的需要處理的數據移動到一個節點上進行處理,那么只是在數據傳輸的過程中就得消耗大量的時間,而且還可能在一臺節點存不下這大量的數據。就算是能夠存儲下,也能夠接受數據移動所帶來的時間消耗,集群中其他節點的計算資源也都是在閑置的,不能高效率的利用集群。
因此我們就需要進行分布式的計算,將計算程序分發給不同的節點。在每一個節點上處理自己節點的數據,最后將每一個節點的數據處理結果匯總在一起。而在分布式計算的過程中會遇到很多的分布式計算的細節問題,這些問題都是需要開發人員去考慮的。那么如何去解決這些問題呢?
MapReduce是一個開源的、分布式的計算框架,封裝了分布式計算程序的實現細節,使得開發人員不需要了解分布式計算底層實現的情況下,就可以去開發一個分布式的計算程序。開發人員只需要將重心放在業務邏輯的實現即可,不需要關注分布式開發的底層細節。因此,對于開發人員來說,可以簡化不少的工作量,提交程序開發的效率!
MapReduce的核心思想
MapReduce設計的一個理念是“計算向數據靠攏”(移動計算),而不是“數據向計算靠攏”(移動數據)
將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序,移動到有數據存儲的集群節點上,一是可以減少節點間的數據移動開銷。二是在存儲節點上可以并行計算,大大提高計算效率問題。 因為移動數據需要大量的網絡傳輸開銷,尤其是在大規模數據環境下,這種開銷尤為驚人,所以移動計算要比移動數據更加經濟。
MapReduce一個完整的運算分為Map和Reduce兩個部分。Map會處理本節點的原始數據,產生的數據會臨時存儲到本地磁盤。Reduce會跨節點fetch屬于自己的數據,并進行處理,產生的數據會存儲到HDFS上。
Hadoop的MapReduce核心技術起源于谷歌在2004年發表的關于MapReduce系統的論文介紹。論文中有這么一句話:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。這句話提到了MapReduce思想來源,大致意思是,MapReduce的靈感來源于函數式語言(比如Lisp)中的內置函數map(映射)和reduce(規約)。
簡單來說,在函數式語言里,map表示對一個列表(List)中的每個元素做計算,reduce表示對一個列表中的每個元素做迭代計算。它們具體的計算是通過傳入的函數來實現的,map和reduce提供的是計算的框架。我們想一下,reduce既然能做迭代計算,那就表示列表中的元素是相關的(比如我想對列表中的所有元素做相加求和,那么列表中至少都應該是數值吧)。而map是對列表中每個元素做單獨處理的,這表示列表中可以是雜亂無章的數據。
這樣看來,就有點聯系了。在MapReduce里,Map處理的是原始數據,自然是雜亂無章的,每條數據之間互相沒有關系;到了Reduce階段,數據是以key后面跟著若干個value來組織的,這些value有相關性,至少它們都在一個key下面,于是就符合函數式語言里map和reduce的基本思想了。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號