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
fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。
fs.checkpoint.size
規定edits文件的最大值,一旦超過這個值則強制checkpoint,不管是否到達最大時間間隔。默認大小是64M。
節點間通信:
- 遠程方法調用rpc
- 大數據量的傳輸
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代理對象