HDFS,全称是Hadoop Distributed Filesystem,是一个分布式的文件系统,以流式数据訪问模式来存储超大文件(一次写入、多次读取)。
HDFS具有例如以下设计特性:
(1)处理超大文件,指的是GB、TB、PB级别的文件。百度、淘宝都有PB级别的HDFS,百度应该有国内最大规模的HDFS。几十PB。
(2)流式数据訪问。一次写入,多次读取,所处理的场景中,读取整个数据的延迟比读取第一条记录的时间延迟重要。
(3)执行在普通商用PC就可以,比方3万级别的普通PCserver(16-32G ECC内存,8-16核CPU)。
(4)是为高数据吞吐量优化的,以高时间延迟为代价。
(5)推荐处理大量小文件。因为namenode将文件系统的元数据存储在内存中,故文件总数受制于namenode节点内存。依据经验。一个文件/文件夹/block大约占用150自己,所以亿级别文件还能够,10亿级别内存就不够了。
(6)对于写入。仅仅能有一个写入操作,也仅仅能把内容加入在文件的末尾。
概念:
(1)数据块(block)。默认64M,一般用128M,相对于文件系统块(几K字节大小)、磁盘块(一般512毕节),HDFS的块设计明显大的多。这是为了最小为寻址开销(寻址占传输的百分比,比方:寻址10S。传输100MB/S。则寻址时间仅占传输时间的1%)。
(2)名称节点(namenode),是管理者,维护整个HDFS的文件系统树及树内全部的文件和文件夹。
(3)数据节点(datanode)。是文件系统工作节点,依据namenode调度,存储并检索数据块,定期向namenode发送它所存储的块列表。
namenode单点风险的2种解决的方法:
(1)备份那些组成文件系统元数据持久状态的文件,比方。持久状态写入本地磁盘的同一时候,写入一个远程的文件系统。
(2)执行一个辅助namecode,因为辅助namecode的滞后性,所以namecode损坏时,难免会丢失部分数据。
Hadoop有一个抽象文件系统,由org.apache.hadoop.fs.FileSystem定义,HDSF仅仅是当中的一个实现。
Hadoop所实现的文件系统列表。大致例如以下图所看到的:
Hadoop对文件系统提供了很多接口,它一般使用URI方案来选取合适的文件系统实例进行交互。。比方例如以下代码:
String uri = "hdfs:///test/input/t/temperature.txt";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
即时依据hdsfs://来推断,使用hdfs.DistributedFileSystem。假设改成file://,则使用fs.LocalFileSystem。
查看全部命令:
hadoop fs -help
hdfs fsck -help
也能够通过Web界面浏览文件系统::50070/
把hdfs换成file,则能够直接处理当前本地文件系统。
以上的方法是非常easy的,利用的java.net.URL对象打开数据流。从中读取数据。可是这种方法有个限制,Java虚拟机仅仅能调用这个set方法一次,这个限制意味着假设有其它不受控制的第三方组件(已经声明了URLStreamHandlerFactory实例),则我们无法再使用这样的方法读取数据。因而,不推荐使用。