hadoop主要由三方面組成:
一、HDFS
二、MapReduce
三、Hbase多線程
Hadoop框架中最核心的設計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所說起而被廣爲流傳的, 簡單的一句話解釋MapReduce就是「任務的分解與結果的彙總」。HDFS是Hadoop分佈式文件系統(Hadoop Distributed File System)的縮寫 ,爲分佈式計算存儲提供了底層支持。app
MapReduce從它名字上來看就大體能夠看出個原因,兩個動詞Map和Reduce,「Map(展開)」就是將一個任務分解成爲多個任 務,「Reduce」就是將分解後多任務處理的結果彙總起來,得出最後的分析結果。這不是什麼新思想,其實在前面提到的多線程,多任務的設計就能夠找到這 種思想的影子。不管是現實社會,仍是在程序設計中,一項工做每每能夠被拆分紅爲多個任務,任務之間的關係能夠分爲兩種:一種是不相關的任務,能夠並行執 行;另外一種是任務之間有相互的依賴,前後順序不可以顛倒,這類任務是沒法並行處理的。回到大學時期,教授上課時讓你們去分析關鍵路徑,無非就是找最省時的 任務分解執行方式。在分佈式系統中,機器集羣就能夠看做硬件資源池,將並行的任務拆分,而後交由每個空閒機器資源去處理,可以極大地提升計算效率,同時 這種資源無關性,對於計算集羣的擴展無疑提供了最好的設計保證。(其實我一直認爲Hadoop的卡通圖標不該該是一個小象,應該是螞蟻,分佈式計算就比如 螞蟻吃大象,廉價的機器羣能夠匹敵任何高性能的計算機,縱向擴展的曲線始終敵不過橫向擴展的斜線)。任務分解處理之後,那就須要將處理之後的結果再彙總起 來,這就是Reduce要作的工做。框架
下面這個圖很經典:分佈式
上圖中展示了整個HDFS三個重要角色:NameNode、DataNode和 Client。NameNode能夠看做是分佈式文件系統中的管理者,主要負責管理文件系統的命名空間、集羣配置信息和存儲塊的複製等。NameNode 會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每個文件對應的文件塊的信息和每個文件塊在DataNode的信息等。 DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data,同時週期性地將全部存在的 Block信息發送給NameNode。Client就是須要獲取分佈式文件系統文件的應用程序。這裏經過三個操做來講明他們之間的交互關係。
文件寫入:
a):Client向NameNode發起文件寫入的請求。
b):NameNode根據文件大小和文件塊配置狀況,返回給Client它所管理部分DataNode的信息。
c):Client將文件劃分爲多個Block,根據DataNode的地址信息,按順序寫入到每個DataNode塊中。
文件讀取:
a):Client向NameNode發起文件讀取的請求。
b):NameNode返回文件存儲的DataNode的信息。
c):Client讀取文件信息。
文件Block複製:
a):NameNode發現部分文件的Block不符合最小複製數或者部分DataNode失效。
b):通知DataNode相互複製Block。
c):DataNode開始直接相互複製.oop
下面綜合MapReduce和HDFS來看Hadoop的結構:性能
Hadoop結構示意圖spa
在Hadoop的系統中,會有一臺Master,主要負責NameNode的工做以及JobTracker的工做。JobTracker的主要職責 就是啓動、跟蹤和調度各個Slave的任務執行。還會有多臺Slave,每一臺Slave一般具備DataNode的功能並負責TaskTracker的 工做。TaskTracker根據應用要求來結合本地數據執行Map任務以及Reduce任務。線程
把本身平時工做當中的代碼貼出來解釋下可能會更好的理解:設計
FileInputFormat.setInputPaths(tempJob, hdfsHome); // 把本地的文件讀入到HDFS中
LOG.info(tempJobName + " data start .....");
tempJob.setJarByClass(tempMain.class); //設置這個Job運行是那個類
tempJob.setMapperClass(MultithreadedMapper.class); //設置這個job運行的map,這裏面使用了自己map自帶的多線程實 現機制,這一點很重要,能夠幫助咱們提升運行的效率。
MultithreadedMapper.setMapperClass(tempJob,tempMapper.class); //設置這個job運行的map
MultithreadedMapper.setNumberOfThreads(tempJob, Integer.parseInt(tempThread));//設置多線程運行幾個線程
tempJob.setMapOutputKeyClass(LongWritable.class);// 設置map所輸出的key
tempJob.setMapOutputValueClass(StringArrayWritable.class); // 設置map所輸出的value
...... //下面還有reduce的一些,我這裏的業務沒有涉及到,這裏就不列出來了。
long start = System.currentTimeMillis();
boolean result = tempJob.waitForCompletion(true); //啓動一個job運行
long end = System.currentTimeMillis();orm