1、fs.copyToLocalFile(boolean delSrc, Path src, Path dst)
:
- 这个方法用于从HDFS复制文件到本地文件系统。
delSrc
参数是一个布尔值,指示是否在成功复制后删除HDFS上的源文件。src
是HDFS上的源文件路径。dst
是本地文件系统中的目标路径。- 如果
delSrc
为true
,则在成功复制文件后,HDFS上的源文件将被删除。
2、fs.open(Path f)
:
- 这个方法用于打开HDFS上的文件以进行读取。
f
是要打开的文件的路径。open
方法返回一个FSDataInputStream
对象,该对象可以用于读取文件内容。- 通常,你会在调用
open
方法后使用FSDataInputStream
的read()
方法或其他相关方法来读取文件数据
完整代码如下:
1、fs.copyToLocalFile复制到本地
public static void main(String[] args) throws Exception {
// HDFS文件路径和本地文件路径
String hdfsFilePath = "/hdfs/path/to/file";
String localFilePath = System.getProperty("user.home") + "\\Desktop\\";
// 加载Hadoop配置
Configuration conf = new Configuration();
// 这里假设HDFS的NameNode地址是hdfs://localhost:9000
// 获取HDFS文件系统的实例
FileSystem fs = FileSystem.get(new URI("hdfs://localhost:9000"),conf);
// 创建HDFS和本地文件路径对象
Path hdfsPath = new Path(hdfsFilePath);
Path localPath = new Path(localFilePath);
// 如果本地文件已存在,则删除
if (fs.exists(localPath)) {
fs.delete(localPath, true);
}
// 从HDFS复制文件到本地
fs.copyToLocalFile(hdfsPath, localPath);
// 关闭文件系统连接
fs.close();
System.out.println("File copied from HDFS to local successfully!");
}
2、fs.open(Path f)通过获取数据流的方式下载到本地
public static void main(String[] args) {
// 下载文件到桌面
String localFilePath = System.getProperty("user.home") + "\\Desktop\\";
String hdfsPaht="/file/path";
FileSystem fs = null;
// 可操作HDFS文件系统的对象
try {
Configuration cfg = new Configuration();
// 这里假设HDFS的NameNode地址是hdfs://localhost:9000
fs = FileSystem.get(new URI("hdfs://localhost:9000"),cfg);
boolean exists = fs.exists(new Path(hdfsPaht));
System.out.println("判断文件目录是否存在"+exists);
// 获取数据流
FSDataInputStream open = fs.open(new Path(hdfsPaht));
OutputStream output = new FileOutputStream(localFilePath+ "文件名");
IOUtils.copyBytes(open, output, 4096, true);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}