Hadoop剖析之HDFS

Hadoop的分布式文件系统(HDFS)是Hadoop的很重要的一部分,本文先简单介绍HDFS的几个特点,然后再分析背后的原理,即怎样实现这种特点的。

--------------------------------------分割线 --------------------------------------

--------------------------------------分割线 --------------------------------------

HDFS特点

1、高容错性。这是HDFS最核心的特性了,把大量数据部署在便宜的硬件上,即使其中某些磁盘出现故障,HDFS也能很快恢复丢失的数据。

2、简单一致性。这个的意思是HDFS适合一次写入,多次读取的程序,文件写入后,就不需要修改了。像MapReduce程序或者网络爬虫程序都是完美适合这个特点。

3、移动计算而不是移动数据。这个好解释,数据太大了,不好移动,HDFS提供了接口,让程序自己移动到离数据近的位置。

4、平台兼容性。平台差异应该能解决,这才能让HDFS使用更广泛。

HDFS架构

1、HDFS是一个典型的主从关系,主是NameNode节点,从是DataNode节点。

NameNode节点是管理者,主要管理系统名字空间,当程序需要读取数据时,先要想NameNode询问数据块的存放位置。

DataNode节点有很多,通常以机架形式组织,机架再通过交换机连接起来。DataNode的主要功能就是保存数据块,同时还要向NameNode报告数据块的信息,没3秒发送一次“心跳”,如果10分钟没有收到心跳,那么就认为这个DataNode坏掉了,此时就需要进行数据恢复了。

2、下面介绍DataNode备份的原理,这也是HDFS有高容错性的原因之一。

在HDFS上的数据都不只是保存一下就可以了,每个文件都会被复制几次(默认3次),然后放在不同地方,以免数据丢失。

那是怎样保存的呢?每个数据块有三个副本,第一个就是数据本身,第二个保存在同一机架(可以理解为同一个硬盘)下的不同DataNode的下,最后一个保存在不同机架上的DataNode上。

3、除了Namenode和DataNode,还有个SecondaryNameNode,他的作用主要是周期性的合并NameNode中保存的关于数据块存放位置的文件,同时NameNode损坏后,可以人工从SecondaryNameNode中恢复一部分,但不是全部。

4、SecondaryNameNode并不能解决单一NameNode的问题,为了提高容错性,HDFS还有HA(high availability)机制:两个NameNode。还有Federation机制:多个NameNode。

5、数据块(block),像Linux系统每个磁盘有数据读和写的最小单位:512字节,

而HDFS也有同样的概念,只不过大小变成了64M,这是因为HDFS需要多次读取,而读取是要不断寻道的,我们要尽量让寻道时间相比数据传输时间最小,如果寻道时间为传输时间百分之一,寻道时间为10ms,传输速度100MB/s,那么块大小就是100MB。以后硬盘传输速度快后,块大小可能会增加。但块太大也不好,一个任务处理一个块,任务会比较慢。当文件小于64MB时,系统同意会分配一个Block给这个文件,但对于实际磁盘资源是没有浪费的。

6、对于大量小文件,HDFS提供了两种容器,将文件统一管理:SequenceFile和MapFile。

7、压缩。压缩能减少空间,主要有三种:gzip,LZO,Snappy。gzip压缩率最高,但耗费CPU,速度也慢。Snappy压缩率最低,但速度快。LZO居中。

HDFS操作

最后介绍一些常用的HDFS操作命令

1、hadoop fs -  这里是一些基本的操作:

hadoop fs -mkdir (路径) 建文件夹

hadoop fs -ls(路径)列出文件及目录

hadoop fs -put  文件 路径  上传

hadoop fs -get 文件 路径 下载

hadoop fs -text  文件  查看

hadoop fs -rm 文件 删除

2、hadoop namenode -formate 格式化NameNode

3、 hadoop job -submit 提交作业

hadoo job -kill 杀死作业

4、hadoop fsck -blocks 打印出块信息报告

hadoop fsck -racks 打印DataNode网络拓扑结构

总结

本文介绍了HDFS的几个特性,并对其一些关键原理及功能给予解释,最后给出常用的HDFS操作命令。读完本文可以对HDFS有个基本的了解,具体原理细节还是要看书,除此之外就是还有会用Java进行HDFS操作了。

相关推荐