通过java的api对hdfs的资源进行操作

代码:上传、下载、删除、移动/修改、文件详情、判断目录or文件、IO流操作上传/下载

package com.atguigu.hdfsdemo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays; /*
* 1.创建FileSystem对象
* 2.操作资源
* 3.关闭资源
* 4.配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
*/
public class HdfsDemo {
FileSystem fs;
Configuration conf; //1.创建Filesystem对象
@Before
public void createFileSystem() throws IOException, InterruptedException {
//配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
conf = new Configuration();
//conf.set("dfs.replication","1"); //设置副本数
// 获取filesystem对象
fs = FileSystem.get(URI.create("hdfs://hadoop102:9820"), conf, "atguigu");
} //3.关闭资源
@After
public void closeResource() throws IOException {
if (fs != null) {
fs.close();
}
} /**
* 上传文件
*
* @throws IOException
*/
@Test
public void upload() throws IOException {
/**
* boolean delSrc:是否删除源文件
* boolean overwrite:如果目标地址如果已经存在和上传对象一样名字的文件是否覆盖;如果为true,那么就覆盖;如果为false但名字又相同那么就抛异常
* Path src:源文件
* Path dst:目标地址
*/
fs.copyFromLocalFile(false, false, new Path("F:/sanguo.txt"), new Path("/user"));
} /**
* 文件下载
*
* @throws IOException
*/
@Test
public void download() throws IOException {
/**
* boolean delSrc:是否删除源文件
* Path src:源文件
* Path dst:目标地址
* boolean useRawLocalFileSystem :就否使用crc校验
*/
fs.copyToLocalFile(false, new Path("/user/aaa.txt"), new Path("F:/"), true);
} /**
* 删除文件夹
*
* @throws IOException
*/
@Test
public void deleteDir() throws IOException {
/**
* Path f:删除的路径
* boolean recursive :是否递归?
* 如果删除的是目录那么必须是true,否则抛异常
* 如果删除的是文件那么true和false都可以
*/
boolean result = fs.delete(new Path("/deleteDir"), true);
System.out.println("文件是否删除成功:" + result);
} /**
* 移动文件、修改文件名
*/
@Test
public void moveOrUpdateName() throws IOException {
//移动文件
boolean result = fs.rename(new Path("/rename.txt"), new Path("/user/"));
System.out.println("是否移动成功" + result);
//修改文件名
boolean rename = fs.rename(new Path("/user/rename.txt"), new Path("/user/afterRename.txt"));
System.out.println("文件名是否修改成功" + rename);
} /**
* 查看文件详情:文件名、权限、长度、所属组、所属者、副本数、块信息
*
* @throws IOException
*/
@Test
public void showFileDetail() throws IOException {
/**
* 获取迭代器
* Path f:查看的文件or目录
* final boolean recursive:是否递归
*/
RemoteIterator<LocatedFileStatus> fileIterator = fs.listFiles(new Path("/"), true);
while (fileIterator.hasNext()) {
LocatedFileStatus file = fileIterator.next();
//文件名
System.out.println("*****************" + file.getPath().getName() + "*****************");
//权限
System.out.println(file.getPermission());
//长度
System.out.println(file.getLen());
//所属组
System.out.println(file.getGroup());
//所属者
System.out.println(file.getOwner());
//副本数
System.out.println(file.getReplication());
//块信息
BlockLocation[] blockLocations = file.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
//输出块信息
System.out.println(Arrays.toString(blockLocation.getHosts()));
}
//输出结果
/******************hadoop103_34807*****************
rw-r-----
133781
atguigu
atguigu
3
[hadoop102, hadoop103, hadoop104]*/ } } /**
* 判断文件or目录?
*/
@Test
public void fileOrDir() throws IOException {
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
System.out.println("*****" + fileStatus.getPath().getName() + "*****");
if (fileStatus.isFile()) {
System.out.println("文件");
} else {
System.out.println("目录");
}
}
} /**
* 通过IO流上传下载
*/
@Test
public void uploadAndDownloadByIO() throws IOException {
//需求一:将本地f盘的sanguo.txt文件上传到HDFS的根目录"/"
//创建输入流
FileInputStream fis = new FileInputStream(new File("F:/sanguo.txt"));
//创建输出流
FSDataOutputStream fos = fs.create(new Path("/sanguo.txt"));
//流对拷
IOUtils.copyBytes(fis, fos, conf);
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
//需求二:将hdfs的"/user/bbb.txt"文件下载到本地f盘根目录"F:/"
FSDataInputStream fis2 = fs.open(new Path("/user/bbb.txt"));
FileOutputStream fos2 = new FileOutputStream(new File("F:/bbb.txt"));
IOUtils.copyBytes(fis2, fos2, conf);
IOUtils.closeStream(fis2);
IOUtils.closeStream(fos2);
}
}

