阅读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)类型型