本文共 4240 字,大约阅读时间需要 14 分钟。
HDFS核心类FileSystem的使用
一、引入jar包
Hadoop的JAVAjar包在Hadoop2.7.7/share/hadoop里有如下几个文件夹。
common是Hadoop的核心类,它是下面其他核心类的依赖,使用其他类必须引入common包里的jar包。
所以使用HDFS的FileSystem包必须引入Common和hdfs两个文件夹里面所有jar包。
红色jar包为hadoop作者所写jar包,依赖在lib里面。都必须引入。hdfs同理。
二、JAVA-API连接HDFS
(所有jar包都是org.apache.hadoop.*;里的jar包)
@Testpublic voidconnectHDFS() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");//指定hadoop使用的文件系统和文件系统所在主机和端口
try{
FileSystem fileSystem= FileSystem.get(conf); //FileSystem 连接
FileStatus fileStatus = fileSystem.getFileLinkStatus(new Path("/user"));
System.out.println(fileStatus.isDirectory());
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
三、文件上传
1.方法1:使用API直接上传
@Testpublic voidupload1() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");//连接hdfs
try{
FileSystem fileSystem=FileSystem.get(conf);
fileSystem.copyFromLocalFile(new Path("d:\\jdk-8u221-linux-x64.tar.gz"), new Path("/jdk-8u221-linux-x64.tar.gz"));//前一个path为本地路径 后一个path为hdfs保存路径
} catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
2.方法2:使用IO流上传
@Testpublic voidupload2() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);
FSDataOutputStream create= fileSystem.create(new Path("/stud")); //hdfs输出流
FileInputStream f = new FileInputStream(new File("d:\\stud")); //文件输入流
int len = 0;byte[] b = new byte[1024];while((len = f.read(b))!=-1) {
create.write(b,0, len);
}
f.close();
create.close();
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
四、文件下载
1.使用API直接下载
@Testpublic voiddownload1() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);
fileSystem.copyToLocalFile(new Path("/stud"), new Path("E:\\stud")); //前者为hdfs路径 后者为本地保存路径
} catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
2.使用IO流下载
@Testpublic voiddownload2() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);
FSDataInputStream open= fileSystem.open(new Path("/stud"));
FileOutputStream file= new FileOutputStream(new File("E:\\stud1"));byte [] b = new byte[1024];int len = 0;while((len = open.read(b))!=-1) {
file.write(b,0, len);
}
open.close();
file.close();
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
五、创建文件夹(创建多级文件夹)
@Testpublic voidmkdir() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);boolean mkdirs = fileSystem.mkdirs(new Path("/user/ky1")); //输入单级或多级文件夹
System.out.println(mkdirs?"创建成功":"创建失败");
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
六、重命名或者移动
@Testpublic voidrename() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);
fileSystem.rename(new Path("/hadoop01"), new Path("/hadoop02")); //前者为修改前,后者为修改后
} catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}
七、递归遍历所有文件或文件夹
@Testpublic voidlsr() {
Configuration conf= newConfiguration();
conf.set("fs.defaultFS","hdfs://192.168.100.2:9000");try{
FileSystem fileSystem=FileSystem.get(conf);
FileStatus[] listStatus= fileSystem.listStatus(new Path("/"));for(FileStatus fileStatus : listStatus) {
isDir(fileStatus, fileSystem);
}
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}public voidisDir(FileStatus fileStatus,FileSystem fileSystem) {if(fileStatus.isDirectory()) {
String dirname= fileStatus.getPath().getName();
;
System.out.println("文件夹:"+dirname);
FileStatus[] listStatus;try{
listStatus= fileSystem.listStatus(new Path("/"+dirname));for(FileStatus fileStatus2 : listStatus) {
isDir(fileStatus2,fileSystem);
}
}catch(FileNotFoundException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}catch(IllegalArgumentException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}catch(IOException e) {//TODO 自动生成的 catch 块
e.printStackTrace();
}
}else{
String dirname= fileStatus.getPath().getName();
System.out.println("文件:"+dirname);
}
}
还有许多方法用法相似 不一一赘述。
转载地址:http://glwra.baihongyu.com/