HDFS的JAVA API操作

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

主要类

Configuration

  • 其实就是我们Java项目的core-site.xml文件,就像安装Hadoop时要配置core-site.xml文件一样,我们的java项目也要正确配置才能连接Hadoop。

  • 在实例化的时候,Configuration类会自动读取:

    • core-default.xml(不需要我们增加)

    • core-site.xml(我们配置)

    • 其实和Hadoop配置一样,core-site没配置的时候,就取默认的core-default.xml里的配置。

  • Configuration类除了自动读取配置文件以外,还提供了一系列操作配置的方法,可以在程序里修改配置(而不是修改配置文件)。

FileSystem

  • 类似Hadoop shell,对文件操作,通过该类可以对文件进行CRUD。

  • 和Hadoop shell一样,可以对Hadoop支持的文件系统操作。

  • 无参构造器是protected的,一般使用get方法获取该类的对象。

    • get方法获取对象有4种重写,一般我们只会用两种,见下文。

示例代码

1.建立Maven项目,导入基本依赖

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

2.在resources文件夹下建立core-site.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.98.129:9000</value>
</property>
</configuration>
  • 备注:Hadoop中似乎已经封装了log4j日志,可以把log4j.properties也添加进去,否则log4j就一直报找不到配置文件。不加也可以。

3.建立测试类

1.基本使用

package com.rzp.hdfs;
//注意导入的包一定要正确
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class TestHDFSClient {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {

//实例化Configuration
Configuration conf = new Configuration();
//使用root用户登录,如果不写,会用当前程序运行环境的用户登录,比如windows的Administrator用户导致报错
System.setProperty("HADOOP_USER_NAME","root");
//查看core-site.xml文件中fs.defaultFS的值
System.out.println(conf.get("fs.defaultFS"));
//第一种获取FileSystem的对象的方式,通过get(conf)方法,
FileSystem fs1 = FileSystem.get(conf);
//在根目录下增加/helloByJava文件夹
fs1.create(new Path("/helloByJava"));
//关闭连接
fs1.close;
}
}
  • 测试结果:输出了配置中的值,Hadoop根目录下也增加对应文件夹,说明连接成功。

2.通过set方法,修改conf的参数

    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {

        Configuration conf = new Configuration();
//set方法,修改conf的参数,可以把core-site.xml文件删除测试
conf.set("fs.defaultFS","hdfs://192.168.98.129:9000"); System.setProperty("HADOOP_USER_NAME","root");
System.out.println(conf.get("fs.defaultFS"));
FileSystem fs1 = FileSystem.get(conf);
fs1.create(new Path("/helloByJava"));
}

3.第二种FileSystem实例化的方法,指定用户的get方法

    public void test1() throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
//直接指定操作该对象的用户名
FileSystem fs1 = FileSystem.get(new URI("hdfs://192.168.98.129:9000"),conf,"root");
fs1.create(new Path("/helloByJava"));
//关闭连接
fs1.close;
}

FileSystem的主要方法

  • copyToLocalFile--下载文件到本地

    @Test
public void test2() throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.98.129:9000"),conf,"root");
     //第一个地址是Hadoop路径,第二个地址是本地路径
      fs.copyToLocalFile(new Path("/install.log.syslog"),new Path("./log")); 
  } ​
  • copyFromLocalFile 上传文件

static FileSystem fs = null;
public static void init() throws Exception {
Configuration conf = new Configuration();
fs = FileSystem.get(new URI("hdfs://192.168.98.129:9000"), conf, "root");
}

@Test
public void testAddFileToHdfs() throws Exception {
HdfsClient.init();
  //第一个地址是本地路径,第二个地址是Hadoop的路径
  fs.copyFromLocalFile(new Path("D:\\log.log"), new Path("/")); fs.close(); 
}
  • 文件CRUD

@Test
public void testMkdirAndDeleteAndRename() throws Exception {
HdfsClient.init(); // 创建目录
fs.mkdirs(new Path("/a1/b1/c1"));
fs.mkdirs(new Path("/d1"));
// 删除文件,如果是非空文件夹,参数2必须给值true
fs.delete(new Path("/a1"), true);
// 重命名文件或文件夹
fs.rename(new Path("/d1"), new Path("/d2"));
fs.close();
}
  • 查看目录(该部分笔者还没梳理完,所以没有注释,梳理完再修改)

    /**
* 查看目录信息,只显示文件
*
* @throws IOException
* @throws IllegalArgumentException
* @throws FileNotFoundException
*/
@Test
public void testListFiles() throws Exception {
HdfsClient.init();
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("--------------打印的分割线--------------");
}

}

