Hadoop日记Day9---HDFS的java访问接口

一、搭建Hadoop 开发环境

  我们在工作中写完的各种代码是在服务器中运行的,HDFS 的操作代码也不例外。在开发阶段,我们使用windows 下的eclipse 作为开发环境,访问运行在虚拟机中的HDFS。也就是通过在本地的eclipse 中的java 代码访问远程linux 中的hdfs。
要使用宿主机中的java 代码访问客户机中的hdfs,需要保证以下几点:
(1)确保宿主机与客户机的网络是互通的
(2)确保宿主机和客户机的防火墙都关闭,因为很多端口需要通过,为了减少防火墙配置,直接关闭.
(3)确保宿主机与客户机使用的jdk 版本一致。如果客户机为jdk6,宿主机为jdk7,那么代码运行时会报不支持的版本的错误。
(4)宿主机的登录用户名必须与客户机的用户名一直。比如我们linux 使用的是root 用户,那么windows 也要使用root 用户,否则会报权限异常
 在eclipse 项目中覆盖hadoop 的org.apache.hadoop.fs.FileUtil 类的checkReturnValue 方法,如图1.1,目的是为了避免权限错误。

图1.1

如果读者在开发过程中出现权限等问题,请按照本节的提示检查自己的环境。


二、使用FileSystem api 读写数据

  在hadoop 的HDFS 操作中,有个非常重要的api,是org.apache.hadoop.fs.FileSystem,这是我们用户代码操作HDFS 的直接入口,该类含有操作HDFS 的各种方法,类似于jdbc 中操作数据库的直接入口是Connection 类。



  那我们怎么获得一个FileSystem 对象

-------------------------------------------------------------------------------------------------------------------------------

String uri = "hdfs://10.1.14.24:9000/";
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(uri), conf);

-------------------------------------------------------------------------------------------------------------------------------
以上代码中,要注意调用的是FileSystem 的静态方法get,传递两个值给形式参数,第一个访问的HDFS 地址,该地址的协议是hdfs,ip 是10.1.14.24,端口是9000。这个地址的完整信息是在配置文件core-site.xml 中指定的,读者可以使用自己环境的配置文件中的设置。第二个参数是一个配置对象。



1. 创建文件夹
使用HDFS 的shell 命令查看一下根目录下的文件情况,如图2.1所示。

图2.1

我们在HDFS 的根目录下创建文件夹,代码如下

-------------------------------------------------------------------------------------------------------------------------------

final String pathString = "/d1";
            boolean exists = fs.exists(new Path(pathString));
            if(!exists){
            boolean result = fs.mkdirs(new Path(pathString));
            System.out.println(result);
            }

-------------------------------------------------------------------------------------------------------------------------------

以上代码中要放在Main函数中,

  • 第一行决定创建的文件夹完整路径是“/d1”。
  • 第二行代码是使用方法exitst判断文件夹是否存在;如果不存在,执行创建操作。
  • 第三行创建文件夹,调用的是mkdirs 方法,返回值是布尔值,如果是true,表示创建成功;如果是false,表示创建失败。

现在查看一下是否成功了,如图3.2,3.3可见创建成功了。


图3.2

图 3.3



2. 写文件



我们可以向HDFS 写入文件,代码如下:

-------------------------------------------------------------------------------------------------------------------------------

final String pathString = "/d1/f1";
final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString));//写出去
IOUtils.copyBytes(new ByteArrayInputStream("my name is Sunddenly".getBytes()),
fsDataOutputStream, conf, true);

-------------------------------------------------------------------------------------------------------------------------------
第一行代码表示创建的文件是在刚才创建的d1 文件夹下的文件f1;
第二行是调用create 方法创建一个通向HDFS 的输出流;
第三行是通过调用hadoop 的一个工具类IOUtils 的静态方法copyBytes 把一个字符串发送给输出流中。

该静态方法有四个参数:

  • 第一个参数输入流。
  • 第二个参数是输出流。
  • 第三个参数是配置对象。
  • 第四个参数是布尔值,如果是true 表示数据传输完毕后关闭流。

现在看一下是否创建成功了,如图3.4所示。

图3.4



3. 读文件



现在我们把刚才写入到HDFS 的文件“/d1/f1”读出来,代码如下:

-------------------------------------------------------------------------------------------------------------------------------
    final String pathString = "/d1/f1";
    final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));//读进来
    IOUtils.copyBytes(fsDataInputStream, System.out, conf, true);

