HDFS--Hadoop分布式文件系统


HDFS设计特性和概念


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抽象文件系统


Hadoop有一个抽象文件系统,由org.apache.hadoop.fs.FileSystem定义,HDSF仅仅是当中的一个实现。

Hadoop所实现的文件系统列表。大致例如以下图所看到的:

HDFS--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。


HDFS命令行接口


查看全部命令:

hadoop fs -help

hdfs fsck -help

也能够通过Web界面浏览文件系统::50070/


HDFS JAVA API


从Hadoop URL中读取数据


import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.zookeeper.common.IOUtils; public class URLCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws Exception { InputStream in = null; try { in = new URL("hdfs:///test/input/t/temperature.txt").openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } } }
把hdfs换成file,则能够直接处理当前本地文件系统。

以上的方法是非常easy的,利用的java.net.URL对象打开数据流。从中读取数据。可是这种方法有个限制,Java虚拟机仅仅能调用这个set方法一次,这个限制意味着假设有其它不受控制的第三方组件(已经声明了URLStreamHandlerFactory实例),则我们无法再使用这样的方法读取数据。因而,不推荐使用。


通过FileSystem API读取数据


import java.io.InputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.zookeeper.common.IOUtils; public class FileSystemCat { public static void main(String[] args) throws Exception { String uri = "hdfs:///test/input/t/temperature.txt"; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); InputStream in = null; try { in = fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } } }实际上,open方法返回的是FSDataInputStream对象,是继承java.io.DataInputStream的一个特殊类。支持随机訪问,由此能够从流的任何位置读取数据。比方,我们把try段的代码变成: in = fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096, false); ((FSDataInputStream) in).seek(0); //go back to the start of the file IOUtils.copyBytes(in, System.out, 4096, false)则,会显示两遍文件temperature.txt文件的内容。


将本地文件拷贝到Hadoop文件系统

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsyjs.html