针对hadoop中日常使用的hdfs接口相关内容整理如下:
hadoop版本2.8.2


文章目录

  • 初始化环境
  • 上传及下载
  • 文件上传
  • 文件下载
  • 创建及删除
  • 创建文件
  • 创建目录
  • 删除文件
  • 查看
  • 查看某个文件
  • 遍历目录
  • 遍历文件
  • 查看元数据


初始化环境

要想操作hdfs上的相关内容,需要先配置环境,并获得FileSystem实例

//初始化环境配置
Configuration conf = new Configuration();
		
//设置hdfs访问地址
conf.set("fs.default.name", "hdfs://192.168.220.129:9000");
 
//取得FileSystem实例
FileSystem fs = FileSystem.get(conf);

上传及下载

文件上传 copyFromLocalFile()
文件下载 copyToLocalFile()

文件上传

思路:初始化环境,配置源文件路径及目标路径,使用FileSystem实例的copyFromLocalFile()上传

package walker_0314;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * 本地上传文件到hdfs
 * @author Administrator
 *2020年3月16日12:00:57
 */

public class UploadFileToHDFS {

	private static FileSystem hdfs;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		hdfs=FileSystem.get(conf);
		Path src = new Path("D:/zhangwenkai.jks");
		Path target = new Path("hdfs:/");
		//复制上传本地文件到HDFS中
		hdfs.copyFromLocalFile(src, target);
		System.out.println("上传成功");
	}

}
  • tips
    以eclipse为例,如果将上述代码直接运行,则上传到hdfs的文件用户是本地用户,如下图中,文件上传后用户为Administrator
[walker001@walker001 hadoop]$ hadoop fs -ls /
Found 9 items
-rw-r--r--   2 walker001     supergroup         58 2020-03-12 19:46 /file.txt
drwxr-xr-x   - walker001     supergroup          0 2020-03-08 13:47 /input
drwxr-xr-x   - Administrator supergroup          0 2020-03-15 22:26 /mydir
drwxr-xr-x   - walker001     supergroup          0 2020-03-15 22:30 /mydir1
drwxr-xr-x   - walker001     supergroup          0 2020-03-08 14:02 /output
-rw-r--r--   3 Administrator supergroup    9602303 2020-03-15 23:02 /test.zip
drwx------   - walker001     supergroup          0 2020-03-08 13:54 /tmp
drwxr-xr-x   - walker001     supergroup          0 2020-03-08 13:54 /user
-rw-r--r--   3 Administrator supergroup       2262 2020-03-16 12:05 /zhangwenkai.jks

要想用户与hadoop中用户一致,eclipse中run as–> run configuration -->Arguments --> VM arguments中配置执行该脚本的用户为hadoop用户
输入 -DHADOOP_USER_NAME=walker001,再run,上传的文件所属用户即为walker001

也可以在初始化环境时即指定用户,如下所示

Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://walker001:9000");
hdfs=FileSystem.get(new URI("hdfs://walker001:9000"), conf, "walker001");



copyFromLocalFile()重载方法

方法

含义

copyFromLocalFile(Path src,Path dst)

源文件,目标文件

copyFromLocalFile(boolean delSrc,Path src,Path dst)

是否删除源文件,源文件,目标文件

copyFromLocalFile(boolean delSrc,boolean overWrite,Path src,Path dst)

是否删除源文件,是否覆盖,源文件,目标文件

copyFromLocalFile(boolean delSrc,boolean overWrite,Path[] srcs,Path dst)

是否删除源文件,是否覆盖,源文件列表(多个源文件),目标文件

文件下载

思路:对照上传,初始化环境,配置源文件路径及目标路径,使用FileSystem实例的copyToLocalFile()下载

package walker_0314;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
 * 下载文件到本地
 * @author Administrator
 *2020年3月16日12:06:30
 */
public class DownloadFileToLocal {
	private static FileSystem hdfs;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		hdfs=FileSystem.get(conf);
		Path src = new Path("hdfs:/file.txt");
		Path target = new Path ("D:/new.txt");
		hdfs.copyToLocalFile(false, src, target, true);
		System.out.println("文件下载成功");
	}
}
  • tips
    copyToLocalFile()重载方法

