文章目录
一、HDFS-API-create写入文件内容
要求:将“hdfs write test”写入进/hdfsapi/test/01.txt文件中。
-
代码实现:
// 创建需要写入内容的文件 FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/01.txt")); // 写入内容 out.writeUTF("hdfs write test"); // 刷新缓存 out.flush(); // 关闭流 out.close();
-
使用
hadoop fs -ls /hdfsapi/test
查看文件是否存在
-
再使用
hadoop fs -cat /hdfsapi/test/01.txt
查看文件内容是否一致
-
注意需要手动配置副本数,因为在hadoop-hdfs-2.6.0-cdh5.15.1.jar中hdfs-default.xml文件默认配置3副本
设置dfs.replication属性为1即可:configuration.set("dfs.replication", "1");
二、HDFS-API-rename文件名
-
代码实现
// 源文件 Path src = new Path("/hdfsapi/test/01.txt"); // 目标文件 Path dst = new Path("/hdfsapi/test/02.txt"); // 重命名 fileSystem.rename(src, dst);
-
查看结果
三、HDFS-API-copyFromLocalFile拷贝本地文件到hdfs
-
代码实现
// 拷贝的源文件路径 Path src = new Path("/Users/xxxx/Downloads/sonar.txt"); // 拷贝进hdfs的存放路径 Path dst = new Path("/hdfsapi/test"); // 拷贝 fileSystem.copyFromLocalFile(src, dst);
-
查看结果
四、HDFS-API-带进度拷贝大文件
-
代码实现
// 获取源文件 InputStream in = new BufferedInputStream(new FileInputStream(new File("/Users/x xx/Downloads/hadoop-2.6.0-cdh5.15.1.tar.gz"))); // 需要上传hdfs的路径,带进度上传 FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/cdh5.tgz"), new Progressable() { @Override public void progress() { System.out.print("."); } }); // 拷贝文件 IOUtils.copyBytes(in, out, 4096);
-
代码效果:
-
存放位置
五、HDFS-API-copyToLocalFile拷贝文件到本地
-
代码实现
// hdfs的文件路径 Path src = new Path("/hdfsapi/test/02.txt"); // 本地目录 Path dst = new Path("/Users/xxx"); // 拷贝到本地 fileSystem.copyToLocalFile(src, dst);
六、HDFS-API-listStatus查看文件目录
-
代码实现
// 读取hdfs文件目录 FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/hdfsapi/test")); // 遍历文件目录 for (FileStatus fileStatus: fileStatuses) { short replication = fileStatus.getReplication(); long len = fileStatus.getLen(); String path = fileStatus.getPath().toString(); System.out.println(replication + "\t" + len + "\t" + path ); }
-
FileStatus
-
控制台打印结果
-
这种方式存在一个问题,就是目录中的目录文件是无法列出的。
七、HDFS-API-listFiles递归查看文件目录
-
代码实现
// 通过listFiles方法获取RemoteIterator对象 RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/hdfsapi/test"), true); // 遍历迭代器 while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); short replication = fileStatus.getReplication(); long len = fileStatus.getLen(); String path = fileStatus.getPath().toString(); System.out.println(replication + "\t" + len + "\t" + path ); }
-
控制台效果
八、HDFS-API-getFileBlockLocations查看文件块信息
-
代码实现
// 通过路径构造FileStatus对象 FileStatus fileStatus = fileSystem.getFileStatus(new Path("/hdfsapi/test/cdh5.tgz")); // 调用fileSystem的getFileBlockLocations方法构造BlockLocation数组 BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen()); // 遍历块信息数组 for (BlockLocation block: blocks) { for (String name: block.getNames()) { System.out.println(name + " : " + block.getOffset() + " : " + block.getLength()); } }
-
控制台效果:
九、HDFS-API-delete删除文件
-
代码实现
// 注意递归是否要打开true/false fileSystem.delete(new Path("/hdfsapi/test/02.txt"), true);