码迷,mamicode.com
首页 > 编程语言 > 详细

HDFS之JAVAAPI

时间:2016-08-19 18:44:46      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

JAVAAPI

上传小文件

代码

 技术分享

上面的例子完成了把一个字符串输出到hdfs的/test目录中。

原理

见上传大文件的例子

上传大文件

代码

 技术分享

原理

 技术分享

客户端调用FileSystemcreate方法创建文件,这个时候会远程调用NameNode,在文件系统的命名空间中创建一个新的文件,NameNode创建新文件时需要执行各种各样的检查,如NameNode是否正常工作,被创建的文件已经存在,客户端是否有在父目录中创建文件的权限等。这些检查都通过以后,NameNode会创建一个新的文件,并记录创建操作到编辑日志edit中。当创建完成一个新的空文件以后,客户端需要向NameNode节点申请数据块,执行addBlock方法。该方法执行成功以后,会返回一个LocatedBlock对象,该对象包含了新数据块的数据块标识和版本号。根据该LocatedBlock对象,客户端就可以和对应的DataNode联系,然后通过写操作,把一个一个Block写入到DataNode中。当写完一个数据包以后,DataNode节点通过调用NameNode节点的DatanodeProtocol远程接口的blockReceived方法,向NameNode提交数据块信息。当把所有的数据写完以后,就会调用close方法关闭流。

创建一个目录

代码

 技术分享

原理

 技术分享

客户端调用HDFSFileSystem实例,也就是DistributedFileSystemmkdir方法,该对象通过远程调用NameNode节点上的远程方法mkdir ,NameNode执行具体的创建子目录操作。在目录树数据结构上的对应位置创建新的目录节点,同时记录这个操作并持久化到日志中。在整个操作期间,客户端和NameNode都不需要和DataNode节点交互。

删除一个文件

代码

 技术分享

原理

 技术分享

同以上的步骤,先在NameNode上执行节点名字的删除,但是DataNode上存放的数据块也必须删除。当NameNode执行delete方法时,它只标记操作涉及的需要被删除的数据块,而不会主动联系这些数据块所在的DataNode节点。当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳应答里,NameNode节点会向DataNode发出指令,从而把数据删除掉。所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。

读文件

代码

技术分享 

原理

 技术分享

客户端通过FileSystem.open()打开文件,在打开文件的时候,实际上创建了一个DFSInputStream输入流,返回给了客户端,客户端使用这个输入流读取数据,在输入流中会通过ClientProtocol.getBlockLocations方法来确定NameNode节点上标识的文件数据块的保存位置(DataNode节点上)。完成上述步骤,客户端就知道了要读取的文件在哪个DataNode节点上,在哪个数据块中。当执行FSDataInputStreamread方法时,客户端的FSDataInputStream会和最近的数据节点建立联系。

查看某一个文件的具体位置

 技术分享

在这里,通过hdfs.getFileStatus(path)得到指定路径下的文件的信息,可以得到的信息有

文件的大小、文件的复制集、文件的blockblock所在的hosthost名字等信息。

查看datanode节点信息

 技术分享

HDFS之JAVAAPI

标签:

原文地址:http://www.cnblogs.com/zpb2016/p/5788426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!