HDFS的java操作:hdfs在生产应用中主要是客户端的开发,其核心步骤是从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件

一、搭建开发环境

1、引入依赖

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.1</version>
</dependency>

2、window下开发的说明注:如需手动引入jar包,hdfs的jar包----hadoop的安装目录的share

建议在linux下进行hadoop应用的开发,不会存在兼容性问题。如在window上做客户端应用开发,需要设置以下环境

  1. 在windows的某个目录下解压一个hadoop的安装包
  2. 将安装包下的lib和bin目录用对应windows版本平台编译的本地库替换
  3. 在window系统中配置HADOOP_HOME指向你解压的安装包
  4. 在windows系统的path变量中加入hadoop的bin目录

二、获取api中的客户端对象

在java中操作hdfs,首先要获得一个客户端实例

public class TestHDFS {Configuration conf = null;FileSystem fs = null;@Beforepublic void conn() throws IOException {conf = new Configuration();// conf.set("fs.defaultFS", "hdfs://192.168.18.103:9000");fs = FileSystem.get(conf);}@Afterpublic void close() throws IOException {fs.close();}
}

我们的操作目标是HDFS,所以获取到的fs对象应该是DistributedFileSystem的实例;

那么get方法是从何处判断具体实例化那种客户端类呢

——从conf中的一个参数 fs.defaultFS的配置值判断: 如果我们的代码中没有指定fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的jar包中的core-default.xml,默认值为: file:///,则获取的将不是一个DistributedFileSystem的实例,而是一个本地文件系统的客户端对象

三、DistributedFileSystem实例对象所具备的方法

四、客户端操作数据代码示例:

4.1、文件的增删改查

public class HdfsClient {FileSystem fs = null;@Beforepublic void init() throws Exception {// 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI// 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址// new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml// 然后再加载classpath下的hdfs-site.xmlConfiguration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://hdp-node01:9000");/*** 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置*/conf.set("dfs.replication", "3");// 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例// fs = FileSystem.get(conf);// 如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");}/*** 往hdfs上传文件** @throws Exception*/@Testpublic void testAddFileToHdfs() throws Exception {// 要上传的文件所在的本地路径Path src = new Path("g:/redis-recommend.zip");// 要上传到hdfs的目标路径Path dst = new Path("/aaa");fs.copyFromLocalFile(src, dst);fs.close();}/*** 从hdfs中复制文件到本地文件系统** @throws IOException* @throws IllegalArgumentException*/@Testpublic void testDownloadFileToLocal() throws IllegalArgumentException, IOException {fs.copyToLocalFile(new Path("/jdk-7u65-linux-i586.tar.gz"), new Path("d:/"));fs.close();}@Testpublic void testMkdirAndDeleteAndRename() throws IllegalArgumentException, IOException {// 创建目录fs.mkdirs(new Path("/a1/b1/c1"));// 删除文件夹 ,如果是非空文件夹,参数2必须给值truefs.delete(new Path("/aaa"), true);// 重命名文件或文件夹fs.rename(new Path("/a1"), new Path("/a2"));}/*** 查看目录信息,只显示文件** @throws IOException* @throws IllegalArgumentException* @throws FileNotFoundException*/@Testpublic void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {// 思考:为什么返回迭代器,而不是List之类的容器RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);while (listFiles.hasNext()) {LocatedFileStatus fileStatus = listFiles.next();System.out.println(fileStatus.getPath().getName());System.out.println(fileStatus.getBlockSize());System.out.println(fileStatus.getPermission());System.out.println(fileStatus.getLen());BlockLocation[] blockLocations = fileStatus.getBlockLocations();for (BlockLocation bl : blockLocations) {System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset());String[] hosts = bl.getHosts();for (String host : hosts) {System.out.println(host);}}System.out.println("--------------为angelababy打印的分割线--------------");}}/*** 查看文件及文件夹信息** @throws IOException* @throws IllegalArgumentException* @throws FileNotFoundException*/@Testpublic void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException {FileStatus[] listStatus = fs.listStatus(new Path("/"));String flag = "d--         ";for (FileStatus fstatus : listStatus) {if (fstatus.isFile())  flag = "f--     ";System.out.println(flag + fstatus.getPath().getName());}}
}

4.2、通过流的方式访问hdfs

/*** 相对那些封装好的方法而言的更底层一些的操作方式* 上层那些mapreduce   spark等运算框架,去hdfs中获取数据的时候,就是调的这种底层的api* @author**/
public class StreamAccess {    FileSystem fs = null;@Beforepublic void init() throws Exception {Configuration conf = new Configuration();fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");}@Testpublic void testDownLoadFileToLocal() throws IllegalArgumentException, IOException{               //先获取一个文件的输入流----针对hdfs上的FSDataInputStream in = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));//再构造一个文件的输出流----针对本地的FileOutputStream out = new FileOutputStream(new File("c:/jdk.tar.gz"));//再将输入流中数据传输到输出流IOUtils.copyBytes(in, out, 4096);              }/*** hdfs支持随机定位进行文件读取,而且可以方便地读取指定长度* 用于上层分布式运算框架并发处理数据* @throws IllegalArgumentException* @throws IOException*/@Testpublic void testRandomAccess() throws IllegalArgumentException, IOException{//先获取一个文件的输入流----针对hdfs上的FSDataInputStream in = fs.open(new Path("/iloveyou.txt"));                 //可以将流的起始偏移量进行自定义in.seek(22);                  //再构造一个文件的输出流----针对本地的FileOutputStream out = new FileOutputStream(new File("c:/iloveyou.line.2.txt"));IOUtils.copyBytes(in,out,19L,true);                  }                /*** 显示hdfs上文件的内容* @throws IOException* @throws IllegalArgumentException*/@Testpublic void testCat() throws IllegalArgumentException, IOException{                  FSDataInputStream in = fs.open(new Path("/iloveyou.txt"));IOUtils.copyBytes(in, System.out, 1024);}
}

4.3、场景编程

在mapreduce 、spark等运算框架中,有一个核心思想就是将运算移往数据,或者说,就是要在并发计算中尽可能让运算本地化,这就需要获取数据所在位置的信息并进行相应范围读取

以下模拟实现:获取一个文件的所有block位置信息,然后读取指定block中的内容

