Hadoop HDFS (1),hadoophdfs


HDFS是Hadoop Distributed Filesystem,Hadoop分布式文件系统。
当数据大到一台机器无法存储时,就要把它分散到多台机器上去,通过网络管理多台计算机上的存储空间的文件系统,就称为分布式文件系统。网络程序的复杂性使得分布式文件系统比普通的磁盘文件系统复杂得多,例如其中最大的挑战之一就是要容错,要在其中一个或几个节点死掉后,仍能保证数据完整。
HDFS是Hadoop的旗舰文件系统,但是Hadoop还有一个抽象的文件系统,用于整合其它文件系统,例如本地存储。
HDFS是为存储非常大的文件设计的文件系统,适合于流式数据访问,运行于普通商业计算机集群。
“非常大的文件”:指几百MB,几GB甚至几TB的数据。Yahoo曾经在4000个节点上存储上PB的数据。 “流式数据访问”:是指数据被写入一次,然后被多次读取并分析计算。而且每次计算都几乎要用到文件中的大部分数据,而不是只用其中的第一行数据。 “普通商业计算机集群”:是指Hadoop不要求运行于非常昂贵的可靠性很高的服务器上,而是设计成运行于普通的计算机上。这就意味着节点是不可靠的,节点故障退出集群是很正常的事。HDFS就是设计成在节点故障时,不让用户有明显的感觉。
相对应的,HDFS也有其不适用的场景。 “即时数据访问”:HDFS不适合于即时系统。HDFS针对高吐吞量进行优化,对于处理大量数据有优势,但不适合于那种在大量数据中处理一小部分,然后快速响应返回的系统。 “大量小文件”:文件元信息是存储在namenode的内存里的,100万个文件,元信息将占用namenode机器内存300M左右。因此,尽管几百万个文件可以承受,但几十亿个文件对于当前流行的硬件配置就吃不消了。 “大量写操作和文件中间修改”:HDFS目前只支持单线程写操作,并且只能在文件尾写。不支持修改文件中的任意位置。(也许在以后的版本中会支持,但即使支持,也一定效率很差。)

问在Hadoop的HDFS中,是怎把文件分割后的block分散到一个个的datanode中,有源代码的相关方法说明最好

(1)文件分割后,会有一个 文件 --> block的映射,这个映射是持久化到硬盘中的,具体的映射关系表是在FSNamesystem.java中构建的(该部分的构建使用的是FSDirectory.java的功能,filename - blockset);
有了文件到块的映射表就可以通过文件找到blocklist;
(2)datanode的选取,hadoop有它本身的机制,一般来说,datanode默认是三个,选取的是不同机架的datanode,同机架里选一台,另一个机架里选取两台(安全性等考虑);
(3)block写入datanodes,选取的三个datanode,比如说是A、B、C,先写给A,A再写给B,B再写给C;然后B收到C的写入成功,A收到B的写入成功,然后告诉namenode 和 client写入成功;
(4)真正写的并不是block,而是比block更小的好像是chunk , 还包括有各种校验。

给你参考一下。
 

怎从hadoop的Hdfs上查询文件

A1.该索引叫FsImage, 但没有对外提供api, 参考 附录的链接1
整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。

A2. FS Shell, 详细请参考链接2
1)hadoop fs -ls
功能跟shell 的 ls 命令相同
2)hadoop fs -lsr
ls命令的递归版本。类似于Unix中的ls -R。

如果要实现复杂的查找功能,可以考虑用下述方式
hadoop fs -lsr / | awk/sed/grep .....

链接1:FsImage/EditLog的官方说明
hadoop.apache.org/...%8C%96

链接2:HDFS shell
hadoop.apache.org/...tml#ls
 

相关内容