首页 > 编程语言 >hadoop学习之HDFS API-2-通过编写java接口操作hdfs

hadoop学习之HDFS API-2-通过编写java接口操作hdfs

时间:2022-11-30 19:31:28浏览次数:42  
标签:HDFS java hdfs void new fileSystem Path public out


1. 创建文件夹

工程的test包中java->com.imooc.bigdata->hadoop.hdfs.HDFSApp
注意包:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;

/**
* 使用JAVA API操作HDFS文件系统
* 1)创建Configuration
* 2)获取FileSystem
* 3)HDFS API操作
*/
public class HDFSApp {

public static void main(String[] args) throws Exception {
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop000:8020"),configuration,"root");
Path path = new Path("/hdfsapi/test");
boolean result = fileSystem.mkdirs(path);
System.out.println(result);
}
}

提示错误:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java


解决:

C:\WINDOWS\system32\drivers\etc\hosts中

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_02


改为:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java_03


测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_04


hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_05


——————————————————————————————

使用Junit改写:

public class HDFSApp {

public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;

@Before
public void setUp() throws Exception {
System.out.println("---------setUp----------");
configuration = new Configuration();
fileSystem = FileSystem.get(new URI(HDFS_PATH),configuration,"root");
}

@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("-------tearDown----------");
}

@Test
//创建HDFS文件夹
public void mkdir() throws Exception {
fileSystem.mkdirs(new Path("/hdfsapi/test2"));
}

}

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_06


hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_07

2.查看文件内容

添加方法:

@Test
public void text() throws IOException {
FSDataInputStream in = fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(in,System.out,1024);
}

包选:
import org.apache.hadoop.io.IOUtils;

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_08

3.创建文件并写入内容

@Test
public void create() throws IOException {
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
out.writeUTF("hello pk");
out.flush();
out.close();
}

执行后:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_09


问题:

副本系数问题

​http://192.168.61.129:50070/explorer.html#/​

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java_10


现在的副本系数为3

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_11


因为设置了一个空的Configuration对象,所以会自动加载依赖包中hdfs-default.xml中的配置

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_12


设置:

configuration.set(“dfs.replication”,“1”);

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_13


此时:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_14

编码问题

查看idea编码:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_15


修改为:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_16


暂定:

应当是Windows系统和Centos系统方面的问题

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_17

4.文件重命名

@Test
public void rename() throws IOException {
Path oldPath = new Path("/hdfsapi/test/a.txt");
Path newPath = new Path("/hdfsapi/test/aaaaa.txt");
boolean result = fileSystem.rename(oldPath, newPath);
System.out.println(result);
}

测试结果:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_18

5.拷贝本地文件到HDFS文件系统

@Test
public void copyFromLocalFile() throws IOException {
Path src = new Path("C:\\Users\\DELL\\Desktop\\新建文本文档 (2).txt");
Path dst = new Path("/hdfsapi/test/");
fileSystem.copyFromLocalFile(src,dst);
}

测试:

虽然出现了转义的问题,但是加上’'单引号就没问题了呢~

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hadoop_19

6.带进度的上传大文件(拷贝本地大文件到HDFS文件系统)

使用函数:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_20


import java.io.*;

@Test
public void copyFromBigLocalFile() throws IOException {

InputStream in = new BufferedInputStream(new FileInputStream(new File("G:\\jdk-8u231-linux-x64.tar.gz")));

FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/jdk.tgz"), new Progressable() {
@Override
public void progress() {
System.out.print(".");
}
});

IOUtils.copyBytes(in,out,4096);
}

测试结果:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_21

7.从HDFS拷贝文件到本地系统(下载)

@Test
public void copyToLocalFile() throws IOException {
Path src = new Path("/README.txt");
Path dst = new Path("C:\\Users\\DELL\\Desktop\\");
fileSystem.copyToLocalFile(false,src,dst,true);
}

出现空指针错误:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java_22


解决:

使用

