[Hadoop培訓筆記]04-HDFS詳細分析
作者:陳曉煒
注:開源力量Hadoop Development網絡培訓個人筆記,培訓鏈接:https://new.osforce.cn/course/52
Q&A:
1)搭建HDFS集群的時候,NameNode和DataNode這兩個進程會掛掉?
查看Log,查看相關的異常信息。
a、如果namenode沒有正常啟動,原因是在啟動之前沒有格式化。我們需要format
b、如果datanode沒有正常啟動,或啟動後又關閉,原因是namespace ID不一樣
正確的步驟是:
a、rm -rf 本地的存儲目錄(/tmp/hadoop-<user_name>)
b、hadoop namenode -format
c、執行腳本 start-dfs.sh
2)dfsadmin -setQuota的問題
dfsadmin -setQuota 限製文件數量
dfsadmin -setSpaceQuota 限製磁盤空間
3)什麼樣的文件算是小文件?在哪裏配置?
數據塊的默認大小是64M,如果一個文件的大小小於64M,那麼它也要占據一個數據塊的大小。這樣會浪費空間,所以要使用archive的方式來實現歸並小文件。
數據塊的大小可以使用dfs.block.size這個屬性進行配置
4)start-dfs.sh的告警信息
unable to load native-hadoop library for your platform…
using built-in java classes
沒有找到native庫,使用內置的java code
5)重複運行wordcount,提示output目錄存在
可以使用命令行或者HDFS API直接刪除,或修改源代碼,增加強製的目錄替換功能
6)默認的hadoop conf路徑變成了etc/hadoop
調用start-dfs.sh之前,它會source一下hadoop-config.sh,然後再去執行hadoop-daemon.sh,接下來執行hadoop腳本,執行java程序
HDFS詳細分析(一)
1、HDFS架構
FastDFS,MooseFS,以文件為基本存儲單位:
– 難以並行化處理(一個節點隻能處理一個文件,無法同時處理一個文件);
– 難以實現負載均衡(文件大小不同,無法實現負載均衡,用戶需要自己控製文件大小)
HDFS優點:
– 適合大數據處理(支持GB,TB,PB級別的數據存儲,支持百萬規模以上的文件數量)
– 適合批處理(支持離線的批量數據處理,支持高吞吐率)
– 高容錯性(以數據塊存儲,可以保存多個副本,容易實現負載均衡)
HDFS缺點:
– 小文件存取(占用namenode大量內存,浪費磁盤空間)
– 不支持並發寫入(同一時刻隻能有一個進程寫入,不支持隨機修改)
看HDFS源代碼前,導入至eclipse中,出現javax.servlet, javax.servlet.jsp, ant三個需要尋找jar文件才能解析。我從網上下載了加進去。不過覺得eclipse既然知道ant目錄,為何不能定位不清楚。暫時沒時間解決,就沒追究了。
首先分析的是 org.apache.hadoop.hdfs/DistributedFileSystem.java,open(Path, int)方法,NameNode.java等
2、SecondaryNamenode
1)不是NameNode的備份
2)周期性合並fsimage和editslog,並推送給NameNode
3)輔助恢複NameNode
4)SecondaryNameNode的作用現在可以被兩個節點替換,checkpoint node與backup node
配置core-sites.xml
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://192.168.56.101:9100</value>
- </property>
- <property>
- <name>fs.checkpoint.period</name>
- <value>30</value>
- <description>The number of seconds between two periodic checkpoints.</description>
- </property>
- <!– <property>
- <name>fs.checkpoint.size</name>
- <value>67108864</value>
- <description>The size of the current edit log (in bytes) that triggers a periodic
- checkpoint even if the fs.checkpoint.period hasn’t expired.</description>
- </property> –>
- <property>
- <name>fs.checkpoint.dir</name>
- <value>/tmp/hadoop/secondarynamenode</value>
- <description>Determines where on the local filesystem the DFS secondary name node
- should store the temporary images to merge. If this is a comma-delimited list of
- directories then the image is replicated in all of the directories for redundancy.</description>
- </property>
- </configuration>
namenode格式化,執行start-dfs.sh後,在相應目錄能看到fsimage等相關文件的存在,如下所示:
xwchen@ubuntu:/tmp/hadoop/secondarynamenode$ tree
├── current
│ ├── edits
│ ├── fsimage
│ ├── fstime
│ └── VERSION
├── image
│ └── fsimage
└── in_use.lock
xwchen@ubuntu:/tmp/hadoop-xwchen/dfs/namesecondary$ tree
.
├── current
│ ├── edits
│ └── fsimage
├── image
│ └── fsimage
└── lastcheckpoint.tmp
├── edits
├── fsimage
├── fstime
└── VERSION
查看VERSION(保存了HDFS的版本號)信息,有類似如下信息:
namespaceID=1852621341 //是文件係統的唯一標識,是在文件係統初次格式化時生成的
cTime=0 //此處為0
storageType=NAME_NODE //表示此文件夾中保存的是元數據節點的數據結構
layoutVersion=-41 //是一個負整數,保存了HDFS的持續化在硬盤上的數據結構的格式版本號
checkpoint node與secondary namenode的作用及配置完全相同
啟動命令 bin/hdfs namenode -checkpoint
這是hadoop 2.0.3的命令,對應 hadoop 1.2.1中的 bin/hadoop namenode ,但1.2.1不存在checkopint參數。參看下麵命令對比:
- xwchen@ubuntu:~/hadoop/hadoop-1.2.1/bin$ ./hadoop namenode –help
- Usage: java NameNode [-format [-force ] [-nonInteractive]] | [-upgrade] | [-rollback] | [-finalize] | [-importCheckpoint] | [-recover [ -force ] ]
- xwchen@ubuntu:~/hadoop/hadoop-2.0.3-alpha/bin$ ./hdfs namenode –help
- Usage: java NameNode [-backup] | [-checkpoint] | [-format [-clusterid cid ] [-force] [-nonInteractive] ] | [-upgrade] | [-rollback] | [-finalize] | [-importCheckpoint] | [-initializeSharedEdits] | [-bootstrapStandby] | [-recover [ -force ] ]
Backup Node
1)提供了一個真正意義上的備用節點
2)Backup Node在內存中維護了一份從Namenode同步過來的fsimage,同時它還從namenode接收edits文件的日誌流,並把它們持久化硬盤
3)Backup Node在內存中維護和NameNode一樣的Metadata數據
4)啟動命令bin/hdfs namenode -backup
測試(hadoop 1.2.1):
- ./hadoop fs -put a.txt / //put some files in namenode
- ./haddop fs -put hadoop / //same as above
- ./hadoop fs -lsr //check if put successful
- jps //check namenode process id
- kill -9 8026 //kill namenode process
- rm -rf /tmp/hadoop-xwchen/dfs/name/* //delete namenode info
- cd /tmp/hadoop/secondarynamenode/ //plan to use secondary namenode to recover
- rm -rf in_use.lock //delete lock file to use the backup image
- xwchen@ubuntu:/tmp/hadoop/secondarynamenode$ tree //check edits and fsimage files are available
- .
- ├── current
- │ ├── edits
- │ ├── fsimage
- │ ├── fstime
- │ └── VERSION
- └── image
- └── fsimage
- xwchen@ubuntu:~/hadoop/hadoop-1.2.1/bin$ ./hadoop namenode -importCheckpoint //import check point
- ./hadoop-daemon.sh start namenode //restart namenode after recover data from check point
- ./hadoop fsck / //check if healthly
- ./hadoop fs -lsr /
hdfs-site.xml: dfs.backup.address, dfs.backup.http.address
core-site.xml: fs.checkpoint.period, fs.checkopint.size, fscheckpoint.dir, fs.checkpoint.edits.dir
3、HDFS副本放置策略
機架感知:
大型Hadoop集群是以機架的形式來組織的,同一個機架上不同節點間的網絡狀況比不同機架之間的更為理想。另外NameNode設法將數據塊副本保存在不同的機架上以提高容錯性。
說明:
1)當沒有配置機架信息時,所有的機器Hadoop都默認在同一個默認的機架下,名為“/default-rack”,這種情況下,任何一台datanode機器,不管物理上是否屬於同一個機架,都會被認為時在同一個機架下。
2)一旦配置topology.script.file.name,就按照網絡拓撲結構來尋找datanode。topology.script.file.name這個配置選項的value指定為一個可執行程序,通常為一個腳本。
源代碼在org.apache.hadoop.net中
最後更新:2017-04-03 07:57:07