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. 0318 guava并发工具

    并发是一个难题,但是可以通过使用强力简单的抽象来显著的简化,为了简化问题,guava扩展了Future接口,即 ListenableFuture (可以监听的Future).我强烈建议你在你的所有代码 ...

  2. 深入理解“骑士”漏洞 VoltJockey

    先理解一下题目:VoltJockey: Breaching TrustZone by Software-Controlled Voltage Manipulation over Multi-core ...

  3. webstorm 开新项目 setting 设置@目录别名 add @ (languages & Framewors - Javascript - Webpack 4. setting eslint enable

    webstorm 开新项目 setting 设置@目录别名 add @ (languages & Framewors - Javascript - Webpack 4. setting esl ...

  4. 【分布式锁】03-使用Redisson实现RedLock原理

    前言 前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的. RedLock原理 RedLock是基于redis实现的分布式锁,它能够保证以 ...

  5. sql语句的基本用法总结

    一.sql语法 select */列名1,列名2... from 表名[连接查询 内连接/左连接 on条件] 必选的 where 条件 子查询/in/exists/between ... and .. ...

  6. 第三届上海市大学生网络安全大赛 流量分析 WriteUp

    题目链接: https://pan.baidu.com/s/1Utfq8W-NS4AfI0xG-HqSbA 提取码: 9wqs 解题思路: 打开流量包后,按照协议进行分类,发现了存在以下几种协议类型: ...

  7. zabbix笔记_002

    监控登录用户 监控图形配置 创建图形: 配置完成后查看图形: 创建触发器配置 创建完成后可以查看 监控磁盘IO I/O查看工具: istat 安装[需要epel源]: yum install -y s ...

  8. 进制-Adding Two Negabinary Numbers

    2020-02-20 14:52:41 问题描述: 问题求解: 最开始的想法是将两个数字先转化成自然数在求和,最后转化回去,但是实际上这种方案是不可取的,主要的问题就是会爆掉. 那么就得按位进行运算了 ...

  9. HDU 4325 Flowers 树状数组+离散化

    Flowers Problem Description As is known to all, the blooming time and duration varies between differ ...

  10. 热点 | github近期热点项目汇总

    本文是近期Github热点项目的汇总,如果你想了解更多优秀的github项目,请关注我们公众号的github系列文章. 推荐 | 7个你最应该知道的机器学习相关github项目 热点 | 六月Gith ...