今天看尚硅谷大海哥的hadoop课程,学习了 HDFS API 的常规操作,虽然很简单,但是对于我这个门外汉来说,这些都属于全新的领域,掌握之后感觉非常的开心,特此记录一下。
IntelliJ IDEA java 开发用到的几个快捷键
ctrl+p
提示参数信息(入参)Alt+回车
抛出异常(处理红色下划线)ctrl+Alt+F
设置全局变量(方法间变量共用)ctrl+Alt+L
美化代码().var + 回车
自动补全代码().sout + 回车
自动补全用于打印店代码
@ 是个神奇的前缀
在 IntelliJ IDEA java
开发过程中,@
是个神奇的前准,可以使用 @
实现很多意想不到的功能。
@Before
:在执行核心代码之前,执行此方法,常用于初始化。
@Test
:方便我们对一段代码进行测试,说明该方法为测试方法,可以执行。
@Overwrite
:方法重写。
@After
:常用于程序运行完毕之后,关闭资源。
方法的选择
感觉 java
有点特殊(或者是我孤陋寡闻),当尝试选择某函数方法时,会出现很多同名的,我们必须根据其不同的后缀说明或者参数个数来选择某一个(灰色字体),而且必须选择正确。(默认选择第一个)
如上图所示,可以看出 hdfs 的.copyFromLocalFile();
函数方法有四种类型的参数,当前第一种下面是灰色的,说明此时选择的是第一种,也就是输入参数是两个。
API参数的优先级
不同位置设置的 hdfs API参数的优先级不同:
1、hdfs-default.xml
2、hdfs-site.xml
3、resources
资源目录下的 hdfs-site.xml
4、程序代码中设置的参数值
如上几种设置,优先级依次增加,即:
代码中的参数 > resources
资源目录下的用户自定义文件 > 服务器自定义配置( xxx-site.xml
) > 服务器默认配置(xxx-default.xml
)
HDFS API 操作完整代码
如下是 HDFS API
常规操作的相关代码,包括创建文件夹、上传文件、下载文件、删除文件、文件的更名和移动、获取文件信息详情、判断是文件夹还是文件等。
package com.omc.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
/*
*客户端代码常用套路
* 1、获取一个客户端对象
* 2、执行相关的操作命令
* 3、关闭资源
* hdfs zookeeper
* ctrl+p 提示参数
* Alt+回车,抛出异常
* ctrl+Alt+F 设置全局变量
* ctrl+Alt+L 美化代码
* ().var 回车,自动补全代码
*/
public class hdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
// 计划连接的集群的 namenode 地址
URI uri = new URI("hdfs://hadoop102:8020");
// 创建一个配置文件
Configuration configuration = new Configuration();
// 设置用户
String user = "omc";
// 获取到客户端对象
fs = FileSystem.get(uri, configuration, user);
}
@After
public void close() throws IOException {
// 关闭资源
fs.close();
}
// 1、创建一个文件夹
@Test
public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
fs.mkdirs(new Path("/xiyou/huoguoshan1"));
}
// 2、上传文件
@Test
public void testPut() throws IOException {
fs.copyFromLocalFile(false, true, new Path("D:/bigdata/sunwukong.txt"), new Path("hdfs://hadoop102/xiyou/huoguoshan"));
}
// 3、文件下载
@Test
public void testGet() throws IOException {
fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou/huoguoshan/sunwukong.txt"), new Path("D:/bigdata/output"), true);
}
// 4、删除文件
@Test
public void testRm() throws IOException {
// 参数解读:1、要删除的源文件路径,2、是否递归删除
// a、删除文件
fs.delete(new Path("/xiyou/huoguoshan/sunwukong.txt"), false);
// b、删除空目录
fs.delete(new Path("/xiyou/huoguoshan1"), false);
// c、删除非空目录
fs.delete(new Path("/output2"), true);
}
// 5、文件的更名和移动
@Test
public void testMv() throws IOException {
fs.rename(new Path("/wcinput/wordCountTest.txt"), new Path("/wcinput/word.txt"));
}
// 6、获取文件信息详情
@Test
public void fileInfo() throws IOException {
// 获取所有文件信息(参数2 标识是否递归)
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
// 遍历迭代器
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("============= " + fileStatus.getPath() + " ===================");
System.out.println("权限:" + fileStatus.getPermission());
System.out.println("归属用户:" + fileStatus.getOwner());
System.out.println("归属组:" + fileStatus.getGroup());
System.out.println("大小:" + fileStatus.getLen());
System.out.println("最后修改时间:" + fileStatus.getModificationTime());
System.out.println("副本数:" + fileStatus.getReplication());
System.out.println("块大小:" + fileStatus.getBlockSize());
System.out.println("文件名:" + fileStatus.getPath().getName());
// 获取块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
}
// 7、判断是文件夹还是文件
@Test
public void testFile() throws IOException {
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("这是文件:" + status.getPath().getName());
} else {
System.out.println("这是目录:" + status.getPath().getName());
}
}
}
}