- 环境
- HDFS的shell操作
- 基本语法
- 常用命令
- 上传
- 下载
- HDFS直接操作
- HDFS的API操作
- 准备工作
- 客户端代码步骤
- 搭建测试框架
- 操作
- 创建文件夹
- 文件上传
- 文件下载
- 文件删除
- 文件更名和移动
- 获取文件详情信息
- 判断文件夹还是文件
HDFS的shell操作 基本语法操作系统:xubuntu
hadooop fs 具体命令 或 hdfs dfs 具体命令
常用命令创建文件夹
hdfs dfs -mkdir /t1上传
# 从本地剪切到hdfs hdfs dfs -moveFromLocal f1.txt /t1 # 从本地复制到hdfs,下面两个命令效果相同,生产环境习惯于用put hdfs dfs -copyFromLocal f1.txt /t1 hdfs dfs -put f1.txt /t1 # 追加一个文件到已经存在的文件末尾,很少用 hdfs dfs -appendToFile f2.txt /t1/f1.txt下载
# 从hdfs复制到本地,两条命令相同,生产环境习惯用get,下载到本地可以保存为其他文件名 hdfs dfs -copyToLocal /t1/f1.txt ./ hdfs dfs -get /t1/f1.txt ./f2.txtHDFS直接操作
# 和linux命令一样 -ls,-cat, -chgrp,-chmod,-chwon -mkdir,-cp,-mv # 显示一个文件的末尾1kb数据 hdfs dfs -tail /t1/f1.txt #删除文件或文件夹 hdfs dfs -rm /t1/f1.txt # 递归删除目录及目录里面的内容 hdfs dfs -rm -r /t1/f1.txt # 统计文件夹的大小信息 hdfs dfs -du -s -h /t1 -s: 目录下的文件大小总和 -h: 文件大小 * 副本数 # 统计目录下每个文件的大小,干掉-s hdfs dfs -du -h /t1 # 设置hdfs中文件的副本数量 hdfs dfs -setrep 4 /t1/f1.txtHDFS的API操作 准备工作
1.创建一个maven工程,导入依赖
org.apache.hadoop hadoop-client 2.9.2 junit junit 4.12 org.slf4j slf4j-log4j12 1.7.30
2.在resource目录下创建log4j.properties
# 配置根
log4j.rootLogger=debug,console
### 日志输出到控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
3.创建一个类com.lzr.hdfs.HdfsClient
客户端代码步骤- 获取一个客户端对象
- 执行相关的操作命令
- 关闭资源
package com.lzr.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.net.URI;
import java.net.URISyntaxException;
public class HdfsClient {
URI uri;
Configuration conf;
FileSystem fs;
@Before
public void init() throws Exception{
// 连接的集群的namenode地址
uri = new URI("hdfs://192.168.1.101:9000");
// 创建一个配置文件
conf = new Configuration();
// 1. 获取客户端
fs = FileSystem.get(uri, conf);
}
@After
public void destroy() throws Exception{
// 关闭资源
fs.close();
}
}
操作
创建文件夹
@Test
public void testMkdir() throws Exception {
// 创建一个文件夹
fs.mkdirs(new Path("/dir1"));
}
文件上传
@Test
public void testPut() throws IOException {
fs.copyFromLocalFile(
false, // 是否删除源文件
true, // 能否覆盖目标文件
new Path("src/main/resources/log4j.properties"), // 源文件地址
new Path("/dir1") // hdfs目标地址
);
}
文件下载
@Test
public void testGet() throws IOException {
fs.copyToLocalFile(
false, // 是否删除源文件
new Path("hdfs://dir1/file1"), // 源文件hdfs
new Path("/root/"), // 目标目录
false // 是否开启本地校验
);
}
文件删除
@Test
public void testDel() throws IOException {
fs.delete(
new Path("/dir/log4j.properties"), // 要删除的文件
false // 是否递归删除
);
// 删除空目录,没必要递归删除
fs.delete(new Path("/dir"),false);
// 删除非空目录,必须递归删除
fs.delete(new Path("/dir"),true);
}
文件更名和移动
@Test
public void testMv() throws IOException {
fs.rename(
new Path("/dir/file1"), // 源文件路径
new Path("/dir1/file111") // 目标文件路径
);
// 移动并更名
fs.rename(new Path("/dir1/file1"),new Path("/dir2/file2"));
// 目录更名
fs.rename(new Path("/dir"),new Path("/dir3"));
}
获取文件详情信息
@Test
public void fileDetail() throws IOException {
// args1: 文件路径, args2:是否递归遍历
RemoteIterator files = fs.listFiles(new Path("/"), true);
while (files.hasNext()){
LocatedFileStatus file = files.next();
System.out.println("======" + file.getPath() + "=====");
System.out.println(file.getPermission());
System.out.println(file.getOwner());
System.out.println(file.getGroup());
System.out.println(file.getLen());
System.out.println(file.getModificationTime());
System.out.println(file.getReplication());
System.out.println(file.getBlockSize());
System.out.println(file.getPath().getName());
// 获取块信息
BlockLocation[] blockLocations = file.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
}
以上信息对应hdfs的web页面里的文件系统的相关信息
判断文件夹还是文件@Test
public void testFile() throws IOException {
// 直接列出当前目录,不是递归遍历
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isFile()){
System.out.println("file: " + fileStatus.getPath().getName());
}else {
System.out.println("dirs: " + fileStatus.getPath().getName());
}
}
}



