HDFS之JAVAAPI

JAVAAPI

上传小文件

代码

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

原理

见上传大文件的例子

上传大文件

代码

原理

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

创建一个目录

代码

原理

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

删除一个文件

代码

原理

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

读文件

代码

原理

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

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

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

文件的大小、文件的复制集、文件的block、block所在的host,host的名字等信息。

查看datanode节点信息

时间: 2024-09-28 20:36:46

HDFS之JAVAAPI的相关文章

hdfs的javaAPI使用

参考博客:https://www.cnblogs.com/Eddyer/p/6641778.html 1.需求 使用hdfs的javaAPI访问hdfs系统. 2.环境配置 (1)hadoop为本地模式 (2)pom文件代码如下 <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId>

hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题

如果执行hdfs文件操作的时候抛异常 winutils 如何解决: 第一步:把 F:\传智播客大数据离线阶段课程资料\3.大数据离线第三天\解决winutils的问题\hadoop-2.6.0-cdh5.14.0 这个安装包拷贝到一个没有中文没有空格的路径下面去(D:\Develop\hadoop-2.6.0-cdh5.14.0): 第二步:在windows上面配置hadoop的环境变量, PATH中添加:D:\Develop\hadoop-2.6.0-cdh5.14.0: 第三步:D:\Dev

hdfs深入:10、hdfs的javaAPI操作

看到10.hdfs的javaAPI操作,  13分19秒 具体代码如下: /** * 递归遍历hdfs中所有的文件路径 */ @Test public void getAllHdfsFilePath() throws URISyntaxException, IOException { //获取fs的客户端 FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());

HDFS的JavaAPI

配置windows平台的Hadoop环境 在 windows 上做 HDFS 客户端应用开发,需要设置 Hadoop 环境,而且要求是windows 平台编译的 Hadoop,不然会报以下的错误: Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop bin

熟练掌握HDFS的Shell访问和JavaAPI访问

HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够储存很大量文件(可以储存TB级的文件).HDFS将这些文件分割之后,储存在不同的DataNode上,HDFS提供了两种数据访问接口:Shell接口和javaAPI接口,对HDFS里面的文件进行操作. Shell接口  HDFS处理文件的命令和linux命令基本相同,这里区分大小写.下面介绍HDFS操作分布式文件系统的命令. HDFS基本命令 hadoop fs -cmd  其中cmd:具体的操作,基本上与unix的命令相同 args:

利用JavaAPI访问HDFS的文件

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

hadoop的hdfs中的javaAPI操作

package cn.itcast.bigdata.hdfs; import java.net.URI; import java.util.Iterator; import java.util.Map.Entry; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache

【hadoop】使用javaAPI对hdfs进行文件操作

前提:1.搭建好hadoop伪分布式环境:2.安装好eclipse: 注:修改 /etc/hosts 添加 “本机IP hadoop01” , 那么代码中创建hdfs文件系统的时候的URI hdfs://hadoop01:9000 相当于  hdfs://hadoop服务器ip(例如:192.168.1.1XX):9000 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcep

通过javaAPI上传文件到HDFS文件系统

import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.h