hdfs简介
声明:本文是本人基于hadoop权威指南学习的一些个人理解和笔记,仅供学习参考,有什么不到之处还望指出,一起学习一起进步。
hadoop说白了就是一个提供了处理分析大数据的文件集群,其中最重要的无疑是hdfs(hadoop distributed file system)即hadoop分布式文件系统。
1、
hdfs是一种以流式数据访问模式(一次写入多次读取的模式)存储超大文件的系统。其不需要的高端的硬件系统,普通市面上的硬件就能满足要求。
目前不适合应用hdfs的有:低延迟的数据访问、大量小的文件、多用户写入任意修改文件等。
2、
hdfs存储以块为单位,通常块大小为64m。之所以要分为这么大的块,主要是为了减少寻址时间,因为目前来看,数据传输速率越来越快,对于hdfs处理大数据时,如果频繁的寻址必然会使得运行时间变长。
hdfs集群有两种节点名称节点和多个数据节点。其中名称节点充当管理者,数据节点充当工作者。名称节点相当于hdfs文件树上的枝干分叉点,而数据节点则标注着所有块的存储信息。所以名称节点的丢失就意味着hdfs的瘫痪。因此hadoop提供了两种机制解决这一问题:
一种是复制组成文件系统元数据的持久状态文件。即在本地磁盘写入的同时也写入一个远程nfs挂载。
另一种是设置一个二级名称节点。
3、
hdfs提供命令行接口的交互。
4、
hadoop是一个抽象的文件系统概念,hdfs是其中的一个具体实现,java抽象类org.apache.hadoop.fs.filesystem展示了hadoop的一个文件系统,而且有几个具体实现。
如上图所示,hadoop提供了许多文件的接口,通常是通过url来确定使用何种文件系统实现交互。
5、
hadoop是java实现的所以,java接口无疑是其中重中之重,下面是java接口的一些具体实现。
(1) 数据读取:
使用url读取数据
java识别hadoop文件系统的url方案,就是通过一个fsurlstreamhandlerfactory实例来调用在url中的seturlstreamhandlerfactory方法。
注意:这种方法在java虚拟机中只能被调用一次,所以通常设置为static,也因此如果程序其他部件(可能不是在你控制的第三方部件)设置了一个urlstreamhandlerfactory,那么久再也不能从hadoop读取数据。
代码:
输入运行:
% hadoop urlcat hdfs://localhost/user/tom/test.txt
结果:
hello world hello world
hello world
hello world hell【本文来自鸿网互联 (http://www.68idc.cn)】o world
使用filesystem api读取数据
直接看代码吧,注意看注释
(2) 数据写入
filesystem类有一系列创建文件的方法。
public fsdataoutputstream create(pathf) throws ioexception
用create创建文件是可用exists()判断其父目录是否存在。
还有一个用于传递回调接口的重载方法 progressable,如此一来,我们所写的应用就会被告知数据写入数据节点的进度。
package org.apache.hadoop.util;
public interface progressable{
publicvoid progress();
}
创建文件的还可以用如下方法:
public fsdataoutputstream append(pathf) throws ioexception
此方法允许在打开文件的末尾追加数据。
(3) 目录
filesystem题目了创建目录的方法:
public boolean mkdirs(path f) thorwsioexception
(4) 查询文件系统
filestatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、副本、修改时间、所有者以及许可信息。
filesystem的getfilestatus()提供了获取一个文件或目录的状态对象方法。
如果只是判断一个文件是否存在,则可以使用前文提到的exists(path f)方法。
hadoop有时要查询批量文件时通常要用到通配符,所以它为执行通配符提供了
hadoop支持与unix bash相同的通配符两个filesystem方法:
public filestatus[] globstatus (pathpathpattern) throws ioexception
public filestatus[] globstatus (path pathpattern,pathfileter filter)throws ioexception
通配符:
(5) 删除数据
filesystem中的delete()方法可以永久删除目录。
public boolean delete(path f,boolean recursive) throwsioexception