HDFS【Java API操作】的更多相关文章

  1. hadoop hdfs java api操作

    package com.duking.util; import java.io.IOException; import java.util.Date; import org.apache.hadoop ...

  2. HDFS Java API 常用操作

    package com.luogankun.hadoop.hdfs.api; import java.io.BufferedInputStream; import java.io.File; impo ...

  3. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  4. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

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

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

  6. HDFS 05 - HDFS 常用的 Java API 操作

    目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...

  7. HDFS Java API 的基本使用

    一. 简介 二.API的使用         2.1 FileSystem         2.2 创建目录         2.3 创建指定权限的目录         2.4 创建文件,并写入内容 ...

  8. Hadoop 学习之路(七)—— HDFS Java API

    一. 简介 想要使用HDFS API,需要导入依赖hadoop-client.如果是CDH版本的Hadoop,还需要额外指明其仓库地址: <?xml version="1.0" ...

  9. Hadoop 系列(七)—— HDFS Java API

    一. 简介 想要使用 HDFS API,需要导入依赖 hadoop-client.如果是 CDH 版本的 Hadoop,还需要额外指明其仓库地址: <?xml version="1.0 ...

  10. HDFS常用API操作 和 HDFS的I/O流操作

    前置操作 创建maven工程,修改pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

随机推荐

  1. hdu 2571 命运(水DP)

    题意: M*N的grid,每个格上有一个整数. 小明从左上角(1,1)打算走到右下角(M,N). 每次可以向下走一格,或向右走一格,或向右走到当前所在列的倍数的列的位置上.即:若当前位置是(i,j), ...

  2. 彻底解决SLF4J的日志冲突的问题

    今天公司同事上线时发现,有的机器打印了日志,而有的机器则一条日志也没有打.以往都是没有问题的. 因此猜测是这次开发间接引入新的日志jar包,日志冲突导致未打印. 排查代码发现,系统使用的是SLF4J框 ...

  3. /etc/passwd 和 /etc/shadows 详解

    linux操作系统上的用户如果需要登录主机,当其输入用户名和密码之后: 首先在/etc/passwd文件中查找是否有你的账号,如果没有无法登录,如果有的话将该用户的UID和GID读出来,此外将此用户的 ...

  4. kubernetes常见命令

    kubernetes命令 kubectl get pod --all-namespaces查看pod节点 kubectl delete -n service/pods/deplay 删除指定内容 ku ...

  5. DockerFile-构建容器的基石

    DockerFile 非常的关键,它不同于 docker commit 的手动命令方式来进行镜像的构建和修改,类似 docker commit 的交互被称为命令式交互.命令式交互是运维一直绕不开的一种 ...

  6. maven项目中 把依赖包打进jar包

    在pom.xml文件中增加build配置 1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-as ...

  7. 【数据结构&算法】12-线索二叉树

    目录 前言 线索二叉树的概念 线索二叉树的实现 线索二叉树的寻点思路二 类双向链表参考图 参考代码 中序遍历线索化 前言 在<大话数据结构>P190 页中有一句话:其实线索二叉树,就等于是 ...

  8. Python编程环境设置

    第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...

  9. Spark SQL知识点大全与实战

    Spark SQL概述 1.什么是Spark SQL Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块. 与基本的Spark RDD API不同,Sp ...

  10. Study Blazor .NET(四)数据绑定

    翻译自:Study Blazor .NET,转载请注明. 数据绑定 单向绑定 在blazor中单向绑定简单而直接,无需UI刷新或渲染.下面示例展示了单向数据绑定: //Counter.razor @p ...