下文展示Java的API如何操作hdfs,在这之前你需要先安装配置好hdfs
依赖
你需要引入依赖如下
org.apache.hadoop
hadoop-common
2.8.0
org.apache.hadoop
hadoop-hdfs
2.8.0
配置修改
core-site.xml
由于Java访问hdfs始终都要通过nameNode来拿到dataNode节点,所以nameNode要配置为可对外访问的地址,不能是localhost了
我们更改core-site.xml配置为虚拟机IP即可,我们虚拟机要作为类似服务器的方式来使用,所以虚拟机网络配置要是桥接模式,这样才有独立IP,并可对宿主机提供访问
注:如果你不希望使用IP而是希望像使用域名一样来配置,如:
fs.defaultFS
master:9000
你可以通过配置虚拟机hostname为master,并配置与IP的解析映射,宿主机配置IP的解析即可,参考:
hdfs-site.xml
另外,对于服务端文件的操作默认会检查权限,所以为了方便,你可以配置hdfs-site.xml关闭
dfs.permissions
false
示例代码
你可以查看Java docs阅读更多地API,这里演示常用的上传、下载、删除、创建文件夹、列出文件、列出文件和文件夹
packagecn.lay.demo.hdfs;importorg.apache.commons.io.IOUtils;importorg.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*;importjava.io.FileOutputStream;importjava.io.IOException;/*** @Description hdfs java api操作示例
* @Author lay
* @Date 2018/11/8 0:04*/
public classHdfsJavaApiDemo {//nameNode节点地址
private static final String NAME_NODE = "hdfs://192.168.1.12:9000";private staticConfiguration configuration;private staticFileSystem fileSystem;//本地文件
private static final String LOCAL_FILE = "C:\\Users\\admin\\Desktop\\helloHdfs.txt";//远程文件
private static final String REMOTE_FILE = "/helloHdfs.txt";//下载文件
private static final String DOWNLOAD_FILE = "C:\\Users\\admin\\Desktop\\download.txt";//远程的文件夹
private static final String REMOTE_DIR = "/newDir/newChildDir";static{
configuration= newConfiguration();
configuration.set("fs.defaultFS", NAME_NODE);try{
fileSystem=FileSystem.get(configuration);
}catch(IOException e) {
e.printStackTrace();
}
}public static voidmain(String[] args) {try{//upload();//download();//remove();//mkdirs();//listFiles();
listStatus();
}catch(IOException e) {
e.printStackTrace();
}
}/*** 文件上传
*@throwsIOException*/
public static void upload() throwsIOException {
fileSystem.copyFromLocalFile(new Path(LOCAL_FILE), newPath(REMOTE_FILE));
}/*** 文件下载
*@throwsIOException*/
public static void download() throwsIOException {//fileSystem.copyToLocalFile(new Path(REMOTE_FILE), new Path(DOWNLOAD_FILE));
FSDataInputStream fsDataInputStream = fileSystem.open(newPath(REMOTE_FILE));
FileOutputStream fileOutputStream= newFileOutputStream(DOWNLOAD_FILE);
IOUtils.copy(fsDataInputStream, fileOutputStream);
fsDataInputStream.close();
fileOutputStream.flush();
fileOutputStream.close();
}/*** 删除
*@throwsIOException*/
public static void remove() throwsIOException {//递归
boolean recursive = true;
fileSystem.delete(newPath(REMOTE_FILE), recursive);
}/*** 创建文件夹
*@throwsIOException*/
public static void mkdirs() throwsIOException {
fileSystem.mkdirs(newPath(REMOTE_DIR));
}/*** 列出文件内容
*@throwsIOException*/
public static void listFiles() throwsIOException {
RemoteIterator fileStatusList = fileSystem.listFiles(new Path("/"), true);while(fileStatusList.hasNext()) {
LocatedFileStatus fileStatus=fileStatusList.next();
String path=fileStatus.getPath().toString();
System.out.println("path:" +path);
}
}/*** 列出文件夹和文件
*@throwsIOException*/
public static void listStatus() throwsIOException {
FileStatus[] fileStatuses= fileSystem.listStatus(new Path("/"));for(FileStatus f : fileStatuses) {
System.out.println("path:" +f.getPath());
}
}
}
注意:文件下载采用了IO流的方式,而不是copyToLocalFile方法,因为该方法需要本地hadoop的环境配置,否则你会看到类似这样的错误:
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset
并且下载的文件总是0byte,如果遇到这样的问题你可以在hdfs服务端查看目录和文件检查服务端文件有没有问题,命令:
hadoop fs -ls /
其它API
当然你可以在hadoop的Javadocs里面阅读,不过不太方便因为你需要了解它的包和类:http://hadoop.apache.org/docs/current/api/