大資料筆記01--大資料概述

KissshotAHUB發表於2018-10-09

什麼是大資料?

短時間內快速的產生海量多種多樣有價值的資料

大資料的技術

1. 分散式儲存

2. 分散式計算

分散式批處理

即攢一段時間的資料,然後在未來的某一個時間進行處理

分散式流處理

即資料不需要積攢,每產生一條資料立即進行處理,並推送到前端進行顯示,或儲存到資料庫中,形成報表提交給老闆

分散式檔案系統(HDFS)

Hadoop分散式檔案系統,Hadoop Distributed File System(簡稱HDFS)

角色

NameNode :

  1. 掌控全域性,管理datanode和後設資料1,包括:
  • 檔案上傳時間
  • 檔案的屬主和許可權
  • block2的數量和位置
  1. 接受客戶端的寫請求,返回一組地址
  2. 收集datenode彙報的block地址資訊
  3. 接受客戶端的讀請求,返回地址資訊

DataNode:

  1. 儲存block塊,向NN彙報地址
  2. 向NN傳送心跳
  3. 接受client的讀請求

SecondNameNode:

並不是作為NN的備份,而是NN的助理
將namenode中的後設資料持久化

寫資料的總體流程

  1. client拿到檔案,計算block的數量:檔案大小/128M=block數
  2. 彙報要上傳檔案資訊(上傳時間、屬主、許可權、block數量)
  3. 彙報成功後,client切割出一個block
  4. 對每個block,client向NN請求一個blockid和地址
  5. NN將一個負載不高的DN地址,兩個備份地址給client
  6. client拿到地址後向DN上傳資料
  7. DN儲存block完畢後向NN彙報當前儲存情況

備份機制

預設共有三個副本

  1. 第一個block儲存在一個負載相對低的伺服器上
    (如果是叢集內提交,第一個地址是本地伺服器)
  2. 第二個儲存在與第一個不同的機架(rack)上的隨機伺服器上
  3. 第三個儲存在與第二個相同機架的不同伺服器上
  4. 更多副本則隨機存放

向DN寫資料的詳細流程

  1. client請求到三個地址後,DN上三個伺服器間形成管道(pipeline)
  2. block被切割成packet(64k)
  3. packet在管道中源源不斷的傳輸,實現並行寫入

後設資料的持久化

原因:

後設資料儲存在記憶體中不穩定,且斷電後會丟失,若在本地磁碟讀寫將耗費大量資源,所以由secondary namenode作為namenode的助理進行持久化

實現方式:

  1. NN在初始化時建立了兩個檔案edits和fsimage,edits儲存執行的操作,fsimage儲存後設資料
  2. 滿足一定條件時,SNN拉取兩個檔案,讀取edits中的操作進行重演,合併寫入fsimage.ckpt
  3. 這個過程中NN生成edits.new繼續寫入操作
  4. SNN將fsimage.ckpt返回給NN
  5. edits.new和fsimage.ckpt重新命名回原名稱,繼續進行儲存

合併觸發機制

edits檔案超過64M或超過3600s(預設)

被持久化的後設資料

除block位置資訊,其他後設資料都會持久化

叢集啟動時的工作

  1. DN向NN傳送資訊(block位置資訊,DN地址)
  2. 進入安全模式
  • 載入fsimage,還原後設資料
  • 若edits不為空,根據edits重演出後設資料資訊併合並fsimage(順序?)
  • 檢查DN是否存活
  • 若有因DN掛掉導致的備份缺失,補充備份

處於安全模式中時,NN對於客戶端是隻讀的,若fsimage已經載入完畢,客戶端可以檢視到檔案目錄,但是無法進行寫、刪除、重新命名等操作

HDFS的優點

  1. 高容錯性
  • 資料自動儲存多個副本
  • 副本丟失後,自動恢復
  1. 適合批處理
  • 移動計算而非資料
  • 資料位置暴露給計算框架(Block偏移量)
  1. 適合大資料處理
  • GB 、TB 、甚至PB 級資料
  • 百萬規模以上的檔案數量
  • 10K+ 節點
  1. 可構建在廉價機器上
  • 通過多副本提高可靠性
  • 提供了容錯和恢復機制

HDFS的缺點

  1. 不適合低延遲資料訪問
  • 比如毫秒級的低延遲與高吞吐率的訪問
  1. 小檔案存取
  • 佔用NameNode 大量記憶體
  • 尋道時間超過讀取時間
  1. 併發寫入、檔案隨機修改
  • 一個檔案只能有一個寫者
  • 僅支援append

其他細節

  1. HDFS叢集不允許修改、檔案一旦上傳成功不能修改block塊大小,防止叢集泛洪
    可以使用append新增資料
  2. 同一時間只允許一個寫入者
  3. 許可權控制
    基於linux的許可權控制,僅用於隔離不同使用者,不對使用者進行驗證(防君子不防小人)
  4. 角色在叢集中是用程式來表現的(一臺伺服器並不一定只是一個角色)
  5. block的副本總數<=DN數
  6. NN也會執行合併,僅在啟動時一次

  1. 後設資料:描述資料的資料 ↩︎

  2. block:不可分割的儲存單元,檔案按位元組分割成block進行傳輸
    用dfs.blocksize修改大小 ↩︎

相關文章