新手求教:如何通过Java代码执行Hadoop HDFS命令?
用Java代码操作HDFS的实用指南
嘿,恭喜你已经搞定了MapReduce和终端HDFS操作!其实用Java代码操作HDFS不用去模拟终端命令,Hadoop本身就提供了一套非常完善的FileSystem API,直接调用这些API就能完成所有你需要的操作,咱们一步步来拆解~
核心思路:依托Hadoop的FileSystem类
终端里的hdfs dfs -mkdir、hdfs dfs -put这些命令,底层都是调用Hadoop的FileSystem类实现的。所以咱们直接用这个类来写代码,比模拟终端命令更稳定、更灵活。
第一步:准备项目依赖
如果用Maven管理项目,记得在pom.xml里添加Hadoop客户端的依赖(版本要和你的Cloudera集群Hadoop版本匹配,比如Cloudera CDH 6.3.2对应的Hadoop版本是3.0.0-cdh6.3.2):
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.0.0-cdh6.3.2</version> </dependency>
第二步:常用操作的代码示例
下面是几个最常用的HDFS操作代码,你可以直接复制到项目里测试:
创建HDFS目录
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HdfsBasicOps { public static void main(String[] args) throws Exception { // 加载Hadoop配置,默认会读取classpath下的core-site.xml、hdfs-site.xml Configuration conf = new Configuration(); // 如果是远程集群,需要手动指定NameNode地址(替换成你的集群地址) // conf.set("fs.defaultFS", "hdfs://your-nn-host:9000"); // 获取FileSystem实例 FileSystem fs = FileSystem.get(conf); // 要创建的目录路径 Path targetDir = new Path("/user/your-username/test-dir"); if (!fs.exists(targetDir)) { boolean createSuccess = fs.mkdirs(targetDir); if (createSuccess) { System.out.println("目录创建成功:" + targetDir); } else { System.out.println("目录创建失败,请检查权限或路径"); } } else { System.out.println("目录已存在,无需重复创建"); } // 记得关闭资源 fs.close(); } }
上传本地文件到HDFS
在上面的代码基础上,添加这段代码就能完成上传:
// 本地文件路径和HDFS目标路径 Path localFile = new Path("/home/your-username/local-file.txt"); Path hdfsFile = new Path("/user/your-username/uploaded-file.txt"); // 执行上传(第一个参数true表示删除本地源文件,false则保留) fs.copyFromLocalFile(false, localFile, hdfsFile); System.out.println("文件上传完成");
列出HDFS目录下的文件
// 遍历指定目录下的文件(第二个参数true表示递归遍历子目录) RemoteIterator<LocatedFileStatus> fileIterator = fs.listFiles(new Path("/user/your-username"), false); while (fileIterator.hasNext()) { LocatedFileStatus fileStatus = fileIterator.next(); System.out.println("文件路径:" + fileStatus.getPath() + " | 文件大小:" + fileStatus.getLen() + "字节" + " | 修改时间:" + fileStatus.getModificationTime()); }
删除HDFS文件或目录
// 删除目标路径(第二个参数true表示递归删除目录,false只能删除文件) boolean deleteSuccess = fs.delete(new Path("/user/your-username/test-dir"), true); if (deleteSuccess) { System.out.println("删除成功"); } else { System.out.println("删除失败,可能路径不存在或权限不足"); }
几个关键注意事项
- 配置文件:如果在本地IDE运行代码,建议把集群的
core-site.xml和hdfs-site.xml放到项目的resources目录下,这样代码能自动读取集群配置,不用手动设置fs.defaultFS。 - 权限问题:运行代码的用户需要有对应的HDFS权限,比如创建目录需要目标父目录的写权限,不然会抛出
Permission denied异常。 - 版本兼容:一定要保证依赖的Hadoop版本和集群版本一致,不然可能出现各种奇怪的兼容性问题。
这些API基本能覆盖你平时用终端命令做的所有操作,而且比模拟终端命令更适合集成到Java项目里。如果有更复杂的需求,比如修改文件权限、重命名文件,都可以去查FileSystem类的其他方法,比如setPermission()、rename()这些,用法都很直观。
内容的提问来源于stack exchange,提问作者Robert Almeida
相关产品推荐
相关产品推荐

