本节书摘来异步社区《Hadoop MapReduce实战手册》一书中的第2章,第2.8节,作者: 【美】Srinath Perera , Thilina Gunarathne 译者: 杨卓荦 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.8 使用HDFS的Java API

Hadoop MapReduce实战手册
HDFS Java API可用于任何Java程序与HDFS交互。该API使我们能够从其他Java程序中利用到存储在HDFS中的数据,也能够使用其他非Hadoop的计算框架处理该数据。有时,可能也会遇到要直接从MapReduce应用程序中访问HDFS的用例。但是,如果你是在HDFS中直接通过map或reduce任务写入或修改文件,那么你要知道,这样做实际上违反了MapReduce构架的无副作用的本质,可能会导致某些用例出现数据一致性问题。

准备工作
设置HADOOP_HOME环境变量指向Hadoop的安装根目录。

操作步骤
下列步骤显示了如何使用HDFS的Java API来对HDFS集群使用Java程序执行文件系统操作。

  1. 下面的示例程序会在HDFS中创建一个新文件,写一些文本内容到新建文件,并从HDFS中读回该文件:
importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FSDataInputStream;
importorg.apache.hadoop.fs.FSDataOutputStream;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;public class HDFSJavaAPIDemo {public static void main(String[] args) throws IOException {Configuration conf = new Configuration();FileSystemfs = FileSystem.get(conf);System.out.println(fs.getUri());Path file = new Path("demo.txt");if (fs.exists(file)) {System.out.println("File exists.");} else {// Writing to fileFSDataOutputStreamoutStream = fs.create(file);outStream.writeUTF("Welcome to HDFS Java API!!!");outStream.close();}// Reading from fileFSDataInputStreaminStream = fs.open(file);String data = inStream.readUTF();System.out.println(data);inStream.close();fs.close();}
}
  1. 将上面的程序编译并打包成一个JAR包。解压本章提供的源码包,转到HDFS_Java_API文件夹,然后运行Ant构建即可。HDFSJavaAPI.jar文件将在build文件夹中被创建。
>cd HDFS_java_API
>ant

可以使用下面的Ant构建文件来编译上面的示例程序:

<project name="HDFSJavaAPI" default="compile" basedir="."><property name="build" location="build"/><property environment="env"/><path id="hadoop-classpath"><filesetdir="${env.HADOOP_HOME}/lib"><include name="**/*.jar"/></fileset><filesetdir="${env.HADOOP_HOME}"><include name="**/*.jar"/></fileset></path><target name="compile"><mkdirdir="${build}"/><javacsrcdir="src" destdir="${build}"><classpathrefid="hadoop-classpath"/></javac><jar jarfile="HDFSJavaAPI.jar" basedir="${build}"/></target><target name="clean"><delete dir="${build}"/></target>
</project>
  1. 可以在Hadoop上使用以下命令执行上述示例。使用hadoop脚本运行示例,可以确保它采用了当前配置的HDFS,并从Hadoop的类路径中加载了必要的依赖。
>bin/hadoop jar HDFSJavaAPI.jar HDFSJavaAPIDemo
hdfs://yourhost:9000

Welcome to HDFS Java API!!!

  1. 使用ls命令列出新创建的文件:
>/bin/hadoopfs -ls
Found 1 items
-rw-r--r-- 3 foosupergroup     20 2012-04-27 16:57 /user/
foo/demo.txt

工作原理
为了以编程方式与HDFS进行交互,首先需要得到当前配置文件系统的句柄。实例化一个Configuration对象,并获得一个Hadoop环境中的FileSystem句柄,它将指向当前环境的HDFS NameNode。有几种替代配置FileSystem对象的方法,将在本节的“更多参考”中的“配置文件系统对象”中讨论。

Configuration conf = new Configuration();
FileSystemfs = FileSystem.get(conf);

FileSystem.create(filePath)方法会在指定的路径创建一个新的文件,并提供一个到新创建的文件的FSDataOutputStream对象。FSDataOutputStream封装了java.io.DataOutputStream,并允许程序向文件中写入基本Java数据类型。如果该文件存在,FileSystem.Create()方法将覆盖该文件。在这个例子中,该文件将在HDFS中相对于用户的主目录进行创建,产生类似/user//demo.txt的路径。

Path file = new Path("demo.txt");
FSDataOutputStreamoutStream = fs.create(file);
outStream.writeUTF("Welcome to HDFS Java API!!!");
outStream.close();

FileSystem.open(filePath)打开给定文件的FSDataInputStream。FSDataInputStream封装了java.io.DataInputStream,允许程序从文件中读取基本Java数据类型。

FSDataInputStreaminStream = fs.open(file);
String data = inStream.readUTF();
System.out.println(data);
inStream.close();

更多参考
HDFS的Java API支持的文件系统操作比我们在上面的示例中用到的多得多。完整的API文档可以在
http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html找到。

配置文件系统对象
我们也可以在Hadoop的环境之外使用HDFS的Java API。当这样做时,必须显式配置HDFS的NameNode和端口。以下是几种进行该项配置的方法。

可以通过如下方式在获得FileSystem对象之前加载Configuration对象的配置文件。但需要确保将所有的Hadoop和依赖库都添加到类路径中。

Configuration conf = new Configuration(); conf.addResource(new Path("..._/hadoop/conf/core-site.xml_"));conf.addResource(new Path("..._/hadoop/conf/hdfs-site.xml_"));FileSystemfileSystem = FileSystem.get(conf);

还可以通过如下方式指定NameNode和端口。将NAMENODE_HOSTNAME和PORT替换为HDFS安装的NameNode的主机名和端口。

Configuration conf = new Configuration();conf.set("fs.default.name", "hdfs://NAMENODE_HOSTNAME:PORT");FileSystemfileSystem = FileSystem.get(conf);

HDFS的文件系统API,是一种支持多个文件系统的抽象。如果上述程序无法找到有效的HDFS配置,它将会指向本地文件系统,而不是HDFS。可以通过如下方式使用getUri()函数识别FileSystem对象的当前文件系统。在使用正确的HDFS配置文件的情况下,会返回hdfs://your_namenode:port,在使用本地文件系统的情况下,则会返回file:///。

fileSystem.getUri();

获取文件的数据块列表
FileSystem对象的getFileBlockLocations()函数,可以用来获取存储在HDFS中的文件数据块的列表,同时也可以获取存储块的主机名和块的偏移量。如果计划使用Hadoop MapReduce之外的其他框架来执行文件数据的任何数据本地化操作,那么这些信息将会非常有用。

FileStatusfileStatus = fs.getFileStatus(file);
BlockLocation[] blocks = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());

《Hadoop MapReduce实战手册》一2.8 使用HDFS的Java API相关推荐

  1. 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤

    本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.4节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨卓 ...

  2. 《Hadoop MapReduce实战手册》一1.10 使用MapReduce监控UI

    本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.10节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨 ...

  3. java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)

    HDFS的Java API Java API介绍 将详细介绍HDFS Java API,一下节再演示更多应用. Java API 官网 如上图所示,Java API页面分为了三部分,左上角是包(Pac ...

  4. 使用HDFS客户端java api读取hadoop集群上的信息

    本文介绍使用hdfs java api的配置方法. 1.先解决依赖,pom <dependency><groupId>org.apache.hadoop</groupId ...

  5. Hadoop HDFS 的 Java API 操作方式

    想要使用Java API 的方式操作 Hadoop,尤其是hdfs(hadoop file system),必然需要引入jar包(jar包提供了丰富的API). 点中工程名, alt+enter,进入 ...

  6. HDFS中JAVA API的使用(hadoop的文件上传和下载)

    HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...

  7. 阿里巴巴资深架构师熬几个通宵肛出来的Spark+Hadoop+中台实战pdf

    Spark大数据分析实战 1.Spark简介 初识Spark Sp ark生态系统BDAS Sp ark架构与运行逻辑 弹性分布式数据集 2.Spark开发与环境配置 Spark应用开发环境2置 使用 ...

  8. Hadoop MapReduce的一些相关代码Code

    MapReduce是一种分布式计算模型(distributed programming model),由Google于2004年左右提出,主要用于搜索领域,解决海量数据的计算问题. MapReduce ...

  9. 通过java api提交自定义hadoop 作业

    通过API操作之前要先了解几个基本知识 一.hadoop的基本数据类型和java的基本数据类型是不一样的,但是都存在对应的关系 如下图 如果需要定义自己的数据类型,则必须实现Writable hado ...

最新文章

  1. quagga 简介 开源路由软件
  2. IDE / Qt / 浅谈 qmake 之 pro、pri、prf、prl文件
  3. 微信支付 - 提供支付中心商户订单查询
  4. idea点击表单按钮不做post反应
  5. Java 字符串分割陷阱
  6. java 刽子手游戏_java基础(九):容器
  7. UE4 异步资源加载
  8. 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
  9. 贪心/思维题 UVA 11292 The Dragon of Loowater
  10. linux tail 命令
  11. JavaScript设计模式之适配器模式
  12. 世界读书日 | 技术人不要错过的好书(IT前沿技术)
  13. macos 微信小助手
  14. 记一次小米手机安装Google Play(其他手机类似)
  15. OSPF协议基本原理笔记
  16. 看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?
  17. ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine
  18. Java线程中,Blocked,Wait,以及TIMED_WAIT的区别
  19. selenium - web 自动化测试
  20. 使用组策略将用户文件夹重定向到D盘

热门文章

  1. 普林斯顿算法-WordNet
  2. 使用wordnet找出同义词,并给出对应释义
  3. 一个简单漂亮好用的甘特图软件
  4. C语言 | 求a+aa+...+aa..a的值
  5. 一道中级运维的shell面试题
  6. linux如何清除系统日志,如何清除Linux系统日志
  7. 网页显示正在加载安全连接服务器,chrome内核的浏览器 打开网页巨慢 “正在建立安全连接” 解决方案...
  8. 【汇编】奇校验程序:输入一个字符,编写一个程序判断这个字符中1的个数,如果是偶数个1,则校验位(字符最高位)为1,如果是奇数个1,则校验位为0。并显示加入校验位前后该字符的二进制代码。
  9. linux sd卡挂载脚本,Linux下实现U盘、SD卡自动挂载功能 .
  10. 基于HTML5和WebGL的3D网络拓扑结构图