hadoop中hdfs日常使用总结

针对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());
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值