閱讀373 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[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等

1

 

2、SecondaryNamenode
1)不是NameNode的備份
2)周期性合並fsimage和editslog,並推送給NameNode
3)輔助恢複NameNode
4)SecondaryNameNode的作用現在可以被兩個節點替換,checkpoint node與backup node

2

配置core-sites.xml

 

[html] view plaincopy
  1. <configuration>
  2.   <property>
  3.     <name>fs.default.name</name>
  4.     <value>hdfs://192.168.56.101:9100</value>
  5.   </property>
  6. <property>
  7. <name>fs.checkpoint.period</name>
  8. <value>30</value>
  9. <description>The number of seconds between two periodic checkpoints.</description>
  10. </property>
  11. <!– <property>
  12. <name>fs.checkpoint.size</name>
  13. <value>67108864</value>
  14. <description>The size of the current edit log (in bytes) that triggers a periodic
  15. checkpoint even if the fs.checkpoint.period hasn’t expired.</description>
  16. </property> –>
  17. <property>
  18. <name>fs.checkpoint.dir</name>
  19. <value>/tmp/hadoop/secondarynamenode</value>
  20. <description>Determines where on the local filesystem the DFS secondary name node
  21. should store the temporary images to merge. If this is a comma-delimited list of
  22. directories then the image is replicated in all of the directories for redundancy.</description>
  23. </property>
  24. </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參數。參看下麵命令對比:

[plain] view plaincopy
  1. xwchen@ubuntu:~/hadoop/hadoop-1.2.1/bin$ ./hadoop namenode –help
  2. Usage: java NameNode [-format [-force ] [-nonInteractive]] | [-upgrade] | [-rollback] | [-finalize] | [-importCheckpoint] | [-recover [ -force ] ]
  3. xwchen@ubuntu:~/hadoop/hadoop-2.0.3-alpha/bin$ ./hdfs namenode –help
  4. 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):

 

[plain] view plaincopy
  1. ./hadoop fs -put a.txt /       //put some files in namenode
  2. ./haddop fs -put hadoop /      //same as above
  3. ./hadoop fs -lsr               //check if put successful
  4. jps                            //check namenode process id
  5. kill -9 8026                   //kill namenode process
  6. rm -rf /tmp/hadoop-xwchen/dfs/name/*    //delete namenode info
  7. cd /tmp/hadoop/secondarynamenode/       //plan to use secondary namenode to recover
  8. rm -rf in_use.lock             //delete lock file to use the backup image
  9. xwchen@ubuntu:/tmp/hadoop/secondarynamenode$ tree    //check edits and fsimage files are available
  10. .
  11. ├── current
  12. │   ├── edits
  13. │   ├── fsimage
  14. │   ├── fstime
  15. │   └── VERSION
  16. └── image
  17.     └── fsimage
  18. xwchen@ubuntu:~/hadoop/hadoop-1.2.1/bin$ ./hadoop namenode -importCheckpoint    //import check point
  19. ./hadoop-daemon.sh start namenode    //restart namenode after recover data from check point
  20. ./hadoop fsck /    //check if healthly
  21. ./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副本放置策略

3

機架感知:
大型Hadoop集群是以機架的形式來組織的,同一個機架上不同節點間的網絡狀況比不同機架之間的更為理想。另外NameNode設法將數據塊副本保存在不同的機架上以提高容錯性。

4

說明:
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

  上一篇:go linux 2.6.36+s3c6410 SPI子係統接口討論 --添加spi設備節點
  下一篇:go S(tuple)類及可選(Optional)類型型