-------------------------------------------------------------------------------------------------------------------------------

  • 第一行指定所读文件的路径。
  • 第二行表示调用方法open 打开一个指定的文件,返回值是一个通向该文件的输入流;
  • 第三行还是调用IOUtils.copyBytes 方法,输出的目的地是控制台。

见图3.5


图3.5



4. 查看目录列表和文件详细信息



我们可以把根目录下的所有文件和目录显示出来,代码如下

-------------------------------------------------------------------------------------------------------------------------------
    final String pathString = "/";
    final FileStatus[] listStatus = fs.listStatus(new Path(pathString));
    for (FileStatus fileStatus : listStatus) {
      final String type = fileStatus.isDir()?"目录":"文件";
      final short replication = fileStatus.getReplication();
      final String permission = fileStatus.getPermission() .toString();
      final long len = fileStatus.getLen();
      final Path path = fileStatus.getPath();
      System.out.println(type+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
    }

-------------------------------------------------------------------------------------------------------------------------------
  调用listStatus方法会得到一个指定路径下的所有文件和文件夹,每一个用FileStatus表示。我们使用for循环显示每一个FileStatus对象。FileStatus对象表示文件的详细信息,里面含有类型、副本数、权限、长度、路径等很多信息,我们只是显示了一部分。结果如图3.6所示。


图 3.6



5. 删除文件或目录



我们可以删除某个文件或者路径,代码如下

-------------------------------------------------------------------------------------------------------------------------------
    final String pathString = "/d1/f1";
    //fs.delete(new Path("/d1"), true);
    fs.deleteOnExit(new Path(pathString));

-------------------------------------------------------------------------------------------------------------------------------
第三行代码表示删除文件“/d1/f1”,注释掉的第二行代码表示递归删除目录“/d1”及下面的所有内容。除了上面列出的fs 的方法外,还有很多方法,请读者自己查阅api。

时间: 2024-10-11 11:03:38

Hadoop日记Day9---HDFS的java访问接口的相关文章

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

掌握HDFS的Java API接口访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 1.获取文件系统 1 /** 2 * 获取文件系统 3 * 4 * @return FileSystem 5 */ 6 public static FileSys

熟练掌握HDFS的Java API接口访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 通过Java API接口对HDFS进行操作,我将其整理成工具类,地址见底部 1.获取文件系统 1 /** 2 * 获取文件系统 3 * 4 * @return F

Hadoop HDFS (3) JAVA访问HDFS之二 文件分布式读写策略

先把上节未完成的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法可以列出一个目录下的内容. public FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException; public FileStatus[] listStatus(Path[] files) throws FileNot

hadoop学习笔记-HDFS的REST接口

在学习HDFS的过程中,重点关注了HDFS的REST访问接口.以前对REST的认识非常笼统,这次通过对HDFS的REST接口进行实际操作,形成很直观的认识. 1? 写文件操作 写文件操作分为两个命令,第一个命令先产生一个重定向(TEMPORARY_REDIRECT)响应报文,响应报文中的Location字段即为重定向的目标地址,这个目标地址指向的就是分配的datanode,用以存储后面写入的内容.第二个命令的URL写的就是第一个命令重定向的目标地址.(注意:在路径前面需要加"/webhdfs/v

Hadoop日记系列目录

下面是Hadoop日记系列的目录,由于目前时间不是很充裕,以后的更新的速度会变慢,会按照一星期发布一期的原则进行,希望能和大家相互学习.交流. 目录安排 1>  Hadoop日记Day1---Hadoop介绍 2>  Hadoop日记Day2---虚拟机中搭建Linux 3>  Hadoop日记Day3---Hadoop的伪分布式安装 4>  Hadoop日记Day4---去除HADOOP_HOME is deprecated 5>  Hadoop日记Day5---HDFS介

马士兵hadoop2.7.3_使用java访问hdfs

通过java程序访问hdfs: hdfs系统会把用到的数据存储在core-site.xml中由hadoop.tmp.dir指定,而这个值默认位于/tmp/hadoop-${user.name}下面, 由于/tmp目录在系统重启时候会被删除,所以应该修改目录位置. 修改core-site.xml(在所有站点上都修改) 1 2 3 4 5 <property>     <name>hadoop.tmp.dir</name>     <value>/var/had

在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务.我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口如何去访问C接口呢?众所周知,Java提供了JNI方法调用,同样,在Android系统中,Java应用程序通过

熟练掌握HDFS的Shell访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件 (可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 下面将介绍通过Shell接口对HDFS进行操作,HDFS处理文件的命令和Linux命令基本相同,这里区分大小写 目录 1.shell操作单个HDFS集群 2.s