使用常见API实现对hdfs文件系统的一系列基础操作即‘增删改查’:
创建HDFS文件夹
输出副本系数
创建文件
查看HDFS文件内容
文件名更改
拷贝本地文件到HDFS文件系统
拷贝本地大文件到HDFS文件系统,带进度条
下载HDFS文件到本地
查看文件夹下所有文件
递归查看文件夹下所有文件
查看文件块信息
删除文件
package com.haglife.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.Arrays;
public class HDFSBasicOperation {
public static final String HDFS_PATH = "hdfs://masternode:8020";
Configuration configuration = null;
FileSystem fileSystem = null;
@Before
public void setUp() throws Exception {
System.out.println("----------setUp----------");
configuration = new Configuration();
configuration.set("dfs.replication", "2");
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份即用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "uname");
}
// 创建HDFS文件夹
@Test
public void mkdir() throws Exception {
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
// 输出副本系数
@Test
public void Replication() {
System.out.println(configuration.get("dfs.replication"));
}
// 创建文件
@Test
public void create_text() throws Exception {
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/maven_intro.txt"));
out.writeUTF("maven翻译为“专家”,“内行”。Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具," +
"使用maven对java项目进行构建、依赖管理。当前使用Maven的项目在持续增长。\n");
out.flush();
out.close();
}
// 查看HDFS文件内容
@Test
public void text() throws Exception {
FSDataInputStream in = fileSystem.open(new Path("/hdfsapi/test/maven_intro.txt"));
IOUtils.copyBytes(in, System.out, 1024);
}
// 文件名更改
@Test
public void rename() throws Exception {
Path oldPath = new Path("/hdfsapi/test/maven_intro.txt");
Path newPath = new Path("/hdfsapi/test/maven_introduce.txt");
boolean result = fileSystem.rename(oldPath, newPath);
System.out.println(result);
}
// 拷贝本地文件到HDFS文件系统
@Test
public void copyFromLocalFile() throws Exception {
Path localPath = new Path("E:\\大数据\\hadoop\\...\\temp.txt");
Path targetPath = new Path("/hdfsapi/test/");
fileSystem.copyFromLocalFile(localPath, targetPath);
}
// 拷贝本地大文件到HDFS文件系统,带进度条
@Test
public void copyFromLocalBigFile() throws Exception {
InputStream in = new BufferedInputStream(new FileInputStream(new File("E:\\大数据\\hadoop\\...\\jdk-8u161-linux-x64.tar.gz")));
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/jdk.tar.gz"),
new Progressable() {
@Override
public void progress() {
System.out.print("#");
}
});
IOUtils.copyBytes(in, out, 4096);
}
// 下载HDFS文件到本地
@Test
public void copyToLocalFile() throws Exception {
Path src = new Path("/hdfsapi/test/maven_introduce.txt");
Path dst = new Path("E:\\大数据\\hadoop\\...\\hdfs");
fileSystem.copyToLocalFile(false, src, dst, true);
}
// 查看文件夹下所有文件
@Test
public void listFiles() throws Exception {
/**
* FileStatus[]包含了:
* private Path path; 路劲
* private long length; 大小
* private boolean isdir; 是否文件夹
* private short block_replication; 块的副本数
* private long blocksize; 块大小
* private long modification_time; 修改时间
* private long access_time; 访问时间
* private FsPermission permission; 权限
* private String owner; 创建者
* private String group;
* private Path symlink;
*/
FileStatus[] statuses = fileSystem.listStatus(new Path("/hdfsapi/test/"));
System.out.println("statuses:" + Arrays.toString(statuses));
for(FileStatus file: statuses) {
String path = file.getPath().toString();
String isDir = file.isDirectory() ? "文件夹": "文件";
String permission = file.getPermission().toString();
short replication = file.getReplication();
long length = file.getLen();
System.out.println(path + '\t' +
isDir + '\t' +
permission + '\t' +
replication + '\t' +
length);
}
}
// 递归查看文件夹下所有文件
@Test
public void listFilesRecursive() throws Exception {
RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(new Path("/hdfsapi/test/"), true); // 返回一个迭代器
System.out.println(files);
// 迭代 迭代器
while (files.hasNext()) {
LocatedFileStatus file = files.next();
String path = file.getPath().toString();
String isDir = file.isDirectory() ? "文件夹": "文件";
String permission = file.getPermission().toString();
short replication = file.getReplication();
long length = file.getLen();
System.out.println(path + '\t' +
isDir + '\t' +
permission + '\t' +
replication + '\t' +
length);
}
}
// 查看文件块信息
@Test
public void getFileBlockInfo() throws Exception {
FileStatus fileStatus = fileSystem.getFileStatus(new Path("/hdfsapi/test/jdk.tar.gz"));
System.out.println("fileStatus:" + fileStatus);
BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
for(BlockLocation block: blocks) {
System.out.println(block);
for(String name: block.getNames()) {
System.out.println(Arrays.toString(block.getHosts()) + " - " + name + " - " + block.getOffset() + " - " + block.getLength());
}
}
}
// 删除文件
@Test
public void delete() throws Exception {
boolean result = fileSystem.delete(new Path("/hdfsapi/test/jdk.tar.gz"), true);
System.out.println(result);
}
@After
public void tearDown() {
configuration = null;
fileSystem = null;
System.out.println("----------tearDown----------");
}
}