方法

含义

copyToLocalFile(Path src,Path dst)

源文件,目标文件

copyToLocalFile(boolean delSrc,Path src,Path dst)

是否删除源文件,源文件,目标文件

copyToLocalFile(boolean delSrc,Path src,Path dst,boolean useRawLocalFileSystem)

是否删除源文件,源文件,目标文件 ,是否使用RawLocalFileSystem作为本地文件系统

创建及删除

创建文件 create()
创建目录 mkdirs()
删除文件 deleteOnExit()
删除目录 delete(Path f, boolean recursive)

创建文件

使用FileSystem的create()方法创建文件,结果为一个FSDataOutputStream对象实例

package walker_0314;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * 创建文件
 * @author Administrator
 *2020年3月15日22:35:37
 */

public class CreateFile {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		FileSystem hdfs = FileSystem.get(conf);
		//打开一个输出流
		FSDataOutputStream os = hdfs.create(new Path("hdfs:/newfile.txt"));
		//写入文件内容
		os.write("新编现代汉语词典".getBytes());
		//关闭输出流
		os.close();
		//关闭文件系统
		hdfs.close();
		System.out.println("文件创建成功");
	}
}
  • create也有多个重载方法

参数

含义

Path f

文件路径

Boolean overWrite

是否覆盖

Progressable progress

进度

short replication

副本数量

int bufferSize

写文件过程中的缓存大小

long blockSize

数据块大小

Progressable progress用于显示创建的进度,如下代码
使用输入输出流实现上传文件,并利用回调方法使用"."显示上传进度

package walker_0314;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

/**
 * 上传文件并显示进度
 * @author Administrator
 *2020年3月15日22:50:45
 */

public class UploadShowPercent {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");		
		FileSystem hdfs = FileSystem.get(conf);		
		//准备上传的本地文件
		InputStream in = new BufferedInputStream(new FileInputStream("C:/Users/Administrator/Downloads/apache-maven-3.6.3-bin.zip"));		
		FSDataOutputStream os = hdfs.create(new Path("hdfs:/test.zip"), new Progressable() {
			@Override
			public void progress() {//回调方法显示进度
				// TODO Auto-generated method stub
				System.out.println(".");
			}			
		});		
		IOUtils.copyBytes(in, os, 4096,false);
	}
}
创建目录

使用FileSystem的mkdirs()方法创建目录,该方法返回布尔值,表示创建目录是否成功

package walker_0314;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * 创建目录
 * @author Administrator
 *2020年3月15日22:27:18
 */

public class CreateDir {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		FileSystem hdfs = FileSystem.get(conf);
		boolean isok = hdfs.mkdirs(new Path("hdfs:/mydir1"));
		if(isok) {
			System.out.println("创建目录成功");
		}else {
			System.out.println("创建目录失败");
		}
		hdfs.close();	
	}
}
删除文件

使用FileSystem的deleteOnExit()方法删除文件,该方法返回布尔值,表示删除是否成功

package walker_0314;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
 *删除文件 
 * @author Administrator
 *2020年3月16日08:44:46
 */
public class DeleteFile {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		FileSystem hdfs = FileSystem.get(conf);
		Path path = new Path("hdfs:/newfile.txt");
		boolean isok = hdfs.deleteOnExit(path);
		if(isok) {
			System.out.println("删除成功");
		}else {
			System.out.println("删除失败");
		}	
		hdfs.close();
	}
}

删除目录 delete(Path f, boolean recursive) (路径,是否递归删除)
递归删除为true时,会将文件所在目录一并删除

查看

查看某个文件

定义好输入输出流,使用IOUtils.copyBytes方法从输入流传递到输出流

package walker_0314;
import java.io.IOException;
import java.io.InputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
/**
 * 查询hdfs文件内容并输出
 * @author Administrator
 *
 */
public class FileSystemCat {
	public static void main(String[] args) throws IOException {		
		Configuration conf = new Configuration();		
		//设置hdfs访问地址
		conf.set("fs.default.name", "hdfs://192.168.220.129:9000");		 
		//取得FileSystem实例
		FileSystem fs = FileSystem.get(conf);	
		//打开文件输入流
		InputStream in = fs.open(new Path("hdfs:/file.txt"));
		//输出文件内容
		IOUtils.copyBytes(in, System.out, 4096,false);
		//关闭输入流
		IOUtils.closeStream(in);
	}
}
遍历目录

