分布式文件系统—HDFS—Java API操作
原文作者: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操作相关推荐
- HDFS Java API 操作
文章目录 HDFS Java API操作 零.启动hadoop 一.HDFS常见类接口与方法 1.hdfs 常见类与接口 2.FileSystem 的常用方法 二.Java 创建Hadoop项目 1. ...
- HDFS java API操作
HDFS的javaAPI操作 目标:掌握如何使用API对HDFS上的目录和数据进行增.删.改.查操作. 1.idea创建maven工程 2.修改pom.xml文件如下: (需要下载jar包,时间可能稍 ...
- Hadoop详解(四):HDFS shell操作和Java API操作
1. HDFS环境准备 1.1 HDFS的格式化与启动 HDFS配置完之后就可以对其进行格式化操作.在NameNode所在机器上执行如下命令进行HDFS的格式化操作: hadoop namenode ...
- JAVA大数据(二) Hadoop 分布式文件系统HDFS 架构,MapReduce介绍,Yarn资源调度
文章目录 1.分布式文件系统HDFS 1.HDFS的来源 2.HDFS的架构图之基础架构 2.1 master/slave 架构 2.2 名字空间(NameSpace) 2.3 文件操作 2.4副本机 ...
- 大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门到熟练操作)
系列博客 1.大数据技术之Hadoop完全分布式集群搭建+Centos7配置连通外网和主机 2.大数据技术之Hadoop编译源码 3.大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门 ...
- Windows下使用Java API操作HDFS的常用方法
场景 Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS
场景 HDFS的访问方式之HDFS shell的常用命令: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218 在上 ...
- Hbase 完全分布式模式的搭建、命令行操作、Java API操作
追风赶月莫停留,平芜尽处是春山. 文章目录 追风赶月莫停留,平芜尽处是春山. 环境 Hbase 完全分布式模式的搭建 一.下载安装包,解压到合适位置: 二.配置相关的文件: 三.将Hbase复制到其他 ...
- Hadoop读书笔记(三)Java API操作HDFS
Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的sh ...
最新文章
- 单机训练速度提升高达640倍,快手开发GPU广告模型训练平台
- 非常全面的AutoML资源,看这个就够了!
- SpringBoot第十五篇:Springboot整合RabbitMQ
- this指向undefined uiapp_JavaScript深入之史上最全5种this绑定全面解析
- 制作Windows Server 2008安装启动U盘
- 服务器错误重启mysql错误信息,mysql开启和使用事件、与服务器重启mysql错误
- MATLAB是一种面向数值计算,MATLAB是一种面向数值计算的高级程序设计语言。
- Compress、tar、gzip、zcat、bzip2、bzcat、打包解压命令行
- eclipse如何设置自己喜欢的主题
- android tv 文件管理,电视必备!5款文件管理器强力推荐
- 网络用户管理系统php,php之用户管理系统的实现!(从简单到复杂)
- 【车间调度】改进的帝国企鹅算法求解车间调度问题【含Matlab源码 2041期】
- Enolsoft PDF Converter with OCR Mac(PDF格式转换及OCR识别软件)
- linux 常用命令,持续更新中~
- 阿里巴巴与雅虎的关系
- 推荐丨t.cn/…、dwz.cn/…、url.cn/… 等短网址链接的还原工具
- scite php配置 下载,SciTE 的配置记录
- 五类医学图像分类 深度学习
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
- 几种常见的黑客攻击手段
热门文章
- 英语笔记-20151209
- fgets()与gets()的区别
- JSP页面的继承(extends)
- Eclipse 常用快捷键
- C# 语法练习(4): 类型转换
- owaspbwa tickets
- It is possible that this issue is resolved by uninstalling an existi
- 【转】Windows8不联网直接安装.Net 3.5 Framework的方法
- 一个sql引起的服务器性能下降
- AJPFX实例集合嵌套之ArrayList嵌套ArrayList