针对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());
}
}