大數據學習筆記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代理對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章