我是在linux的环境下的Eclipse中开发这个程序的,如果你是在windows环境下写这个程序,请自行调整。
第一步:首先我们确定自己的hadoop的hdfs的环境是好的,我们在linux中启动hdfs,然后在web页面上通过URL测试:http://uatciti:50070
第二步:在Linux下打开Eclipse, 写我们的客户端代码。
说明:我们在Linux系统的/usr/local/devtool/java文件下,有JDK的文件。我们希望把这个文件上传到hdfs系统的根目录下的jdk文件夹下面。
package com.npf.hadoop.hdfs;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSClient {
public static void main(String[] args) throws Exception {
loadLocalFile2hdfs();
}
/**
* load a local file to hdfs
* @throws IOException
*/
public static void loadLocalFile2hdfs() throws IOException{
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
//get input stream of local file
FileInputStream input = new FileInputStream("/usr/local/devtool/java/jdk-7u79-linux-i586.rpm");
//get output stream of dest path
Path path = new Path("hdfs://uatciti:9000/jdk");
FSDataOutputStream output = fs.create(path);
//load a local file to hdfs
IOUtils.copy(input, output);
System.out.println("completed");
}
}
运行这段代码,我们通过访问http://uatciti:50070下查看hdfs系统下的文件,确定我们是否上传成功。
ok,我们已经把本地系统中的一个文件上传到了hdfs系统中去了。
现在我们希望从hdfs系统中根目录下的jdk下载到linux本地系统下的/usr/local/devtoo/java/jdk目录下。
代码如下:
/**运行这段代码后,查看是否下载成功:
* download file from hdfs to local
* @throws IOException
*/
public static void downloadFileFromHDFS2Local() throws IOException{
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
//get input stream of hdfs file
FSDataInputStream input = fs.open(new Path("hdfs://uatciti:9000/jdk"));
//get output stream of local file
FileOutputStream output = new FileOutputStream("/usr/local/devtool/java/jdk");
//download file from hdfs to local
IOUtils.copy(input, output);
System.out.println("completed");
}
}
ok,我们看到,这个文件已经下载到Linux本地系统的磁盘中了。我们已经搞定了。
我们通过代码在hdfs系统上创建一个目录: /aa/bb
/**
* mkdir
* @throws IOException
*/
public static void mkdir() throws IOException{
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
fs.mkdirs(new Path("/aa/bb"));
}
运行完这段代码,我们可以通过http://uatciti:50070查看。
我们之前的download方法有些复杂,其实hdfs内部已经有了很好的API给我们使用,请看下面的代码。我们是想把/usr/local/devtool/java下面的jdk上传到hdfs的/aa/bb目录下面。
public static void downloadFile2hdfs() throws IOException{运行完这段代码,我们可以通过http://uatciti:50070查看。
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("/usr/local/devtool/java/jdk-7u79-linux-i586.rpm"), new Path("/aa/bb"));
}
现在我们想把/aa/bb目录下面的文件全部删除掉已经bb文件夹,ok,请看下面的代码。
/**
* delete file
* @throws IOException
*/
public static void deleteFile() throws IOException{
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
//级联删除/aa/bb/目录下的所有 文件
fs.delete(new Path("/aa/bb"), true);
}
现在我们看到,在根目录下面有一个文件叫做jdk,现在我们的需求是把jdk这个文件重命名为jdknpf。ok,看下面的代码。
public static void renameFilename() throws IOException{
//get a instance of FileSystem
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://uatciti:9000");
FileSystem fs = FileSystem.get(conf);
fs.rename(new Path("/jdk"), new Path("/jdknpf"));
}
运行完这段代码,我们可以通过http://uatciti:50070查看。