《Hadoop MapReduce实战手册》一2.8 使用HDFS的Java API
本节书摘来异步社区《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程序执行文件系统操作。
- 下面的示例程序会在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();}
}
- 将上面的程序编译并打包成一个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>
- 可以在Hadoop上使用以下命令执行上述示例。使用hadoop脚本运行示例,可以确保它采用了当前配置的HDFS,并从Hadoop的类路径中加载了必要的依赖。
>bin/hadoop jar HDFSJavaAPI.jar HDFSJavaAPIDemo
hdfs://yourhost:9000
Welcome to HDFS Java API!!!
- 使用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相关推荐
- 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤
本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.4节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨卓 ...
- 《Hadoop MapReduce实战手册》一1.10 使用MapReduce监控UI
本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.10节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨 ...
- java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)
HDFS的Java API Java API介绍 将详细介绍HDFS Java API,一下节再演示更多应用. Java API 官网 如上图所示,Java API页面分为了三部分,左上角是包(Pac ...
- 使用HDFS客户端java api读取hadoop集群上的信息
本文介绍使用hdfs java api的配置方法. 1.先解决依赖,pom <dependency><groupId>org.apache.hadoop</groupId ...
- Hadoop HDFS 的 Java API 操作方式
想要使用Java API 的方式操作 Hadoop,尤其是hdfs(hadoop file system),必然需要引入jar包(jar包提供了丰富的API). 点中工程名, alt+enter,进入 ...
- HDFS中JAVA API的使用(hadoop的文件上传和下载)
HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...
- 阿里巴巴资深架构师熬几个通宵肛出来的Spark+Hadoop+中台实战pdf
Spark大数据分析实战 1.Spark简介 初识Spark Sp ark生态系统BDAS Sp ark架构与运行逻辑 弹性分布式数据集 2.Spark开发与环境配置 Spark应用开发环境2置 使用 ...
- Hadoop MapReduce的一些相关代码Code
MapReduce是一种分布式计算模型(distributed programming model),由Google于2004年左右提出,主要用于搜索领域,解决海量数据的计算问题. MapReduce ...
- 通过java api提交自定义hadoop 作业
通过API操作之前要先了解几个基本知识 一.hadoop的基本数据类型和java的基本数据类型是不一样的,但是都存在对应的关系 如下图 如果需要定义自己的数据类型,则必须实现Writable hado ...
最新文章
- quagga 简介 开源路由软件
- IDE / Qt / 浅谈 qmake 之 pro、pri、prf、prl文件
- 微信支付 - 提供支付中心商户订单查询
- idea点击表单按钮不做post反应
- Java 字符串分割陷阱
- java 刽子手游戏_java基础(九):容器
- UE4 异步资源加载
- 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
- linux tail 命令
- JavaScript设计模式之适配器模式
- 世界读书日 | 技术人不要错过的好书(IT前沿技术)
- macos 微信小助手
- 记一次小米手机安装Google Play(其他手机类似)
- OSPF协议基本原理笔记
- 看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?
- ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine
- Java线程中,Blocked,Wait,以及TIMED_WAIT的区别
- selenium - web 自动化测试
- 使用组策略将用户文件夹重定向到D盘
热门文章
- 普林斯顿算法-WordNet
- 使用wordnet找出同义词,并给出对应释义
- 一个简单漂亮好用的甘特图软件
- C语言 | 求a+aa+...+aa..a的值
- 一道中级运维的shell面试题
- linux如何清除系统日志,如何清除Linux系统日志
- 网页显示正在加载安全连接服务器,chrome内核的浏览器 打开网页巨慢 “正在建立安全连接” 解决方案...
- 【汇编】奇校验程序:输入一个字符,编写一个程序判断这个字符中1的个数,如果是偶数个1,则校验位(字符最高位)为1,如果是奇数个1,则校验位为0。并显示加入校验位前后该字符的二进制代码。
- linux sd卡挂载脚本,Linux下实现U盘、SD卡自动挂载功能 .
- 基于HTML5和WebGL的3D网络拓扑结构图