天天看點

大資料學習筆記2--hdfs工作原理及源碼分析

windows下配置hadoop

  1. hadoop 安裝包解壓,路徑不要有特殊字元
  2. lib和bin直接解壓出來的不可用,需要自己重新編譯
  3. 配置環境變量:HADOOP_HOME,path中添加:bin目錄

namenode

  • 整個檔案系統的管理節點。它維護着整個檔案系統的檔案目錄樹,檔案/目錄的元資訊和每個檔案對應的資料塊清單。接收使用者的操作請求。

響應用戶端的請求,上傳檔案:

  1. client申請上傳檔案,namenode檢視中繼資料資訊,檢視用戶端申請的路徑是否已存在
  2. namenode傳回可用的datanode
  3. client直接通路第一個datanode,上傳第一個block,datanode向namenode報告block資訊,第一個block建立一個pipeline,向其他datanode拷貝block副本,鍊式向下傳遞副本,達到配置的副本數。

namenode寫中繼資料

  • 記憶體中:meta.data
  • 磁盤:fsimage、edits log
  • 先修改edits
  • 同步到meta.data

    fsimage結構:

  • 檔案名,副本數,blockid,block存儲的機器
  • NameNode(FileName, replicas, block-ids,id2host…)
  • /test/a.log, 3 ,{blk_1,blk_2},

    [{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]

secondary namenode 同步修改fsimage

  1. 通知namendoe切換edits,不再使用之前的edits檔案
  2. secondary namenode從namenode下載下傳edits和fsimage檔案
  3. secondary namenode将他們加載到記憶體,進行合并,産生新的fsimage.chkpoint
  4. 将新的fsimage檔案回傳到namenode
  5. namenode用新的fsimage替換舊的fsimage

checkpoint

  • fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,預設3600秒。
  • fs.checkpoint.size

    規定edits檔案的最大值,一旦超過這個值則強制checkpoint,不管是否到達最大時間間隔。預設大小是64M。

節點間通信:

  • 遠端方法調用rpc
  • 大資料量的傳輸

FileSystem擷取過程

  1. FileSystem.get(new URI(HDFS_PATH), new Configuration());//擷取檔案對象
  2. CACHE.get(uri, conf)//從緩存Map中擷取
  3. fs = createFileSystem(uri, conf);//建立新的fs
  4. clazz = getFileSystemClass(uri.getScheme(), conf);//擷取fs類
  5. ReflectionUtils.newInstance(clazz, conf)//執行個體化fs
  6. fs.initialize(uri, conf);//初始化fs參數
  7. dfs = new DFSClient(uri, conf, statistics)//擷取dfs用戶端
  8. proxyInfo =

    NameNodeProxies.createProxyWithLossyRetryHandler(conf,nameNodeUri,

    ClientProtocol.class, numResponseToDrop)//通過RPC擷取和NN通信的用戶端代理對象

  9. this.namenode = proxyInfo.getProxy()//獲得namenode代理對象

fs持有DistributedFileSystem dfs,dfs中持有DFSClinet dfsc對象,dfsc中持有namenode代理對象

繼續閱讀