第4章 HDFS操作 (2)

FileSystem也提供了创建目录的方法,这个方法会按照客户端请求创建未存在的父目录,就像java.io.File的mkdirs()一样。如果目录创建成功,它会返回true。
下面这个例子,是在HDFS文件系统根目录,创建一个名为mydir的文件夹。

1.编写代码

在新建的hdfs_demo项目中新建Java类CreateDir.java,写入的完整代码如下所示:

import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /**创建目录mydir**/ public class CreateDir { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://192.168.170.128:9000"); FileSystem hdfs = FileSystem.get(conf); //创建目录 boolean isok = hdfs.mkdirs(new Path("hdfs:/mydir")); if(isok){ System.out.println("创建目录成功!"); }else{ System.out.println("创建目录失败!"); } hdfs.close(); } } 2.运行代码

直接在eclipse中右击运行该程序即可,若控制台中能正确输出“创建目录成功!”,说明代码编写正确。

4.2.4 创建文件

FileSystem还提供了创建文件的方法create(),通过调用这个函数,可以在HDFS文件系统中的指定路径创建一个文件,并对文件进行写入内容。例如,在HDFS系统根目录创建一个文件newfile2.txt,并写人内容“我是文件内容”,代码如下:

public static void createFile() throws Exception { Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://192.168.170.128:9000"); FileSystem fs = FileSystem.get(conf); //打开一个输出流 FSDataOutputStream outputStream = fs.create(new Path("hdfs:/newfile2.txt")); //写入文件内容 outputStream.write("我是文件内容".getBytes()); outputStream.close(); fs.close(); System.out.println("文件创建成功!"); } 4.2.5 删除文件

通过调用FileSystem提供的deleteOnExit()函数,可以对HDFS文件系统中已经存在的文件进行删除。例如,删除HDFS系统根目录下的文件newfile.txt,代码如下:

public static void deleteFile() throws Exception{ Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://192.168.170.128:9000"); FileSystem fs = FileSystem.get(conf); Path path = new Path("hdfs:/newfile.txt"); //删除文件 boolean isok = fs.deleteOnExit(path); if(isok){ System.out.println("删除成功!"); }else{ System.out.println("删除失败!"); } fs.close(); } 4.2.6 遍历文件和目录

我们可以通过FileSystem的listStatus()函数,对HDFS文件系统中指定路径下的所有目录和文件进行遍历。例如,递归遍历HDFS系统根目录下的所有文件和目录并输出路径信息,代码如下:

public class ListStatus { private static FileSystem hdfs; public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://192.168.170.128:9000"); hdfs = FileSystem.get(conf); //遍历HDFS上的文件和目录 FileStatus[] fs = hdfs.listStatus(new Path("hdfs:/")); if (fs.length > 0) { for (FileStatus f : fs) { showDir(f); } } } private static void showDir(FileStatus fs) throws Exception { 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); } } } } }

假设HDFS文件系统的根目录有文件夹input、文件newfile.txt,input中有文件test.txt,则上述代码的输出结果为:
hdfs://192.168.170.128:9000/input
hdfs://192.168.170.128:9000/input/test.txt
hdfs://192.168.170.128:9000/newfile.txt

4.2.7 上传本地文件

FileSystem提供了一个copyFromLocalFile()函数,可以将操作系统本地的文件上传到HDFS文件系统中。例如,将windows系统中D盘的copy_test.txt文件上传到HDFS文件系统的根目录,代码如下:

public static void copyFromLocalFile() throws Exception{ //1.创建配置器 Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://192.168.170.128:9000"); //2.取得FileSystem文件系统实例 FileSystem fs = FileSystem.get(conf); //3.创建可供hadoop使用的文件系统路径 Path src = new Path("D:/copy_test.txt"); //本地目录/文件 Path dst = new Path("hdfs:/"); //目标目录/文件 // 4.拷贝上传本地文件(本地文件,目标路径) 至HDFS文件系统中 fs.copyFromLocalFile(src, dst); System.out.println("文件上传成功!"); } 4.2.8 下载文件到本地

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwpg.html