一、创建文件
package cn.kgc.file;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HDFSClientDemo {
// 创建文件
@Test
public void testMkdir() throws IOException, URISyntaxException, InterruptedException {
// 获取文件系统
Configuration conf = new Configuration();
// 添加属性
// fs.defaultFS : 默认的文件管理系统
//conf.set("fs.defaultFS","hdfs://192.168.199.130:9000"); // 连接到虚拟机 固定端口号
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.199.130:9000"),conf,"root");
// 获取文件系统
// 通过FileSystem 下的fs对象进行一些操作
//FileSystem fs = FileSystem.get(conf);
// 测试创建一个文件夹
fs.mkdirs(new Path("/test"));
// 获取的是一个路径,所以不能是字符串形式,得new一个path
// 关闭资源
fs.close();
}
二、上传文件到HDFS
// 上传一个文件到HDFS
@Test
public void testPutFileToHDFS() throws URISyntaxException, IOException, InterruptedException {
// 获取文件系统的链接
Configuration conf = new Configuration();
// 设置配置里的备份为1,正常备份设置是3
// 执行顺序优先级:代码>resources中配置信息>jar包中的配置信息
conf.set("dfs.replication","1");
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.199.130:9000"),conf,"root");
// 上传文件到hdfs
// src(原文件位置) des(目标文件位置)
fs.copyFromLocalFile(new Path("D:\\codes\\mapreduce\\hadooptes\\HdfsClientDemo\\demo\\data\\hdfsdemo\\HDFSClientDemo.java"),
new Path("/test")
);
// 删除文件的操作
// fs.deleteOnExit(new Path("/test/HDFSClientDemo.java"));
// 关闭资源
fs.close();
}
三、下载一个文件到本地
public void testGetFileFromHDFS () throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.199.130:9000"),conf,"root");
fs.copyToLocalFile(false,new Path("/test"),
new Path("D:\\codes\\mapreduce\\hadooptes\\HdfsClientDemo\\demo\\data\\hello2.txt"));
// true相当于移动,hdfs上就删除没有了 false就是拷贝,hdfs上文件并不会消失
// 等同于fs.moveToLocalFile();
fs.close();
}
给下载到指定路径的文件命名为hello.txt,还有一个是校验文件
此时是为false的情况
当为true时
三、列举文件信息
package cn.kgc.file;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HDFSListFiles {
@Test
public void listFiles() throws URISyntaxException, IOException, InterruptedException {
// 获取文件系统的链接
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.199.130:9000"),conf,"root");
// 返回类型是一个可迭代的对象
RemoteIterator<LocatedFileStatus> listfiles = fs.listFiles(new Path("/test"), true);
// 对他进行遍历
while (listfiles.hasNext()){ // 判断是否有内容
// 判断是否有值
LocatedFileStatus status = listfiles.next(); // 文件的状态(可以获取一些信息)
System.out.println(status.getPath().getName()); // 获取它的路径下它的名称
System.out.println(status.getLen()); // 获取长度
// System.out.println(status.getBlockLocations()); // 获取Block块的位置信息
System.out.println(status.getBlockSize()); // 获取Block块的大小
System.out.println(status.getReplication()); // 获取副本数
System.out.println(status.getGroup()); // 所在的一个组
System.out.println("--------------------");
BlockLocation[] blockLocations = status.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
System.out.println(blockLocation.getHosts()); // 获取block块存在哪个节点(机器)上
System.out.println(blockLocation.getLength()); // 获取Block块的长度信息
}
}
fs.close();
}
}
四、递归删除目录
fs应该有方法,可以在java中实现,暂时还没试过,后面更新。
hdfs dfs -rm -r /test