一、搭建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 对象?

View Code

以上代码中,要注意调用的是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 shortreplication = fileStatus.getReplication();

final String permission = fileStatus.getPermission() .toString();

final long len= fileStatus.getLen();

final Pathpath = 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。

原文链接:http://www.cnblogs.com/sunddenly/p/3983090.html

java访问hdfs_HDFS的java访问接口相关推荐

  1. 使用Java HttpClient访问淘宝Ip查询接口获取具体位置信息

    以前项目中有需要用到过记录客户登入的IP地址,但是并木有具体去查询IP所在的位置, 于是带着好奇心去网上搜索获取IP的详细信息的接口.主要有两个IP查询接口: 1.新浪接口:http://counte ...

  2. java restful中文乱码_restful服务接口访问乱码 和 505错误

    标签: 用cxf 发部个rest服务,用浏览器访问和 HttpURLConnection 访问. 1. URL中有中文,浏览器访问正常,HttpURLConnection 失败. 解决: HttpUR ...

  3. java 修饰符 访问控制符_Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public classclassName { // body of class } private boo ...

  4. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  5. java修饰符总结,java访问修饰符总结

    java的访问修饰符 java面向对象的基本思想之一是封装细节并且公开接口. java采用访问修饰符来封装类的方法和属性的访问权限,从而向使用者暴露接口.隐藏细节. public -- 对所有类可见. ...

  6. 安卓的java无法访问网络_Android网络访问的基本方法

    Android访问网络的两种主要方式: 1.标准Java接口(java.net) ----HttpURLConnection,可以实现简单的基于URL请求.响应功能: 2.Apache接口(org.a ...

  7. java 修饰符 访问控制符_《Java基础知识》Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public classclassName {//body of class }private boolea ...

  8. java中有哪几种访问修饰符_Java语言中有4种访问修饰符

    转载:http://wuhaidong.iteye.com/blog/851754 Java语言中有4种访问修饰符 在Java语言中有4中访问修饰符:package(默认).private.publi ...

  9. java libusb_Windows下的Java访问USB设备解决之道(翻译Java libusb / libusb-win32 wrapper)收...

    Java libusb / libusb-win32 封装包 概要 Java libusb 封装包是对libsub和libusb-win32 USB library的Jave封装. libusb旨在创 ...

最新文章

  1. 程序员新手第一个python web开发框架
  2. 新站上线后应该做哪些有利于seo的工作
  3. 高性能WEB开发(6) - web性能测试工具推荐
  4. linux系统安装tv软件下载,达龙云电脑apk下载
  5. 云炬Android开发笔记 使用新版本Android studio快速Build低版本项目的仓库代码(标红部分)
  6. SVM熟练到精通4:偏离点与松弛变量
  7. Java面试题及答案,java底层实现原理
  8. 第六十八期:做中台找死,不做中台等死?
  9. 软件测试用例_大话软件测试用例要素
  10. oracle 11g 及 plsqldeveloper 相关操作
  11. Jenkins 教程(一)实现自动化打包及邮件通知
  12. Oracle 11gR2 中 示例用户 安装说明
  13. mybatis处理批量数据插入怎么处理效率最高
  14. LeetCode算法解析之“箭爆气球问题”
  15. 【多任务优化】DWA、DTP、Gradnorm(CVPR 2019、ECCV 2018、 ICML 2018)
  16. 成人c语言培训,C语言程序设计在成人教育中教学.doc
  17. 麒麟V10sp1轻松设置开机自启动脚本
  18. 解析彼岸图网图片—xpath简单应用
  19. Lifesaving with RescueChain: Energy-Efficient and Partition-Tolerant Blockchain Based UAV-Aided
  20. PRML第七章稀疏核机 (RVM)

热门文章

  1. [转]35岁前程序员要规划好的四件事,健康居首位
  2. php mkdir没有权限不能创建成功的问题
  3. .Net之美读书笔记15
  4. javascript简单性能问题及学习笔记
  5. 数据绑定控件Reperter
  6. SQLServer2K远程连接问题解决方案(转载自飞狐小屋)
  7. iOS 设计模式浅析 0 - 前言
  8. RocketMQ源码学习(六)-Name Server
  9. java 实现Active Object思想
  10. 2013-我的前事今生(完结篇)