HDFS
HDFS 从设计上来说,主要考虑以下的特征:超大文件,最大能支持 PB 级别的数据;流式数据访问,一次写入,多次读取;在不可靠的文件,故障率高的商用硬件上能运行。Hadoop 的不利之处,是不适应低时间延迟的数据访问,不适应大量的小文件,也不适应多用户写入任意修改文件的情况。
NameNode 是 HDFS 的管理者, 存储着整个集群的元数据信息,比如所有文件和目录信息等。HDFS 将大文件分割成数据块,每个数据块是 64M,也可以设置成 128M或者 256M,然后将这些数据块以普通文件的形式存放到数据节点上,为了防止 DataNode 意外失效,HDFS 会将每个数据块复制若干份放到不同的数据节点。
HDFS能够存储TB甚至PB规模的数据是有前提的,首先数据要以大文件为主,其次NameNode的内存要足够大。当元数据信息较多时,NameNode的启动会变得很慢,也比较容易触发GC操作。显然当数据到了一定的量级,元数据管理会成为HDFS的一个瓶颈,其实这也是为什么说它适合存储大文件的原因。如果解决了元数据管理的问题,其实HDFS是可以支撑海量小文件的。
HDFS-Client
HDFS-VFS
VFS 是Linux 内核和真正文件系统之间的抽象层,它提供统一的接口,真正的文件系统和 Linxu 内核必须通过 VFS 的接口进行沟通。内核的 I\O 路径是这样的:user space -> VFS -> FS -> I\O layer -> I\O scheduler(optional) -> block_driver -> block_device, 一个 I\O 经过了这些才真正到达了对应的存储上。一个用户态的系统调用先通过 VFS 找到对应的文件系统再向下传递 I\O,这是 I\O 的一般路径。对于用户来说,一切都是操作文件。
Hadoop VFS兼容层,可以把HDFS当作一个标准的文件系统mount到本地的Linux文件系统上。这样用户便可以使用标准Unix命令,例如“ls”、“cd”、“cp”、“mkdir”、“find”、“grep”等,来操作一个hdfs的实例;也可以使用标准POSIX的开发库,例如C、C++、Python、Perl、JAVA、bash等的打开、写、读、关闭方法来操作一个hdfs的实例。
HDFS-VFS特性
- 最好情况下,单线程读速度能达100MB/s,写速度能达70MB/s
- 不支持tail –f、chown、chgrp、make、link、mmap命令,以及pwrite等随机写函数
- 不要在HDFS挂载点目录下执行scp、wget等会在当前路径下创建临时文件的操作