fileSystem.copyToLocalFile(false,src,dst,true);

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_hdfs_23

8.列出文件夹下的所有内容

@Test
public void listFiles() throws IOException {
FileStatus[] statuses = fileSystem.listStatus(new Path("/hdfsapi/test"));

for(FileStatus file : statuses){
String isDir = file.isDirectory() ? "文件夹" : "文件";
String permission = file.getPermission().toString();
short replication = file.getReplication();
long len = file.getLen();
String path = file.getPath().toString();

System.out.println(isDir + "\t" + permission + "\t"
+ replication + "\t" + len + "\t" + path
);
}
}

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_24

9.递归查看目标文件夹下的所有文件

对应的HDFS命令为:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_25


代码:

public void listFilesRecursive() throws IOException {
RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(new Path("/"), true);

while(files.hasNext()){
LocatedFileStatus file = files.next();
String isDir = file.isDirectory() ? "文件夹" : "文件";
String permission = file.getPermission().toString();
short replication = file.getReplication();
long len = file.getLen();
String path = file.getPath().toString();

System.out.println(isDir + "\t" + permission + "\t"
+ replication + "\t" + len + "\t" + path
);
}
}

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java_26

10.查看文件块信息

@Test
public void getFileBlockLocations() throws IOException {
FileStatus fileStatus = fileSystem.getFileStatus(new Path("/hdfsapi/test/jdk.tgz"));
BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());

for(BlockLocation block : blocks){
for (String name : block.getNames()){
System.out.println(name + " : " + block.getOffset() + " : " + block.getLength() + " : " + block.getHosts());
}
}
}

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_大数据_27

11.递归删除文件

@Test
public void delete() throws IOException {
boolean result = fileSystem.delete(new Path("/hdfsapi/test/jdk.tgz"));
System.out.println(result);
}

测试:

hadoop学习之HDFS API-2-通过编写java接口操作hdfs_java_28


标签:HDFS,java,hdfs,void,new,fileSystem,Path,public,out
From: https://blog.51cto.com/u_12528551/5900338

相关文章

  • hadoop学习之使用HDFS API的方式来操作HDFS文件系统-1-项目环境
    IDEA中:1.创建工程不要选错差不多就是这个亚子2.添加hadoop依赖包<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId>......
  • java字面量
    字面量:常量整数类型:不带小数的数字66878小数类型:带小数点的数字13.14字符串类型:用双括号括起来的内容“234”“hello”字符类型:用单引号括起来的,内容只能有......
  • java线程(三)线程的6种状态
    NEW:线程刚刚创建,还没有执行start启动RUNNABLE:可运行状态,由线程调度器可以安排执行包括READY和RUNNING两种细分状态WAITING:等待被唤醒TIMEDWAITING:......
  • java数据类型
    java语言的数据类型分为:基本数据类型,引用数据类型基本数据类型的四类八种整数byte取值范围-128~127shortintlong浮点数floatdouble字符charbuer......
  • 菜鸟好文推荐(十五)——9个基于Java的搜索引擎框架
    在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整......
  • Java 集合框架2:List
    目录List1.概述2.功能拓展位置访问搜索迭代范围视图3.实现ArrayList实现原理CopyOnWriteArrayListLinkedList实现原理List1.概述List是一个有序序列,除了继承了Collect......
  • Java高效自学,应知道的知识
    JAVA简介    Java已经多年连续占据编程语言的榜首,Java是一门面向对象编程语言,它不仅吸收了C++语言的各种优点,还摒弃了C++语言中难以理解的多继承、指针等概念,因此Jav......
  • javascript函数的理解
    参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021087191360在js里,函数是一等公民。函数可以分配给变量函数可以作为参数传递给其他函数函数可以从其他......
  • JAVA爬虫爬取网页数据数据库中,并且去除重复数据
    pom文件<!--添加Httpclient支持--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><versio......
  • 「Java数据结构」- 栈和队列
    栈的认识========栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。压栈:栈的插入操作叫做进栈/......