使用FileSystem的listStatus(Path path)获得指定路径下的目录及文件,存储到FileStatus数组中,再进行递归遍历

package walker_0314;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * 遍历文件和目录
 * @author Administrator
 *2020年3月16日08:51:59
 */

public class ListStatus {
	private static FileSystem hdfs;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		hdfs=FileSystem.get(conf);
		//遍历HDFS上的文件和目录
		FileStatus[] fs = hdfs.listStatus(new Path("hdfs:/"));
		if(fs.length>0) {
			for (FileStatus fileStatus : fs) {
				showDir(fileStatus);
			}
		}
	}
	private static void showDir(FileStatus fs) throws FileNotFoundException, IOException {
		Path path=fs.getPath();
		//输出文件或目录的路径
		System.out.println(path);
		//如果是目录,则递归遍历该目录下的所有子目录或文件
		if(fs.isDirectory()) {
			FileStatus[] f = hdfs.listStatus(path);
			if (f.length>0) {
				for (FileStatus file : f) {
					showDir(file);
				}
			}
		}
	}
}
遍历文件

使用FileSystem的listFiles()方法可以遍历文件,且支持递归

package walker_0314;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 * 使用listFiles方法
 * @author Administrator
 *
 */

public class ListFiles {
	private static FileSystem hdfsFileSystem;
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//读取classpath下的xxxx-site.xml配置文件,并解析其内容,封装到Configuration对象
		Configuration configuration = new Configuration();
		//也可以手动设置,会覆盖从配置文件中读到的内容
		configuration.set("fs.default.name", "hdfs://walker001:9000");
		//根据配置信息,获取具体的文件系统客户端操作实例对象
		hdfsFileSystem=FileSystem.get(configuration);
		//listFiles提供的是文件信息,且支持递归遍历
		//listStatus可以列出文件和文件夹信息,不支持递归遍历
		RemoteIterator<LocatedFileStatus> listFiles = hdfsFileSystem.listFiles(new Path("hdfs:/"), true);
		while(listFiles.hasNext()) {
			LocatedFileStatus next = listFiles.next();
			Path path = next.getPath();
			String name = path.getName();
			System.out.println("--------->>>>>>>>"+name);
		}
	}
}
查看元数据

使用FileSystem的getFileStatus(Path path)方法获得文件或目录的FileStatus对象,调用FileStatus对象的方法即可获取路径,文件修改日期,文件上次访问日期等元数据信息

package walker_0314;
import java.io.IOException;
import java.sql.Timestamp;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * 
 * 获取文件或目录的元数据
 * @author Administrator
 *2020年3月16日09:11:30
 */
public class FileStatusCat {
	private static FileSystem hdfs;	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://walker001:9000");
		hdfs = FileSystem.get(conf);		
		FileStatus fileStatus = hdfs.getFileStatus(new Path("hdfs:/file.txt"));		
		//判断是文件夹还是文件
		if(fileStatus.isDirectory()) {
			System.out.println("这是文件夹");
		}else {
			System.out.println("这是文件");
		}		
		//输出元数据信息
		System.out.println("文件路径:"+fileStatus.getPath());
		System.out.println("文件修改日期:"+fileStatus.getModificationTime());
		System.out.println("文件修改日期:"+new Timestamp( fileStatus.getModificationTime()).toString());
		System.out.println("文件上次访问日期:"+new Timestamp(fileStatus.getAccessTime()).toString());
		System.out.println("文件长度:"+fileStatus.getLen());
		System.out.println("文件备份数:"+fileStatus.getReplication());
		System.out.println("文件块大小:"+fileStatus.getBlockSize());
		System.out.println("文件所有者:"+fileStatus.getOwner());
		System.out.println("文件所在分组:"+fileStatus.getGroup());
		System.out.println("文件的权限:"+fileStatus.getPermission());
		//System.out.println(fileStatus.getSymlink());
	}
}