標籤:hdfs namenode 源碼
windows下配置hadoop
hadoop 安裝包解壓,路徑不要有特殊字元
lib和bin直接解壓出來的不可用,需要自己重新編譯
配置環境變數:HADOOP_HOME,path中添加:bin目錄
namenode
- 整個檔案系統的管理節點。它維護著整個檔案系統的檔案分類樹,檔案/目錄的元資訊和每個檔案對應的資料區塊列表。接收使用者的操作請求。
響應用戶端的請求,上傳檔案:
client申請上傳檔案,namenode查看中繼資料資訊,查看用戶端申請的路徑是否已存在
namenode返回可用的datanode
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
- 通知namendoe切換edits,不再使用之前的edits檔案
- secondary namenode從namenode下載edits和fsimage檔案
- secondary namenode將他們載入到記憶體,進行合并,產生新的fsimage.chkpoint
- 將新的fsimage檔案回傳到namenode
- namenode用新的fsimage替換舊的fsimage
checkpoint
節點間通訊:
FileSystem擷取過程
- FileSystem.get(new URI(HDFS_PATH), new Configuration());//擷取檔案對象
- CACHE.get(uri, conf)//從緩衝Map中擷取
- fs = createFileSystem(uri, conf);//建立新的fs
- clazz = getFileSystemClass(uri.getScheme(), conf);//擷取fs類
- ReflectionUtils.newInstance(clazz, conf)//執行個體化fs
- fs.initialize(uri, conf);//初始化fs參數
- dfs = new DFSClient(uri, conf, statistics)//擷取dfs用戶端
- proxyInfo =
NameNodeProxies.createProxyWithLossyRetryHandler(conf,nameNodeUri,
ClientProtocol.class, numResponseToDrop)//通過RPC擷取和NN通訊的用戶端代理對象
- this.namenode = proxyInfo.getProxy()//獲得namenode代理對象
fs持有DistributedFileSystem dfs,dfs中持有DFSClinet dfsc對象,dfsc中持有namenode代理對象
大資料學習筆記2--hdfs工作原理及源碼分析