原文作者:jiangw-Tony

原文地址:HDFS基础使用

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

一、环境搭建

1、创建一个Maven工程HdfsClientDemo

2、在该项目的pom.xml文件中添加以下代码:导入相应的依赖坐标+日志添加

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.8.2</version></dependency>
</dependencies>

3、在java下创建了cn.itcast.hdfs包,在目录下新建了Java文件

到此表示,我们利用 HDFS 的 api 编写业务代码所依赖的 jar 包都添加完成,接下来便可以愉快的玩耍代码了。

二、FileSystem实例获取讲解(重点)

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

  • Configuration conf = new Configuration()
  • FileSystem fs = FileSystem.get(conf)

而我们的操作目标是 HDFS,所以获取到的 fs 对象应该是 DistributedFileSystem 的实例;get 方法是从何处判断具体实例化哪种客户端类呢?从 conf 中的一个参数 fs.defaultFS 的配置值判断;如果我们的代码中没有指定 fs.defaultFS,并且工程 classpath 下也没有给定相应的配置,conf中的默认值就来自于 hadoop 的 jar 包中的 core-default.xml,默认值为: file:///,则获取的将不是一个 DistributedFileSystem 的实例,而是一个本地文件系统的客户端对象。

DistributedFileSystem实例所具备的方法如下:

三、HDFS常用JAVA API代码演示

1. 建立文件夹

2. 上传文件

3. 下载文件

4. 删除文件或文件夹

5.重命名文件或者文件夹

6.查看目录信息,只显示该文件夹下的文件信息

7.查看文件及文件夹信息

四、HDFS流式数据访问

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;/**
* 相对那些封装好的方法而言的更底层一些的操作方式 上层那些 mapreduce spark 等运算
框架,去 hdfs 中获取数据的时候,就是调的这种底层的 api
*/
public class StreamAccess {FileSystem fs = null;@Beforepublic void init() throws Exception {Configuration conf = new Configuration();System.setProperty("HADOOP_USER_NAME", "root");conf.set("fs.defaultFS", "hdfs:// hadoop01:9000");fs = FileSystem.get(conf);// fs = FileSystem.get(new URI("hdfs://hadoop01: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);}@Testpublic void testUploadByStream() throws Exception {// hdfs 文件的输出流FSDataOutputStream fsout = fs.create(new Path("/aaa.txt"));// 本地文件的输入流FileInputStream fsin = new FileInputStream("c:/111.txt");IOUtils.copyBytes(fsin, fsout, 4096);}/*** hdfs 支持随机定位进行文件读取,而且可以方便地读取指定长度 用于上层分布式运算框架并发处理数据*/@Testpublic void testRandomAccess() throws IllegalArgumentException, IOException {// 先获取一个文件的输入流----针对 hdfs 上的FSDataInputStream in = fs.open(new Path("/iloveyou.txt"));// 可以将流的起始偏移量进行自定义in.seek(22);// 再构造一个文件的输出流----针对本地的FileOutputStream out = new FileOutputStream(new File("d:/iloveyou.line.2.txt"));IOUtils.copyBytes(in, out, 19L, true);}
}

五、经典案例

在 mapreduce 、spark 等运算框架中,有一个核心思想就是将运算移往数据,或者说,就是要在并发计算中尽可能让运算本地化,这就需要获取数据所在位置的信息并进行相应范围读取。以下模拟实现:获取一个文件的所有 block 位置信息,然后读取指定 block 中的内容。

@Test
public 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. HDFS java API操作

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

  3. Hadoop详解(四):HDFS shell操作和Java API操作

    1. HDFS环境准备 1.1 HDFS的格式化与启动 HDFS配置完之后就可以对其进行格式化操作.在NameNode所在机器上执行如下命令进行HDFS的格式化操作: hadoop namenode ...

  4. JAVA大数据(二) Hadoop 分布式文件系统HDFS 架构,MapReduce介绍,Yarn资源调度

    文章目录 1.分布式文件系统HDFS 1.HDFS的来源 2.HDFS的架构图之基础架构 2.1 master/slave 架构 2.2 名字空间(NameSpace) 2.3 文件操作 2.4副本机 ...

  5. 大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门到熟练操作)

    系列博客 1.大数据技术之Hadoop完全分布式集群搭建+Centos7配置连通外网和主机 2.大数据技术之Hadoop编译源码 3.大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门 ...

  6. Windows下使用Java API操作HDFS的常用方法

    场景 Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  7. Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

    场景 HDFS的访问方式之HDFS shell的常用命令: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218 在上 ...

  8. Hbase 完全分布式模式的搭建、命令行操作、Java API操作

    追风赶月莫停留,平芜尽处是春山. 文章目录 追风赶月莫停留,平芜尽处是春山. 环境 Hbase 完全分布式模式的搭建 一.下载安装包,解压到合适位置: 二.配置相关的文件: 三.将Hbase复制到其他 ...

  9. Hadoop读书笔记(三)Java API操作HDFS

    Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的sh ...

最新文章

  1. 单机训练速度提升高达640倍,快手开发GPU广告模型训练平台
  2. 非常全面的AutoML资源,看这个就够了!
  3. SpringBoot第十五篇:Springboot整合RabbitMQ
  4. this指向undefined uiapp_JavaScript深入之史上最全5种this绑定全面解析
  5. 制作Windows Server 2008安装启动U盘
  6. 服务器错误重启mysql错误信息,mysql开启和使用事件、与服务器重启mysql错误
  7. MATLAB是一种面向数值计算,MATLAB是一种面向数值计算的高级程序设计语言。
  8. Compress、tar、gzip、zcat、bzip2、bzcat、打包解压命令行
  9. eclipse如何设置自己喜欢的主题
  10. android tv 文件管理,电视必备!5款文件管理器强力推荐
  11. 网络用户管理系统php,php之用户管理系统的实现!(从简单到复杂)
  12. 【车间调度】改进的帝国企鹅算法求解车间调度问题【含Matlab源码 2041期】
  13. Enolsoft PDF Converter with OCR Mac(PDF格式转换及OCR识别软件)
  14. linux 常用命令,持续更新中~
  15. 阿里巴巴与雅虎的关系
  16. 推荐丨t.cn/…、dwz.cn/…、url.cn/… 等短网址链接的还原工具
  17. scite php配置 下载,SciTE 的配置记录
  18. 五类医学图像分类 深度学习
  19. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
  20. 几种常见的黑客攻击手段

热门文章

  1. 英语笔记-20151209
  2. fgets()与gets()的区别
  3. JSP页面的继承(extends)
  4. Eclipse 常用快捷键
  5. C# 语法练习(4): 类型转换
  6. owaspbwa tickets
  7. It is possible that this issue is resolved by uninstalling an existi
  8. 【转】Windows8不联网直接安装.Net 3.5 Framework的方法
  9. 一个sql引起的服务器性能下降
  10. AJPFX实例集合嵌套之ArrayList嵌套ArrayList