You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java远程提交MapReduce至CDH集群失败:始终提交至本地主机

解决Java远程提交MapReduce到CDH集群却跑本地的问题

这种情况我遇到过好几次,核心问题就是Hadoop客户端没有正确读取到集群配置,或者关键配置项缺失/错误,导致默认 fallback 到本地模式。下面一步步给你排查和解决:

1. 先确认配置文件是否被正确加载

你把四个xml放到项目里,但IDEA不一定能自动读取到它们。最好在代码里显式指定配置文件路径,避免依赖默认的类路径加载:

Configuration conf = new Configuration();
// 这里要根据你实际的文件路径调整,比如放在src/main/resources下的话
conf.addResource(new Path("src/main/resources/core-site.xml"));
conf.addResource(new Path("src/main/resources/hdfs-site.xml"));
conf.addResource(new Path("src/main/resources/yarn-site.xml"));
conf.addResource(new Path("src/main/resources/mapred-site.xml"));

另外,检查这些xml文件里的配置是不是和CDH集群上的完全一致——别复制错了,比如NameNode或者ResourceManager的地址写错就全白搭。

2. 强制设置关键配置项,堵死本地模式的后路

有时候就算加载了配置文件,也可能因为版本兼容或者配置项被覆盖,导致客户端还是走本地。直接在代码里硬设几个核心参数:

// 指定用YARN作为资源调度框架,默认是local
conf.set("mapreduce.framework.name", "yarn");
// 指向你的CDH集群ResourceManager地址(端口一般是8032,根据集群配置调整)
conf.set("yarn.resourcemanager.address", "你的集群RM主机名:8032");
// 指向集群的NameNode地址(CDH默认端口8020)
conf.set("fs.defaultFS", "hdfs://你的集群NN主机名:8020");
// 可选:指定JobHistoryServer地址,方便看日志
conf.set("mapreduce.jobhistory.address", "你的集群JH主机名:10020");

3. 必须保证依赖版本和CDH集群完全匹配

这是很多人踩的坑!CDH的Hadoop是定制过的版本,比如CDH5.16.2对应的Hadoop是2.6.0-cdh5.16.2,不能用Apache官方的hadoop-common、hadoop-mapreduce-client-core这些依赖。

你需要在pom.xml里配置CDH的maven仓库,然后引入对应版本的依赖:

<repositories>
    <repository>
        <id>cloudera</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0-cdh5.16.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.6.0-cdh5.16.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-yarn-common</artifactId>
        <version>2.6.0-cdh5.16.2</version>
    </dependency>
</dependencies>

版本号一定要和你的CDH集群对应,查集群版本可以在CM里看,或者执行hadoop version命令。

4. 处理Jar包的问题

远程提交作业时,集群需要能获取到你的作业Jar包。如果是在IDEA里直接运行,记得在代码里指定Jar路径:

Job job = Job.getInstance(conf, "你的作业名称");
job.setJarByClass(YourMRJob.class);
// 或者直接指定Jar文件的绝对路径,比如你打包后的Jar在target目录下
job.setJar("target/your-mr-job-1.0.jar");

如果不指定,客户端可能会在本地生成.staging目录,尝试在本地运行作业——这就是你看到的现象。

5. 检查Windows环境变量的干扰

虽然你说本地没装Hadoop,但如果之前设置过HADOOP_HOME环境变量(哪怕是空的或者指向错误路径),Hadoop客户端可能会读取这个变量,导致行为异常。建议暂时删除这个环境变量,重启IDEA再试。

最后验证

运行作业前,先在代码里加一行打印,确认配置是否生效:

System.out.println("fs.defaultFS: " + conf.get("fs.defaultFS"));
System.out.println("mapreduce.framework.name: " + conf.get("mapreduce.framework.name"));

如果输出的是集群的地址和yarn,那基本没问题了。

内容的提问来源于stack exchange,提问作者user7831278

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:31