hadoop知識點總結(一)hadoop架構以及mapreduce工作機制
1,為什麼需要hadoop
資料分析者面臨的問題
資料日趨龐大,讀寫都出現效能瓶頸;
使用者的應用和分析結果,對實時性和響應時間要求越來越高;
使用的模型越來越複雜,計算量指數級上升。
期待的解決方案
解決效能瓶頸,在可見的未來不會出現新瓶頸之前的技術可以平穩過渡,如SQL;
轉移成本,如軟硬體成本,開發成本,技能培養成本,維護成本
2,關係型資料庫和MapReduce的比較:
傳統關係型資料庫 |
MapReduce |
|
資料大小 |
GB |
PB |
訪問 |
互動式和批處理 |
批處理 |
更新 |
多次讀寫 |
一次寫入多次讀寫 |
結構 |
靜態模式 |
動態模式 |
完整性 |
低 |
高 |
橫向擴充套件 |
非線性 |
線性 |
3,Hadoop 的優勢與特點:
(1)Hadoop基於Java開發,為應用程式提供一組穩定可靠的API介面,實現具有高可靠性和良好擴充套件性的分散式系統,運行於大量廉價硬體裝置組成的集群系統上。
(2)分散式檔案系統(HDFS):針對大規模資料的高容錯性和高吞吐的分散式檔案系統;它可以構建從幾臺到幾千臺由常規伺服器組成的叢集中,並提供高聚合輸入輸出的檔案讀寫訪問。
(3)平行計算框架(MapReduce):適用於大資料量處理的分散式框架,是為離線資料分析而設計,利用資料的並行性進行分佈運算,而後彙總結果的計算框架。
(4)NameNode是一箇中心伺服器,負責管理檔案系統的namespace和客戶端對檔案的訪問;Datanode在叢集中會有多個,一般是一個節點存在一個,負責管理其自身節點上它們附帶的儲存。在內部,一個大檔案分成一個或多個block,這些block儲存在Datanode集合裡。Namenode執行檔案系統的namespace相關操作,例如開啟、關閉、重新命名檔案和目錄,同時決定了Block到具體Datanode節點的對映。Datanode在Namenode的指揮下進行block的建立、刪除和複製工作。
單一節點的Namenode大大簡化了系統的架構。Namenode負責保管和管理所有的HDFS元資料,因而在請求Namenode得到檔案的位置後就不需要通過Namenode參與而直接從Datanode進行。
(5)分散式資料庫(HBase):是一個分散式的、按列儲存的、多維表結構的實時分散式資料庫,它可以提供大資料量架構化和非結構化資料高速讀寫操作,為高速線上資料服務而設計。
支援每秒數萬條級別的高速併發寫入和高速查詢;可擴充套件,資料自動切分和分佈,可動態擴容,無需停機;資料存放在HDFS檔案系統上,不會丟失;靈活的表結構,可動態增加或改變;面向列,可壓縮,有效降低磁碟I/O,提高磁碟利用率。多維表,四個維度,其中三個維度可變,適合描述複雜巢狀關係。
(6)平行計算框架(MapReduce):適用於大資料量處理的分散式框架,是為離線資料分析而設計,利用資料的並行性進行分佈運算,而後彙總結果的計算框架。
將任務拆分、分佈、彙總,開發人員只需要實現業務邏輯;分佈任務自動失敗重試,單個任務失敗不會造成整個任務退出;和HDFS整合,使計算移到資料所在的節點執行。...
4,hadoop體系下的分析手段
主流:Java 程式
輕量級的指令碼語言:Pig
SQL技巧平穩:Hive
NoSQL:Hbase
5,hadoop的定義
Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺(框架)——Nutch
包含HDFS和MapReduce兩大核心模組
為使用者提供系統底層細節透明的分散式基礎架構。
6,hadoop專案結構
7,hadoop各個節點角色的劃分:
1)hadoop1.x
Hadoop角度:Master(主結點)和Slave(從結點)
HDFS角度:NameNode和DataNode
MapReduce角度:JobTracker和TaskTracker
2)hadoop 2.x
HDFS角度:NameNode和DataNode
YARN角度:nodemanager和ResourceManager
8,nameNode和dataNode的特點及作用,(詳細可以參考我的另外一篇文章)
1)NameNode
作用——HDFS的守護程式;記錄檔案如何分割成資料塊的,以及這些資料塊被儲存到哪些節
點上;對記憶體和I/O進行集中管理,負責檔案元資料的操作.Namenode是主節點,儲存
檔案的元資料如檔名,檔案目錄結構,檔案屬性(生成時間,副本數,檔案許可權)
以及每個檔案的塊列表,以及塊所在的DataNode等等。
特點——單點(一個叢集只有唯一一個NameNode),因此發生故障將使叢集崩潰.
2)DataNode
介紹:-----Datanode是檔案系統的工作節點,他們根據客戶端或者是namenode的排程儲存和檢
索資料,並且定期向namenode傳送他們所儲存的塊(block)的列表。
作用----- 負責把HDFS資料庫讀寫到本地檔案系統,提供真實檔案資料的儲存服務。
特點:——多點(一個叢集可以有多個datanode),因此發生故障將使叢集崩潰.
9。SecondaryNamenode介紹
監控HDFS狀態的輔助後臺程式
每個叢集可以有一個或多個
與NameNode進行通訊,定期儲存HDFS元資料快照
當NameNode故障可以作為備用NameNode 使用
JobTracker介紹
用於處理作業(使用者提交程式碼)的後臺程式
決定有哪些檔案參與處理,然後切割task並分配節點
監控task,重啟失敗的task
每個叢集只有唯一一個JobTracker,位於Master節點
TaskTracker介紹
位於slave節點上,與DataNode結合(程式碼與資料一起)
管理各自節點由JobTracker分配的Task
每個節點只有一個TaskTracker,一個TaskTracker可以啟動多個JVM,來並行執行 map或reduce任務
與JobTracker互動
問題:1,什麼是Hadoop,你理解中的Hadoop是什麼,請舉例說明?
2,請闡述Hadoop架構中各個程序的作用?
MapReduce程式設計模型:
在Hadoop中,每一個MapReduce任務都被初始化為一個Job。
每一個Job又可以分為兩個階段:
Map:Map函式,接收一個<key,value>形式的輸入,然後產生同樣為<key,value>形式的 中間輸出;
Reduce:Reduce函式接收一個<key,value(Listof value)>形式的輸入,然後對這個value 集合進行處理並輸出結果。
10,資料預處理與輸入分片的大小
MapReduce任務擅長處理少量的大資料
若是大量的小資料,則選擇先對資料進行一次預處理,將資料合併以提高MapReduce任務 的執行效率。
或當一個Map任務執行只需幾秒時,考慮多分配些資料,讓其處理
通常,一個Map任務執行60秒左右是比較合適的
11, Map和Reduce任務的數量
Map/Reduce任務槽:這個叢集能夠同時執行的Map/Reduce任務的最大數量。
任務槽幫助對任務排程進行設定。
設定Map數量主要參考Map執行的時間,設定Reduce任務的資料量參考任務槽的設定,即Reduce任務數是任務槽的0.95或1.75倍。
12,Combine函式 用於本地合併資料的函式。
作用:某些資料在本地會產生很多相同重複的資料,若此時一個一個傳遞給Reduce任務是非常耗時的;因此,MapReduce框架執行Combine函式用於本地合併,這會大大減少IO操作的消耗。合理設計該函式能有效減少網路傳輸的資料量,提高MapReduce的效率。
13, 壓縮:對Map的中間結果輸出和最終結果輸出,進行壓縮
作用:減少網路傳輸。有副作用,請根據實際情況來選擇。
14, 自定義Comparator 自定義Hadoop資料型別,以實現更加複雜的目的
作用:節省資料序列化和反序列化的時間。
MapReduce工作機制
1.JobConf常用可定製引數
引數 |
作用 |
預設值 |
其他實現 |
InputFormat |
將輸入的資料集切割成小資料集InputSplits,每一個InputSplits將由一個Mapper負責處理。此外,InputFormat提供一個RecordReader的實現,將一個InputSplits解析成<key,value>對提供給map函式 |
TextInputFormat(針對文字檔案,按行將文字檔案切割成InputSplits,並用LineRecordReader將InputSplits解析成<key,value>對,key是行在檔案中的位置,value是檔案中的一行) |
SequenceFileInputForm |
SequenceFileInputForm |
提供一個RecordWriter的實現,負責輸出最終結果 |
TextOutputFormat(用LineRecordWriter將最終結果寫成純文字檔案,每個<key,value>對一行,key和value之間用tab分隔) |
SequenceFileOutputForm |
OutputKeyClass |
輸出的最終結果中key的型別 |
LongWritable |
|
OutputValueClass |
輸出的最終結果中value的型別 |
Text |
|
MapperClass |
Mapper類,實現map函式,完成輸入的<key,value>到中間結果的對映 |
IdentityMapper(將輸入的<key,value>原封不動的輸出為中間結果) |
LongSumReducer, LogRegexMapper, InverseMapper |
CombinerClass |
實現combine函式,將中間結果中的重複key做合併 |
Null(不對中間結果中的重複key做合併) |
|
ReducerClass |
實現reduce函式,對中間結果做合併,形成最終結果 |
IdentityReducer(將中間結果直接輸出為最終結果) |
AccumulatingReducer,LongSumReducer |
InputPath |
設定Job的輸入目錄,Job執行時會處理輸入目錄下的所有檔案 |
Null |
|
OutputPath |
設定Job的輸出目錄,Job的最終結果會寫入輸出目錄之下 |
Null |
|
MapOutputKeyClass |
設定map函式輸出的中間結果中key的型別 |
如果使用者沒有設定,使用OutputKeyClass |
|
MapOutputValueClass |
設定Map函式輸出的中間結果中value的型別 |
如果使用者沒有設定,使用OutputValueClass |
|
OutputKeyComparator |
對結果中的key進行排序時,使用的比較器 |
WritableComparable |
|
PartitionerClass |
對中間結果key排序後,用Partition函式將其劃分為R份,每一份由一個Reducer負責處理。 |
HashPartitioner(使用Hash函式做partition) |
KeyFieldBasedPartitioner PipesPartitioner |
2, Hadoop執行MapReduce作業的工作原理
(1)作業的提交
作業提交後,使用者不能對作業進行修改,只能監控或強制終止;
在作業提交之前,使用者需做好所有引數的配置工作。(配置工作包括:
程式程式碼map和reduce,Map和Reduce介面的配置,配置四個引數;
Map介面的輸出型別和Reduce介面的輸入型別一致;輸入輸出路徑
必須保證輸出路徑下不存在該資料夾;其他型別設定)
(2)作業的初始化
當JobTracker接收到對其submitJob()方法的呼叫後,會把此呼叫放入一個內部的佇列中,交由作業排程器進行排程,並對其進行初始化;初始化包括建立一個表示正在執行作業的物件,封裝任務和記錄資訊,以便跟蹤任務的狀態和程序。
初始化步驟:作業排程器從HDFS中讀取已經計算好的輸入分片 資訊;
為每個分片建立一個map任務;
建立Reduce任務的數量根據輸入資料劃分資訊來設定個數;
排程器建立相應數量的要執行的Reduce任務;
任務在此時被指定ID。
(3)任務分配
TaskTracker和JobTracker之間的通訊和任務的分配是通過“心跳”機制來完成的。
(4)任務執行
通過從HDFS中把作業的JAR檔案複製到taskTracker所在的檔案系統,從而實現作業的JAR檔案本地化;
taskTracker將應用程式所需要的全部檔案從分散式快取複製到本地磁碟;
taskTracker為任務新建一個本地工作目錄,並把JAR檔案中的內容解壓到這個資料夾下;
taskTracker新建一個TaskRunner例項來執行該任務。
(5)進度和狀態的更新
當提交作業後,Hadoop會進入完全自動化的執行過程;但使用者往往需要能夠知曉作業的執行狀態;
因此,任務在執行時,對其進度(任務完成百分比)保持追蹤,對於使用者來說是非常重要的。
(6)作業的完成
當JobTracker收到作業最後一個任務已完成的通知後,便把作業的狀態設定為“成功”;
在JobClient查詢狀態時,便知道任務已成功完成,於是JobClient列印一條訊息告知使用者,然後從runJob()方法返回;
最後,JobTracker將清空作業的工作狀態,指示taskTracker也清空作業的工作狀態。
(7)失敗:在實際情況下,使用者程式碼存在軟體錯誤,程序會崩潰,機器會產生故障。
3,shuff和排序
MapReduce確保每個Reduce的輸入都按鍵排序;
系統執行排序的過程——將map輸出作為輸入傳給Reduce——稱為shuffle;
Shuffle屬於不斷被優化和改進的程式碼庫的一部分,提出它的目的只有一個——出於效率的考慮進行預排序;Shuffle是MapReduce的“心臟”,是奇蹟發生的地方
(1)Shuffle過程在Map端,對Map的結果進行劃分,排序,分割,將屬於同一個劃分的輸出,合併在一起,並寫入磁碟,按照不同的劃分將結果傳送給對應的Reduce。Map輸出的劃分與Reduce的對應關係由JobTracker確定。
(2)在寫磁碟過程中,map函式的輸出繼續被寫到緩衝區,但如果此期間緩衝區被填滿;Map任務必須等待,直到寫磁碟過程完成;寫磁碟將按輪詢方式寫到指定作業的特定子目錄中的目錄中。
(3) Shuffle過程在Reduce端分成三個階段:複製Map輸出、排序合併以及Reduce處理.
1) 複製Map輸出:Map輸出檔案位於執行Map任務的tasktracker的本地磁碟;
現在,tasktracker需要為分割槽檔案執行Reduce任務;Reduce任務需要叢集上若干個Map任務的Map輸出,作為其分割槽檔案;每個Map任務的完成時間可能不同,因此只要有一個任務完成,Reduce任務就開始複製其輸出;這就是Reduce任務的複製階段。
2) 排序合併:在Reduce複製Map的輸出結果的同時,Reduce任務進入排序合併階段;
此階段重點是合併,因為排序在map端進行;該階段的任務是將從各個MapTaskTracker上覆制的Map輸出檔案進行整合,並維持資料原來的順序.
3) Reduce處理: Reduce端的最後階段就是對合並的檔案進行Reduce處理。
4,配置的調優
在shuffle這一過程中,完成單位任務使用時間最多的一般都是IO操作;總的原則是給shuffle過程儘量多的提供記憶體空間;但一定要保證Map函式和Reduce函式能有足夠的記憶體來執行;執行Map任務和Reduce任務的JVM,記憶體大小由mapred.child.java.opts屬性來設定。
在map端,可以通過避免多次溢位寫磁碟來獲得最佳效能;通過合理的設定io.sort.*屬性來減少這種情況下的溢位寫次數;具體來說,如果可以,應增加io.sort.mb的值。
在reduce端,中間資料全部駐留在記憶體中,就能獲得最佳效能;一般,此情況是不可能發生的;若reduce函式的記憶體需求不大,可把mapred.inmem.merge.threshold設定為0,把mapred.job.reduce.input.buffer.percent設定為1.0,或更小值,則會帶來效能的提升。
相關推薦
hadoop知識點總結(一)hadoop架構以及mapreduce工作機制
1,為什麼需要hadoop 資料分析者面臨的問題 資料日趨龐大,讀寫都出現效能瓶頸; 使用者的應用和分析結果,對實時性和響應時間要求越來越高; 使用的模型越來越複雜,計算量
Hadoop知識點總結(一)
HADOOP hadoop的概念 Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力進行高速運算和儲存。 它主要有以下幾個優點: 高可靠性:Hadoop按位儲存和處理
Hadoop Core_MapReduce總結(一)
一、 分散式計算框架 MapReduce 1、產生背景 Web2.0 時代,資料爆炸式、指數級增長,大資料分散式計算需求頻繁 通過單機記憶體擴充套件來增強計算能力,已經無法承載大規模資料量的計算 分散式計算開發和維護的複雜與多變,對程式設計師要求太高
Hadoop Core_HDFS總結(一)
一、產生背景 傳統的本地檔案系統(單機式),在資料量增長過快、資料備份、資料安全性、操作使用便捷性上存在嚴重不足。 二、架構設計 2.1. 定義 HDFS(Hadoop Distributed File System)Hadoop分散式檔案系統。 2.2. 元件角色 1)Na
react native 知識點總結(一)
修改 ltp 組件 改變 set 覆蓋 sta 一個 個數 一、關於react native 版本的升級 參照文檔:http://reactnative.cn/docs/0.45/upgrading.html react-native -v
Mybatis核心知識點總結(一)
nfa 邏輯 efault Go 不常用 pojo code ive 圖片 一、初識Mybatis框架 mybatis是一個持久層的框架,是apache下的頂級項目。 mybatis托管到goolecode下,再後來托管到github下(https://github
Android知識點總結(一)
1、android:layout_weight 屬性的意義 1、權重的值指的是每個部件所佔剩餘空間的大小,該值與同級部件所佔空間大小有關。 2、例如,我們定義一個權重為 2 的 View,另一個 View 的權重是 1,那麼總數就是 3;這時第一個 View 佔據 2/3 的空間,第二個佔據
關於javaweb的“網上書店”專案知識點總結(一)
這是本人第一次寫部落格,主要記錄用java作專案的一些技術點,方便自己日後回憶。 本次java專案是傳智播客的“網上書店”專案,用的架構是 jsp + servlet +javabean,這個專案是本人的第一個專案。 以下是自己在做專案的過程中自己覺得需要注意的知識點: 一、request.
dubbo實用知識點總結(一)
1. dubbo基礎架構 架構 特性 服務提供者 服務消費者 配置可以用dubbo.properties來替換 2. 註解配置 提供方(注意:serivce註解是dubbo的service) 消費者 3. API 服務提供者 服務消費者
IOS 知識點總結(一)
###IOS執行緒講解 對於單核的處理器,可以把多個操作放到不同的執行緒,當用戶操作完UI之後其他後續任務在其他執行緒操作,當CPU空閒時繼續其他操作; 對於多核操作,操作任務可以分散到多個空閒的CPU中繼續執行; 一個核(CPU)可以有多個執行緒,但其實
[學習筆記]菜鳥教程Swift知識點總結(一)
目錄基本語法資料型別變數、常量可選型別字面量運算子 基本語法 Swift 的多行註釋可以巢狀在其他多行註釋內部。寫法是在一個多行註釋塊內插入另一個多行註釋。第二個註釋塊封閉時,後面仍然接著第一個註釋塊
Javascript知識點總結(一)
詞法結構 1、Javascript是一種區分大小的弱型別語言 2、識別符號和保留字 識別符號:變數的名字。規則:可由字母、數字、下劃線和$組成,數字不能開頭 關鍵字:Javascript語言中本身使用的名字 常見的有 var、i
Java SE基礎知識點總結(一)
沒辦法了,從頭學起。不過還是要告誡自己戒驕戒躁,沉住氣,一步一步來,打好地基才是蓋高樓最好的捷徑!又是一部長篇連載,遂分享出來,與君共享~ 編譯、執行java程式需要經過哪些主要步驟? 編寫原始碼
C/C++面試知識點總結(一)
目錄: 一、基礎知識 1.C/C++ 2.STL 6.資料庫 一、基礎知識 1.C/C++ (1).struct大小的確定 由於記憶體對齊的原則,在32位機器上,記憶體是4位元組對齊,也就是說,不
for迴圈知識點總結(一)
C++的for迴圈語句格式: for (initialization; test-expression; update-expression) body 1、關鍵字for與括號通常要有空格,函式名與括號之間通常省略空格。 2、迴圈步驟 1)設定初始值。C++中括號內初始化部
前端知識點總結(一)盒子模型你是怎麼理解的?
從今天開始打算陸陸續續寫一些前端方面的知識點總結,也方便自己鞏固和複習。如果有人能看見還幫助了你,那也是極好的hhhh。分析與解答:1.盒子模型有兩種,W3C的標盒模型和IE的怪異盒模型(1)W3C定義的標準盒模型包括margin、border、padding、content
Oracle 資料庫基礎知識點總結(一)
1.資料庫表的完整性 ①實體完整性:靠主鍵來維護,資料唯一且不能為空 ②參照完整性:靠外來鍵來維護,主鍵表無記錄外見表則無法操作資料 ③域完整性:check()約束 not null 約
【軟考篇】--軟考知識點總結(一)
軟考到現在準備工作也做的差不多了,在做選擇題的過程中,發現了一些自己的薄弱點,總是愛出錯的幾個點, 這裡稍微進行一下總結。 編譯程式和解釋程式 編譯程式
面經知識點總結(一)
目錄 1、$(document).ready和window.onload的區別 前者是DOM樹載入完畢就執行,不必等待頁面中圖片或其他外部檔案都載入完畢,並且可以寫多個ready 後者是頁面所有元素都載入完畢,包括圖片等所有元素,並且只能執行
python高階知識點總結(一)
一、什麼是檢視?-- 通俗的講,檢視就是一條SELECT語句執行後返回的結果集。-- 所以我們在建立檢視的時候,主要的工作就落在建立這條SQL查詢語句上。-- 檢視的特點-- 檢視是對若干張基本表的引用,一張虛表,查詢語句執行的結果,-- 不儲存具體的資料(基本表資料發生了改