Hadoop知識點總結
之前自己在慕課網線上學習了關於hadoop的初步知識,在此記錄一下:
hadoop主要是由兩部分構成:1、HDFS,負責儲存,為分散式檔案系統;2、MapReduce,是並行處理框架,用於實現任務的分解和排程。
hadoop的優勢:1、高擴充套件:通過新增硬體來實現效能的提升,擴充容量。2、低成本:只需要普通PC機即可,不需高階硬體。3、成熟的生態圈:周邊開源工具豐富:有Hive、HBase(其中Hive是把SQL查詢轉換為MapReduce任務執行,HBase則是分散式資料庫)。
檢視Hadoop的檔案系統目錄:hadoop fs-ls(新版的為dfs fs-ls)
hadoop中主要有兩種結點型別:
NameNode:管理節點,用於存放檔案元資料,其中包括1、檔案與資料塊的對映表;2、資料塊與資料節點的對映表。
DataNode:工作節點,用於存放真正的資料塊。
預設每個資料塊有3個副本a,b,c,其中a和b放在同一個機架上的不同節點上,c放在不同機架上的某個節點上。這樣做是為了防止某DataNode或者某機架損壞後,可以從其他DataNode中得到副本,用於恢復。
心跳檢測:DataNode會定期向NameNode傳送心跳訊息,NameNode好確定某時段內哪些DataNode處於Active狀態。
二級NameNode(SecondNameNode):是NameNode的替換副本,定期同步元資料映像檔案和修改日誌,若NameNode損壞失效,則二級NameNode將代替。
HDFS讀檔案的流程:1、客戶端向NameNode發請求;2、NameNode將該檔案的資料塊所在的DataNode位置返回給客戶端;3、客戶端向相應的DataNode讀檔案。
HDFS寫檔案的流程:1、客戶端將檔案分塊(分為多個數據塊);2、NameNode為客戶端分配DataNode;3、客戶端將第一個資料塊寫入DataNode;4、傳遞式複製該資料塊到不同的DataNode和不同的機架上;5、客戶端開始寫入第二個資料塊。。。。6、待所有資料塊寫完之後,給NameNode更新元資料。
HDFS的特點:1、資料冗餘,硬體容錯。2、流式的資料訪問(寫一次,讀多次,無法隨機修改,只能刪了原來的塊,重新追加寫塊);3、適合儲存大檔案(若是小檔案,則NameNode的元資料負載量太大)。
本地檔案上傳到HDFS: hadoop fs -put 檔名 HDFS的存放目錄
從HDFS上下載檔案:hadoop fs -get 檔名 本地存放目錄
檢視檔案系統的所有資訊:hadoop dfsadmin -report
hadoop中,MapReduce和HDFS都有通訊的需求,所以需要對通訊的物件進行序列化,Hadoop沒有采用Java的序列化,而是使用自己定義的Writable介面,該介面定義了兩個方法write和readFields,分別為把物件序列化和反序列化。
Hadoop2.0:新機制:yarn。
Jobcracker在分配map任務時,會考慮資料的本地化因素。選取一個距離其輸入分片檔案最近的tasktracker。最理想的情況下,任務是資料本地化的(即任務執行在輸入分片所在的節點上),或者其次是任務執行在輸入分片所在的同一機架上。但是對於reduce任務,jabtracker只從待執行的reduce任務列表中選取下一個來執行,不會考慮資料的本地化。
MapReduce1中,tasktrackers會設定固定數量的槽。每個任務在一個槽上執行,槽有最大記憶體分配限制,導致當任務使用較少記憶體時無法充分利用記憶體(比如該任務只用了一個槽的1/10,那剩下的9/10就浪費了,其他等待的任務不能使用這些未使用的記憶體)以及憂鬱任務不能獲取足夠記憶體而導致作業失敗。而在MapReduce2中的yarn中,資源分為更細的粒度,應用程式可以請求最小到最大限制範圍的任意最小值倍數的記憶體容量。
任務執行:首先將任務需要的資源本地化,包括作業的jar檔案,配置檔案以及所有來自分散式快取的檔案(這些都在HDFS上)。最後,執行map任務或者reduce任務。
作業的排程:
MapReduce1:1、預設是基於佇列的FIFO排程器。2、公平排程器:每個使用者有自己的作業池,支援搶佔機制。提交作業數較多的使用者,不會因此而獲得更多的叢集資源。如果一個池在特定的一段時間內未能公平共享資源,就會中止執行池中得到過多資源的任務,把空出來的任務槽讓給執行資源不足的作業池。3、容量排程器:每個佇列內部,採用FIFO方式(考慮優先順序)
其中2和3的區別:3是佇列內部採用FIFO,2則是強調池內公平共享,使執行的作業共享池的資源。
map輸出檔案位於執行map任務的tasktracker的本地磁碟。
map任務的數量等於輸入檔案被劃分為塊的數量。reduce的數量等於paritioner分割槽的數量。
預設的partitioner是HashPartitioner,它對每條記錄的鍵進行雜湊操作以決定該記錄應該屬於哪個分割槽,每個分割槽對應一個reduce任務。
JobTracker的角色:1、任務排程;2、分配任務給task,監控任務執行制度(tasktracker會定時給Jobtracker彙報);3、監控Tasktracker的狀態。
Tasktracker的角色:1、執行任務;2、向JobTracker彙報任務狀態。
MapReduce的容錯機制:1、重複執行(預設4次);2、推測執行。