 @Testpublic void testCat() throws IllegalArgumentException, IOException{FSDataInputStream in = fs.open(new Path("/weblog/input/access.log.10"));//拿到文件信息FileStatus[] listStatus = fs.listStatus(new Path("/weblog/input/access.log.10"));//获取这个文件的所有block的信息BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(listStatus[0], 0L, listStatus[0].getLen());//第一个block的长度long length = fileBlockLocations[0].getLength();//第一个block的起始偏移量long offset = fileBlockLocations[0].getOffset();System.out.println(length);System.out.println(offset);//获取第一个block写入输出流
//       IOUtils.copyBytes(in, System.out, (int)length);byte[] b = new byte[4096];FileOutputStream os = new FileOutputStream(new File("d:/block0"));while(in.read(offset, b, 0, 4096)!=-1){os.write(b);offset += 4096;if(offset>=length) return;};os.flush();os.close();in.close();}

离线计算系统之HDFS Java API相关推荐

  1. HDFS Java API 操作

    文章目录 HDFS Java API操作 零.启动hadoop 一.HDFS常见类接口与方法 1.hdfs 常见类与接口 2.FileSystem 的常用方法 二.Java 创建Hadoop项目 1. ...

  2. Linux下Hadoop hdfs Java API使用

    0 前言 搞了大约2天时间终于把Linux下面Java API的使用给弄清楚了.做个笔记方便以后参考.环境如下所示 Hadoop:2.5.1 Linux:Ubuntu kylin eclipse:lu ...

  3. 分布式文件系统—HDFS—Java API操作

    原文作者:jiangw-Tony 原文地址:HDFS基础使用 hdfs 在生产应用中主要是客户端的开发,其核心步骤是从 hdfs 提供的 api 中构造一个 HDFS的访问客户端对象,然后通过该客户端 ...

  4. hdfs java api 读写文件操作_第十讲:通过JavaAPI对HDFS读写

    上一讲我们通过java api 接口对虚拟机里面的hdfs进行了新建文件夹.下面我们要进行其他的操作: 注,以下的所有内容都是在第九讲的代码的基础上的. 1.删除hdfs上面的文件夹 2.删除dhfs ...

  5. HDFS java API操作

    HDFS的javaAPI操作 目标:掌握如何使用API对HDFS上的目录和数据进行增.删.改.查操作. 1.idea创建maven工程 2.修改pom.xml文件如下: (需要下载jar包,时间可能稍 ...

  6. java hdfs创建文件_使用HDFS java api 创建文件出错。

    //创建文件核心代码 public static void createNewHDFSFile(String toCreateFilePath, String content) throws IOEx ...

  7. hadoop hdfs (java api)

    简单介绍使用java控制hdfs文件系统 一.注意namenode端访问权限,修改hdfs-site.xml文件或修改文件目录权限 本次采用修改hdfs-site.xml用于测试,在configura ...

  8. HDFS Java API 实践

    文章目录 1. 启动 Hadoop 集群 2. 使用 HDFS Shell 3. 使用 HDFS Web UI 4. 安装 Eclipse IDE 4.1 上传文件 4.2 查询文件位置 4.3 创建 ...

  9. hdfs java api读写

    如果想在win下下载hdfs的文件,需要安装hadoop的win版,因为写入磁盘的程序对linux和win编译结果不同 下载地址是: https://github.com/cdarlint/winut ...

最新文章

  1. Python打包PyPI上传实践
  2. Discuz!NT控件剖析 之 Button [原创: 附源码]
  3. 机器学习基础(1)——绪论
  4. Laravel的Class Laravel\Passport\Passport not found
  5. 10个用于处理日期和时间的 Python 库
  6. vscode输入vue自动_使用vscode,新建.vue文件,tab自动生成vue代码模板
  7. C语言switch如何退出,C语言萌新,想问问如何让下面那个switch函数输出的结果继续...
  8. 将有格式的int解析成float
  9. mysql取系统当前时间的函数
  10. 利用划分树求解整数区间内第K大的值
  11. WinCE应用程序产生Data Abort 错误分析
  12. lora发射和接收原理_无线收发模块LoRa
  13. python单元测试框架作用_Python单元测试框架:Pytest简介
  14. dll导出类比较好的方式
  15. 公司IT管理制度——案例分享
  16. 性别为什么不适合建立索引-值重复率高的字段不适合建索引
  17. Lucas-Kanade 算法原理以及应用
  18. bzoj2456瞎搞
  19. 搜狗百度seo推广优化需要注意的三大事项
  20. 近端梯度法(proximal gradient)

热门文章

  1. MATLAB中画曲线网格
  2. 中学计算机课小课题,小学信息技术学科小课题结题统计表已结题23个一等奖3.doc...
  3. 电脑桌面怎么恢复正常?
  4. 待时间嘉许,等春风得意(19年11月总结)
  5. C语言-泰勒级数求e
  6. [记录]hololens导出时报错 缺少命名空间“Windows.Devices.Haptics”
  7. 合并BIN文件的两种方法
  8. 二进制差分码规则_一篇文章弄明白Node.js与二进制数据流
  9. 网页设计作业-个人博客
  10. IDEA中把springboot项目中工具类打成jar包,其他项目进行依赖引用