3.1HDFS的设计
存储超大文件;流式数据访问;商用硬件;低时间延迟的数据访问,HDFS是为提高数据吞吐量应用优化的,这可能以提高时间延迟为代价,对于低延迟的访问HBase是更好的选择;大量的小文件;不支持多用户写入,任意修改文件;
3.2HDFS概念
3.2.1数据块
HDFS有类似于硬盘的块的概念,默认大小为64M。如此之大的原因是,最小化寻址开销。
对分布式文件系统的块进行抽象会带来很多好处:第一个是一个文件的大小可以大于集群上的任意一个磁盘进行存储。第二个好处是,使用抽象块而非整个文件作为存储单元。另外,块还非常适用于数据备份进而提供数据容错能力和提高可用性。
3.2.2namenode和datanode
HDFS集群有两类节点以管理者-工作者模式运行,即一个namenode和多个datanode。
namenode管理文件系统的命名空间,维护着文件系统树及整棵树内所有的文件和目录。这些信息的文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。
datanode是文件系统的工作节点。根据需要存储并检索数据块,并且定期向namenode发送他们所存储的块的列表。
namenode是指挥部是核心,因此要实现容错。第一种方式是:备份那些组成文件系统元数据持久状态的文件。另外一种是:运行一个辅助的namenode,但他不能作为namenode运行。
3.2.3联邦HDFS
namenode需要记录所有的文件与数据块的引用关系,内存将成为限制。2.x发行版本系列中引入的联邦HDFS允许系统添加namenode实现扩展。
在联邦环境下,每个namenode维护一个命名空间,包括该命名空间的文件以及所有数据块。
3.2.4HDFS的高可用性
增加HDFS的高可用的办法是,配置活动-备用namenode。实现这一目标需要在架构上做如下修改:
a.namenode之间需要通过高可用的共享存储实现编辑日志的共享。
b.datanode需要同时向两个namenode发送数据块的处理报告。
c.客户端需要特定的机制来处理namenode失效问题。
故障切换与规避
故障转移控制器将活动namenode转换为备用的namenode。每一个namenode运行着一个轻量级的故障转移控制器。
当网络不稳时,也有可能启动备用namenode,这样就会可能造成系统的崩溃,规避机制能够杀死以前的namenode进程使之不影响系统的运行。
3.3命令行接口
3.4Hadoop文件系统
Hadoop有一个抽象的文件系统的概念,HDFS只是其中的一个实现。Java抽象类org.apache.hadoop.fs.FileSystem定义了一个文件系统接口,并且有几个具体实现,如下
文件系统 | URI方案 | java实现 | 描述 |
---|---|---|---|
Local | file | fs.LocalFileSystem | 使用了客户端校验和的本地文件 系统。没有使用校验和的本地磁盘文件系统RawLocalFileSystem |
HDFS | hdfs | hdfs.DistributedFileSystem | Hadoop的分布式文件系统。将HDFS设计成与MapReduce结合使用,可以提高性能 |
HFTP | hftp | hdfs.hftpFileSystem | 一个在HTTP上提供对HDFS只读访问的文件系统 |
HSFTP | hsftp | hdfs.hsftpFileSystem | 在HTTPS上提供对HDFS只读访问的文件系统 |
WebHDFS | webhdfs | Hdfs.web.WebHdfsFileSystem | 基于HTTP,对HDFS提供读写访问的文件系统 |
HAR | har | fs.harFileSystem | 一个构建在其他文件系统上用于文件存档的文件系统 |
hfs | kfs | fs.kfs.kosmosFileSystem | 类似于HDFS或是谷歌的GFS的文件系统,用C++写 |
FTP | ftp | fs.ftp.FTPFileSystem | 由FTP服务器支持的文件系统 |
S3(原生) | S3n | fs.s3native.NativeS3FileSystem | 由Amazon S3支持的文件系统 |
S3(基于块) | S3 | fs.sa.S3FileSystem | 由Amazon S3支持的文件系统,以块格式存储文件,以解决S3的5GB文件大小限制 |
分布式RAID | hdfs | hdfs.DistributedRaiFileSystem | |
View | viewfs | viewfs.ViewFileSystem |
通过HTTP访问HDFS的方式有两种:
直接访问,依靠一个或者多个独立代理服务器通过HTTP访问。
FUSE,用户文件系统(FileSystem in Userspace)允许按照用户空间实现的文件系统整合成一个Unix系统。
3.5Java接口
3.5.1从Hadoop URL读取数据
InputStream in = new URL(“hdfs://post/path”).openStream();
让java程序识别Hadoop的hdfs URL方案,还需要一些额外的工作。一种方式是通过FsUrlStreamHandlerFactory调用java.net.URL对象的setURLStreamHandlerFactory方法。每个java虚拟机只能调用一次这个方法。如果一个第三方的组件已经调用,你将无法从Hadoop总读取数据。另外一种方式就是利用FileSystem来读取文件。
3.6数据流
3.6.1剖析文件读取

3.6.2剖析文件写入
