我是在linux的环境下的Eclipse中开发这个程序的,如果你是在windows环境下写这个程序,请自行调整。
第一步:首先我们确定自己的hadoop的hdfs的环境是好的,我们在linux中启动hdfs,然后在web页面上通过URL测试:http://uatciti:50070
第二步:在Linux下打开Eclipse, 写我们的客户端代码。
说明:我们在Linux系统的/usr/local/devtool/java文件下,有JDK的文件。我们希望把这个文件上传到hdfs系统的根目录下的jdk文件夹下面。
<span style="font-size:14px;">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"); } } </span></span>
ok,我们已经把本地系统中的一个文件上传到了hdfs系统中去了。
现在我们希望从hdfs系统中根目录下的jdk下载到linux本地系统下的/usr/local/devtoo/java/jdk目录下。
代码如下:
<span style="font-size:14px;"> /** * 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"); } }</span>运行这段代码后,查看是否下载成功:
ok,我们看到,这个文件已经下载到Linux本地系统的磁盘中了。我们已经搞定了。
我们通过代码在hdfs系统上创建一个目录: /aa/bb
<span style="font-size:14px;"> /** * 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")); } </span>
我们之前的download方法有些复杂,其实hdfs内部已经有了很好的API给我们使用,请看下面的代码。我们是想把/usr/local/devtool/java下面的jdk上传到hdfs的/aa/bb目录下面。
<span style="font-size:14px;">public static void downloadFile2hdfs() throws IOException{ //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")); } </span></span>运行完这段代码,我们可以通过http://uatciti:50070查看。
现在我们想把/aa/bb目录下面的文件全部删除掉已经bb文件夹,ok,请看下面的代码。
<span style="font-size:14px;"> /** * 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); } </span></span>
现在我们看到,在根目录下面有一个文件叫做jdk,现在我们的需求是把jdk这个文件重命名为jdknpf。ok,看下面的代码。
<span style="font-size:14px;">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")); } </span>