Hadoop2.4.1 HDFS的Java客户端开发

时间:2022-05-25 08:30:47

我是在linux的环境下的Eclipse中开发这个程序的,如果你是在windows环境下写这个程序,请自行调整。

第一步:首先我们确定自己的hadoop的hdfs的环境是好的,我们在linux中启动hdfs,然后在web页面上通过URL测试:http://uatciti:50070

Hadoop2.4.1 HDFS的Java客户端开发

第二步:在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系统下的文件,确定我们是否上传成功。

Hadoop2.4.1 HDFS的Java客户端开发


Hadoop2.4.1 HDFS的Java客户端开发

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");
}
}
运行这段代码后,查看是否下载成功:

Hadoop2.4.1 HDFS的Java客户端开发

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查看。

Hadoop2.4.1 HDFS的Java客户端开发

我们之前的download方法有些复杂,其实hdfs内部已经有了很好的API给我们使用,请看下面的代码。我们是想把/usr/local/devtool/java下面的jdk上传到hdfs的/aa/bb目录下面。

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"));
}

运行完这段代码,我们可以通过http://uatciti:50070查看。

Hadoop2.4.1 HDFS的Java客户端开发

现在我们想把/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);
}


Hadoop2.4.1 HDFS的Java客户端开发


现在我们看到,在根目录下面有一个文件叫做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查看。

Hadoop2.4.1 HDFS的Java客户端开发