(2)编写HDFS代码: HDFSUtil
package com.bigdata.mapreduce.utils; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.* ; public class HDFSUtil { private static String hdfsURL="hdfs://localhost:9000"; private static Configuration conf; static { conf = new Configuration(); conf.set("fs.defaultFS", hdfsURL); } // 从HDFS上下载文件 public static void downloadFromHDFS(String remoteFile,String localFile) throws Exception { FileSystem fs = FileSystem.get(conf); Path remotePath = new Path(remoteFile); Path localPath = new Path(localFile); fs.copyToLocalFile(remotePath, localPath); fs.close(); } // 上传文件到HDFS public static void uploadToHDFS(String localfile,String remotefile) throws Exception { FileSystem fs = FileSystem.get(conf); Path remotePath = new Path(remotefile); Path localPath = new Path(localfile); fs.copyFromLocalFile(localPath, remotePath); fs.close(); } // 创建HDFS文件夹 public static void createDirFromHDFS(String remoteDir) throws Exception { FileSystem fs = FileSystem.get(conf); Path remotePath = new Path(remoteDir); //调用mkdirs函数创建目录 fs.mkdirs(remotePath); fs.close(); } // 删除文件和文件夹 public static void deleteFromHDFS(String remoteDir) throws Exception { FileSystem fs = FileSystem.get(conf); Path remotePath = new Path(remoteDir); //调用mkdirs函数创建目录,true表示循环递归删除 fs.delete(remotePath, true); fs.close(); } // 重命名文件 public static void renameFromHDFS(String oldName, String newName) throws Exception { FileSystem fs = FileSystem.get(conf); Path hdfsOldName = new Path(oldName); Path hdfsNewName = new Path(newName); fs.rename(hdfsOldName, hdfsNewName); fs.close(); } // 查看文件夹 public static void ListHDFSDir(String remoteDir) throws Exception { FileSystem fs = FileSystem.get(conf); Path dirPath = new Path(remoteDir); /*递归获取目录下的所有文件*/ RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(dirPath, true); /*输出每个文件的信息*/ while (remoteIterator.hasNext()) { FileStatus s = remoteIterator.next(); System.out.println("路径: " + s.getPath().toString()); System.out.println("权限: " + s.getPermission().toString()); System.out.println("大小: " + s.getLen()); /*返回的是时间戳,转化为时间日期格式*/ Long timeStamp = s.getModificationTime(); SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String date = format.format(timeStamp); System.out.println("时间: " + date); System.out.println(); } fs.close(); } // 列出文件 public static List<String> listRemoteDirAndFiles(String remoteDir) throws Exception { List<String> remoteDirList = new ArrayList<>(); FileSystem fs = FileSystem.get(conf); Path dirPath = new Path(remoteDir); /*递归获取目录下的所有文件*/ RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(dirPath, true); /*输出每个文件的信息*/ while (remoteIterator.hasNext()) { FileStatus s = remoteIterator.next(); String myPath = s.getPath().toString().substring(21); remoteDirList.add(myPath); } fs.close(); return remoteDirList; } // 列出文件夹 public static List<String> listRemoteDir(String remoteDir) throws Exception { List<String> remoteDirList = new ArrayList<>(); FileSystem fs = FileSystem.get(conf); Path dirPath = new Path(remoteDir); FileStatus[] fileStatus = fs.listStatus(dirPath); for (FileStatus file : fileStatus) { if (file.isDirectory()) { listRemoteDir(file.getPath().toString()); remoteDirList.add(file.getPath().toString().substring(21)); } else { remoteDirList.add(file.getPath().toString().substring(21)); } } fs.close(); return remoteDirList; } // 移动文件夹 public static void moveDirFromHDFS(String oldPath, String newPath) throws Exception { FileSystem fs = FileSystem.get(conf); Path hdfsOldName = new Path(oldPath); Path hdfsNewName = new Path(newPath); fs.rename(hdfsOldName, hdfsNewName); fs.close(); } // 测试 // public static void main(String[] args) { // try { // 1、列出文件 // List<String> list = HDFSUtil.listRemoteDirAndFiles("/"); // for (int i = 0; i < list.size(); i++) { // System.out.println(list.get(i)); // } // 2、重名文件 // HDFSUtil.renameFromHDFS("/start-dfs.cmd", "/start-dfs.sh"); // 3、创建文件夹 // HDFSUtil.createDirFromHDFS("/hive"); // 4、移动文件夹(把/路径下的hive文件夹,放到/user路径) // HDFSUtil.moveDirFromHDFS("/hive", "/user"); // 5、删除文件或者文件夹 // HDFSUtil.deleteFromHDFS("/user"); // HDFSUtil.deleteFromHDFS("/user/hive/start-dfs.sh"); // } catch (Exception e) { // e.printStackTrace(); // } // } }
3. 运行效果
很多的功能都已经实现,虽然不是特别地实用。
直接运行MainFram类就可以看到运行效果:
4. 实现说明
(1)如果需要修改HDFS的链接,可以修改代码的值:
private static String hdfsURL="hdfs://localhost:9000";
(2)目前目录树其实是还不规范的,只是站在零基础同学角度的一个实现方案,需要自行完善。
0xFF 总结
- 通过本教程,可以扩展大家的思维,其实我们学了HDFS的API操作,并不是一无是处的,我们其实是可以自己写一个简单的小工具来使用的。
- 关注本博主,学习更多有趣的知识。