hadoop使用yarn执行MapReduce时, 一直卡在mapreduce.Job: Running job

博主记录初次配置yarn后执行MapReduce不成功的问题。通过查看resourceManager日志发现报错,原因是配置的服务器地址链接不上。先尝试修改yarn - site.xml中hostname为ip不可行,后检查hosts文件发现ip配置错误,修正后运行成功。

做下笔记以后可能用到。
在初次配置完yarn,然后执行MapReduce时,总是不成功,但jps发现前面的工作,resourceManager和nodeManager都成功启动。于是查询了下resourceManager的日志,发现有报错。
在这里插入图片描述
我查看完发现,原因是配置的服务器地址链接不上。我最开始没注意这个ip,先去检查了下yarn-site.xml,发现我配置的是hadoop134,于是我进行了以下尝试:
将这里的hostname的值改为ip,发现不可行。
然后我再回来看这报错信息,偶然看到了这个ip,发现跟我设置的ip并不一致。于是我去检查了下我的hosts文件配置,发现我的ip配置错了 - -| ,将host配置正确后,运行成功。

[root@hadoop04 ~]# hadoop jar film1.jar CleanDriver -D mapreduce.job.summary.log.level=DEBUG /film/input /film/outputs/cleandata 25/03/15 14:57:08 INFO client.RMProxy: Connecting to ResourceManager at hadoop04/192.168.100.104:8032 25/03/15 14:57:08 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 25/03/15 14:57:10 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/root/.staging/job_1742021469568_0001 Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://hadoop04:9000/user/root/CleanDriver at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:323) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:265) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:387) at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:301) at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:318) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:196) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at CleanDriver.main(CleanDriver.java:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:226) at org.apache.hadoop.util.RunJar.main(RunJar.java:141) [root@hadoop04 ~]#
最新发布
03-16
<think>嗯,用户在执行Hadoop作业的候遇到了问题,报错是Input path does not exist。我需要仔细看看这个错误信息。首先,用户运行的命令是: hadoop jar film1.jar CleanDriver -D mapreduce.job.summary.log.level=DEBUG /film/input /film/outputs/cleandata 错误提示说输入路径不存在,具体路径是hdfs://hadoop04:9000/user/root/CleanDriver。这看起来有点奇怪,因为用户指定的输入路径是/film/input。为什么会变成/user/root/CleanDriver呢? 可能的原因之一是用户在代码中设置的输入路径没有正确覆盖命令行参数。也就是说,如果CleanDriver类在代码里写死了输入路径,而没有使用命令行传入的参数,那么即使命令行里指定了路径,实际程序还是会使用代码里的路径。这候就需要检查代码中的FileInputFormat.addInputPath()是否正确使用了args参数。例如,是否args[0]被正确传递给了输入路径的设置。 另外,HDFS的路径问题也可能存在。用户指定的路径是/film/input,这个路径是否是绝对路径?在HDFS中,绝对路径应该是以hdfs://开头或者从根目录开始的路径。但有候,用户可能忘记在路径前加上hdfs://,或者在代码中处理路径没有正确拼接,导致路径错误。 还有可能用户没有正确创建输入目录。需要确认在HDFS中是否存在/film/input目录,并且里面有需要处理的数据文件。可以通过hadoop fs -ls /film/input来检查目录是否存在,以及是否有文件。 另一个可能性是用户在使用-D选项,参数的位置不正确。Hadoop命令的参数顺序有候很关键。-D后面的参数应该紧跟在jar文件之后,但在某些情况下,如果参数顺序错误,可能导致后面的路径被误解。例如,用户命令中的-D mapreduce.job.summary.log.level=DEBUG是否正确放置在jar和主类之后?正确的顺序应该是: hadoop jar film1.jar CleanDriver -D property=value input_path output_path 所以用户这里的顺序是对的,没有问题。那可能不是参数顺序的问题。 接下来看错误堆栈中的路径是hdfs://hadoop04:9000/user/root/CleanDriver,这个路径看起来像是默认路径,可能代码中没有正确获取命令行参数,导致程序使用了默认值或者错误拼接的路径。例如,可能在代码中使用了某个固定的路径,而没有正确读取args数组的参数。比如,如果在代码中误将主类名作为输入路径的一部分,或者args数组的索引错误,导致路径被错误地拼接成/user/root/CleanDriver。 比如,如果代码中错误地使用了args[1]作为输入路径,而实际args[0]才是输入路径,那么可能就会出现这种情况。或者,可能在代码中使用了某种默认路径,当参数没有正确传递,就会回退到默认路径,比如当前用户目录下的路径,即/user/root/加上主类名或其他。 因此,需要用户检查CleanDriver类的main方法,特别是处理命令行参数的部分。例如,代码中是否有类似这样的部分: public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Data Clean"); job.setJarByClass(CleanDriver.class); // 其他配置... FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // 提交作业... } 如果这里的args[0]和args[1]没有被正确设置,或者参数索引错误,就会导致路径错误。例如,如果用户传入了三个参数,但代码期望两个,或者相反,就会导致数组越界或者参数错位。 另外,用户可能没有在HDFS中正确创建输入路径。比如,用户可能使用本地文件系统的路径,而不是HDFS路径。需要确认输入路径确实是HDFS上的路径,并且存在。 还有一个可能性是权限问题,即当前用户(root)没有权限访问/film/input目录。但错误提示是路径不存在,而不是权限被拒绝,所以这个可能性较低,但也不能完全排除。不过根据错误信息,更可能的是路径确实不存在。 总结可能的解决步骤: 1. 检查HDFS上是否存在/film/input目录,使用hadoop fs -ls /film/input确认。如果不存在,需要创建并上传数据。 2. 检查代码中的路径处理逻辑,确保命令行参数被正确使用,特别是FileInputFormat.addInputPath和FileOutputFormat.setOutputPath是否正确引用了args[0]和args[1]。 3. 确认在运行命令,参数的顺序正确,输入路径和输出路径正确无误。 4. 检查是否有代码中的硬编码路径覆盖了命令行参数,导致路径被错误替换。 5. 确保在运行作业之前,输出路径/film/outputs/cleandata不存在,或者如果存在,作业应该允许覆盖(可以通过在代码中设置,或者在命令行添加 -D参数来覆盖输出目录)。 另外,错误信息中提到了WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 这个警告说明用户的主类(CleanDriver)没有实现Tool接口,也没有使用ToolRunner来运行作业,导致Hadoop无法正确解析命令行参数中的-D选项。虽然这可能不是导致输入路径错误的主要原因,但建议用户按照Hadoop的最佳实践,让主类实现Tool接口,并使用ToolRunner.run()来启动作业,这样可以更好地处理命令行参数,包括-D选项。 例如,修改CleanDriver类实现Tool接口: public class CleanDriver extends Configured implements Tool { public int run(String[] args) throws Exception { // 原来的作业配置代码,使用args[0]和args[1]作为输入输出路径 // ... return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(new CleanDriver(), args); System.exit(exitCode); } } 这样,使用ToolRunner可以正确解析-D参数,并且确保命令行参数被正确处理。 不过,这个警告可能不会直接导致输入路径错误,但修复这个问题可以让参数处理更规范,避免潜在的问题。 因此,用户需要综合检查HDFS路径是否存在、代码中的参数处理是否正确,以及是否遵循了Hadoop的Tool接口规范。</think>以下是问题分析及解决步骤: **错误原因分析** 错误信息`Input path does not exist: hdfs://hadoop04:9000/user/root/CleanDriver`表明Hadoop尝试读取的输入路径是`/user/root/CleanDriver`,而非你命令行中指定的`/film/input`。这是因为: 1. **代码未正确读取命令行参数** 你的MapReduce程序(`CleanDriver`类)未正确获取输入/输出路径参数,导致使用了默认路径`/user/root/[主类名]`。 2. **HDFS路径未正确配置** 指定路径`/film/input`可能未在HDFS中创建,或代码中路径拼接方式错误。 --- **分步解决方案** **步骤1:验证HDFS路径是否存在** 执行以下命令检查输入路径: ```bash hadoop fs -ls /film/input ``` 若路径不存在,需创建并上传数据: ```bash hadoop fs -mkdir -p /film/input hadoop fs -put [本地数据路径] /film/input ``` **步骤2:检查MapReduce代码逻辑** 确认`CleanDriver.java`中正确设置输入/输出路径: ```java // 确保使用命令行参数args[0]和args[1] FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); ``` *若参数索引错误(如误用args[1]作为输入),需修正代码。* **步骤3:规范命令行参数传递** 建议让主类实现`Tool`接口以支持`-D`参数解析: ```java public class CleanDriver extends Configured implements Tool { @Override public int run(String[] args) throws Exception { // 作业配置代码... FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // ... } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(new CleanDriver(), args); System.exit(exitCode); } } ``` 重新编译打包为`film1.jar`。 **步骤4:重新执行作业命令** 运行命令确保参数顺序: ```bash hadoop jar film1.jar CleanDriver -D mapreduce.job.summary.log.level=DEBUG /film/input /film/outputs/cleandata ``` --- **附加建议** - **输出路径需不存在**:Hadoop要求输出目录不能预先存在,否则会报错。可添加以下代码自动删除旧目录: ```java Path outputPath = new Path(args[1]); FileSystem fs = FileSystem.get(conf); if (fs.exists(outputPath)) { fs.delete(outputPath, true); } ``` - **检查HDFS权限**:确保用户`root`有权限访问`/film`目录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值