/**
* 查看文件及文件夹信息
*
* @throws IOException
* @throws IllegalArgumentException
* @throws FileNotFoundException
*/
@Test
public void testListAll() throws Exception {
HdfsClient.init();
FileStatus[] listStatus = fs.listStatus(new Path("/"));
String flag = "";
for (FileStatus fstatus : listStatus) {
if (fstatus.isFile()) {
flag = "f-- ";
} else {
flag = "d-- ";
}
System.out.println(flag + fstatus.getPath().getName());
System.out.println(fstatus.getPermission());
}
}

Hadoop(五):HDFS的JAVA API基本操作的更多相关文章

  1. Hadoop之HDFS(三)HDFS的JAVA API操作

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

  2. HDFS中JAVA API的使用

    HDFS中JAVA API的使用   HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...

  3. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  4. HDFS的Java API

    HDFS Java API 可以用于任何Java程序与HDFS交互,该API使我们能够从其他Java程序中利用到存储在HDFS中的数据,也能够使用其他非Hadoop的计算框架处理该数据 为了以编程方式 ...

  5. hadoop学习笔记(五):java api 操作hdfs

    HDFS的Java访问接口 1)org.apache.hadoop.fs.FileSystem 是一个通用的文件系统API,提供了不同文件系统的统一访问方式. 2)org.apache.hadoop. ...

  6. 使用HDFS客户端java api读取hadoop集群上的信息

    本文介绍使用hdfs java api的配置方法. 1.先解决依赖,pom <dependency> <groupId>org.apache.hadoop</groupI ...

  7. hadoop学习(五)----HDFS的java操作

    前面我们基本学习了HDFS的原理,hadoop环境的搭建,下面开始正式的实践,语言以java为主.这一节来看一下HDFS的java操作. 1 环境准备 上一篇说了windows下搭建hadoop环境, ...

  8. [转]HDFS中JAVA API的使用

    HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...

  9. Sample: Write And Read data from HDFS with java API

    HDFS: hadoop distributed file system 它抽象了整个集群的存储资源,可以存放大文件. 文件采用分块存储复制的设计.块的默认大小是64M. 流式数据访问,一次写入(现支 ...

随机推荐

  1. python第一次作业

    import turtle turtle.pensize(2) turtle.pencolor("black") turtle.fillcolor("red") ...

  2. ggplot2(11) 总结回顾&案例练习

    从2020年2月20到2月27日,3月13日到2020年3月16日,学习了ggplot2:数据分析与图形艺术(哈德利·威克姆 著 统计之都 译),历时12天.另外,3月6日到3月9日参加了美赛,也用到 ...

  3. C语言程序设计(三) 简单的算术运算和表达式

    第三章 简单的算术运算和表达式 算数运算符:一元.二元.三元(条件运算符) 1/2是整型除法,1.0/2是浮点数除法 求余运算(%)限定参与运算的两个操作数必须为整数,不能对两个实型数据进行求余运算 ...

  4. php里面的一些面试经典的函数

    <?php /* 这是一个多线程的读取解决的函数 @param1 $fle 传入要读取的文件名 */ function filelock($fle){ $fp=fopen($fls,'w+'); ...

  5. Windows下EDK2环境的搭建以及经典的程序设计Print Hello World !-----(Linux下的待后续熟练了再更新)

    很久没有更新博客了,之前的博客末尾有提到过要写有关EDK2环境搭建的博客,现在就是完成的时候了,后续博客更新会比较规律(大概每周一篇?) 本人博客仅仅发表于博客园,本人主页为         http ...

  6. SpringBoot——Cache使用原理及Redis整合

    前言及核心概念介绍 前言 本篇主要介绍SpringBoot2.x 中 Cahe 的原理及几个主要注解,以及整合 Redis 作为缓存的步骤 核心概念 先来看看核心接口的作用及关系图: CachingP ...

  7. Mac OS X 10.13上 安装odoo 11.0开发环境

    0.准备假设homebrew已经安装好没安装的需要先安装,见下面链接http://brew.sh/ 1.安装PostgreSQL$ brew tap homebrew/services$ brew i ...

  8. anconda添加镜像源

    # anaconda 安装镜像源 ***     在使用安装 conda 安装某些包会出现慢或安装失败问题,最有效方法是修改镜     像源为国内镜像源.     之前都选用清华镜像源,但是2019年 ...

  9. Web的服务器和Javaweb结构

    上一节介绍了Eclipse中集成Tomcat环境搭建及javaweb项目的创建,下面说说什么是web服务器及javaweb的结构. 1.web应用的演变 1.1 b/s与c/s模式 B/S:Brows ...

  10. 环境篇:Docker

    环境篇:Docker www.docker.com Docker 是什么? Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache协议的开源,让开发者可以打包他们的应用以及依赖包到一个 ...