hadoop 报错:Error: Could not find or load main class

本文介绍了Hadoop MapReduce任务中常见的错误及其解决方法,包括如何设置正确的类路径和处理输出目录已存在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Error: Could not find or load main class


报这个错是因为当前运行的 .class  文件不在 hadoop-env.sh文件中
export HADOOP_CLASSPATH=${HADOOP_HOME}//你运行的*.class 文件所在路径


[john@localhost ch02]$ ls
input  output  pom.xml  src  target
[john@localhost ch02]$ export $HADOOP_CLASSPATH=target/classes
bash: export: `build/classes=target/classes': not a valid identifier
[john@localhost ch02]$ export HADOOP_CLASSPATH=target/classes
[john@localhost ch02]$ echo $HADOOP_CLASSPATH
target/classes
[john@localhost ch02]$ hadoop MaxTemperature input/sample.txt output
14/12/13 12:27:14 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/12/13 12:27:14 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/home/john/hadoop/book_res/code/hadoop-book-master/ch02/output already exists
    at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
    at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:562)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:432)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
    at MaxTemperature.main(MaxTemperature.java:31)

------

上面信息报错,output文件已经存在。hadoop输出文件路径需要,hadoop自己来建,我们创建就会报上面的错误。

修改方法:

[john@localhost ch02]$ rm -rf output/
[john@localhost ch02]$ ls
input  pom.xml  src  target
[john@localhost ch02]$ hadoop MaxTemperature input/sample.txt output
14/12/13 12:28:40 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/12/13 12:28:40 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
14/12/13 12:28:41 WARN mapreduce.JobSubmitter: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
14/12/13 12:28:41 WARN mapreduce.JobSubmitter: No job jar file set.  User classes may not be found. See Job or Job#setJar(String).
14/12/13 12:28:41 INFO input.FileInputFormat: Total input paths to process : 1
14/12/13 12:28:41 INFO mapreduce.JobSubmitter: number of splits:1
14/12/13 12:28:42 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local1165163551_0001
14/12/13 12:28:42 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
14/12/13 12:28:42 INFO mapreduce.Job: Running job: job_local1165163551_0001
14/12/13 12:28:42 INFO mapred.LocalJobRunner: OutputCommitter set in config null
14/12/13 12:28:42 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
14/12/13 12:28:42 INFO mapred.LocalJobRunner: Waiting for map tasks
14/12/13 12:28:42 INFO mapred.LocalJobRunner: Starting task: attempt_local1165163551_0001_m_000000_0
14/12/13 12:28:43 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
14/12/13 12:28:43 INFO mapred.MapTask: Processing split: file:/home/john/hadoop/book_res/code/hadoop-book-master/ch02/input/sample.txt:0+1485
14/12/13 12:28:43 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
14/12/13 12:28:43 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
14/12/13 12:28:43 INFO mapred.MapTask: soft limit at 83886080
14/12/13 12:28:43 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
14/12/13 12:28:43 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
14/12/13 12:28:43 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
14/12/13 12:28:43 INFO mapred.LocalJobRunner:
14/12/13 12:28:43 INFO mapred.MapTask: Starting flush of map output
14/12/13 12:28:43 INFO mapred.MapTask: Spilling map output
14/12/13 12:28:43 INFO mapred.MapTask: bufstart = 0; bufend = 99; bufvoid = 104857600
14/12/13 12:28:43 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214356(104857424); length = 41/6553600
14/12/13 12:28:43 INFO mapred.MapTask: Finished spill 0
14/12/13 12:28:43 INFO mapred.Task: Task:attempt_local1165163551_0001_m_000000_0 is done. And is in the process of committing
14/12/13 12:28:43 INFO mapred.LocalJobRunner: map
14/12/13 12:28:43 INFO mapred.Task: Task 'attempt_local1165163551_0001_m_000000_0' done.
14/12/13 12:28:43 INFO mapred.LocalJobRunner: Finishing task: attempt_local1165163551_0001_m_000000_0
14/12/13 12:28:43 INFO mapred.LocalJobRunner: map task executor complete.
14/12/13 12:28:43 INFO mapred.LocalJobRunner: Waiting for reduce tasks
14/12/13 12:28:43 INFO mapred.LocalJobRunner: Starting task: attempt_local1165163551_0001_r_000000_0
14/12/13 12:28:43 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
14/12/13 12:28:43 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@42cd2b59
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=333971456, maxSingleShuffleLimit=83492864, mergeThreshold=220421168, ioSortFactor=10, memToMemMergeOutputsThreshold=10
14/12/13 12:28:43 INFO reduce.EventFetcher: attempt_local1165163551_0001_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
14/12/13 12:28:43 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local1165163551_0001_m_000000_0 decomp: 123 len: 127 to MEMORY
14/12/13 12:28:43 INFO reduce.InMemoryMapOutput: Read 123 bytes from map-output for attempt_local1165163551_0001_m_000000_0
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 123, inMemoryMapOutputs.size() -> 1, commitMemory -> 0, usedMemory ->123
14/12/13 12:28:43 INFO reduce.EventFetcher: EventFetcher is interrupted.. Returning
14/12/13 12:28:43 INFO mapred.LocalJobRunner: 1 / 1 copied.
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: finalMerge called with 1 in-memory map-outputs and 0 on-disk map-outputs
14/12/13 12:28:43 INFO mapred.Merger: Merging 1 sorted segments
14/12/13 12:28:43 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 116 bytes
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: Merged 1 segments, 123 bytes to disk to satisfy reduce memory limit
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: Merging 1 files, 127 bytes from disk
14/12/13 12:28:43 INFO reduce.MergeManagerImpl: Merging 0 segments, 0 bytes from memory into reduce
14/12/13 12:28:43 INFO mapred.Merger: Merging 1 sorted segments
14/12/13 12:28:43 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 116 bytes
14/12/13 12:28:43 INFO mapred.LocalJobRunner: 1 / 1 copied.
14/12/13 12:28:43 INFO mapreduce.Job: Job job_local1165163551_0001 running in uber mode : false
14/12/13 12:28:43 INFO Configuration.deprecation: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
14/12/13 12:28:43 INFO mapreduce.Job:  map 100% reduce 0%
14/12/13 12:28:43 INFO mapred.Task: Task:attempt_local1165163551_0001_r_000000_0 is done. And is in the process of committing
14/12/13 12:28:43 INFO mapred.LocalJobRunner: 1 / 1 copied.
14/12/13 12:28:43 INFO mapred.Task: Task attempt_local1165163551_0001_r_000000_0 is allowed to commit now
14/12/13 12:28:43 INFO output.FileOutputCommitter: Saved output of task 'attempt_local1165163551_0001_r_000000_0' to file:/home/john/hadoop/book_res/code/hadoop-book-master/ch02/output/_temporary/0/task_local1165163551_0001_r_000000
14/12/13 12:28:43 INFO mapred.LocalJobRunner: reduce > reduce
14/12/13 12:28:43 INFO mapred.Task: Task 'attempt_local1165163551_0001_r_000000_0' done.
14/12/13 12:28:43 INFO mapred.LocalJobRunner: Finishing task: attempt_local1165163551_0001_r_000000_0
14/12/13 12:28:43 INFO mapred.LocalJobRunner: reduce task executor complete.
14/12/13 12:28:44 INFO mapreduce.Job:  map 100% reduce 100%
14/12/13 12:28:44 INFO mapreduce.Job: Job job_local1165163551_0001 completed successfully
14/12/13 12:28:44 INFO mapreduce.Job: Counters: 33
    File System Counters
        FILE: Number of bytes read=3652
        FILE: Number of bytes written=498027
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
    Map-Reduce Framework
        Map input records=11
        Map output records=11
        Map output bytes=99
        Map output materialized bytes=127
        Input split bytes=142
        Combine input records=0
        Combine output records=0
        Reduce input groups=2
        Reduce shuffle bytes=127
        Reduce input records=11
        Reduce output records=2
        Spilled Records=22
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=37
        CPU time spent (ms)=0
        Physical memory (bytes) snapshot=0
        Virtual memory (bytes) snapshot=0
        Total committed heap usage (bytes)=365953024
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=1485
    File Output Format Counters
        Bytes Written=30
[john@localhost ch02]$


==========

思路来源:http://f.dataguru.cn/thread-167471-1-1.html

<think>我们正在解决Hadoop运行时出现的“Error:Couldnotfindorloadmainclass”错误。根据引用内容,这个问题通常与类路径配置有关。用户提到了“Error:CouldnotfindorloadmainclassHADOOP_HOME.lib”,这表明在类路径中可能错误地引用了HADOOP_HOME.lib(应该是一个目录,而类路径需要的是具体的jar文件)。根据引用[1]和[3],我们看到类似的错误(如找不到org.apache.hadoop.hbase.util.GetJavaProperty或org.apache.hadoop.mapreduce.v2.app.MRAppMaster)的解决方案通常涉及正确设置类路径(CLASSPATH)或相关的Hadoop配置属性。特别地,引用[4]提供了解决MapReduce中找不到MRAppMaster类的方法,即通过配置mapred-site.xml文件中的相关属性。因此,我们针对用户的问题“Error:CouldnotfindorloadmainclassHADOOP_HOME.lib”给出以下解决方案:1.**检查环境变量HADOOP_HOME**:确保HADOOP_HOME环境变量正确设置为Hadoop的安装目录。2.**检查类路径配置**:在运行Hadoop命令时,确保类路径包含了所有必需的jar文件。注意,类路径中应该包含具体的jar文件或使用通配符(*)来指定一个目录下的所有jar文件,而不是直接引用目录(如HADOOP_HOME.lib,这会被当作一个类名,导致错误)。但是,用户错误信息中出现的“HADOOP_HOME.lib”被当作类名,这通常是因为在命令行或配置文件中错误地将环境变量扩展写成了`$HADOOP_HOME.lib`(注意中间没有斜杠),导致系统试图加载名为“HADOOP_HOME.lib”的类(显然不存在)。正确的写法应该是`$HADOOP_HOME/lib`(目录)或`$HADOOP_HOME/lib/*`(目录下所有jar)。因此,具体步骤:步骤1:检查环境变量HADOOP_HOME-在终端执行:`echo$HADOOP_HOME`-确保输出的是正确的Hadoop安装路径,例如:`/usr/local/hadoop`步骤2:检查运行命令中的类路径设置-如果你在命令行中运行程序,并手动指定了类路径,确保类路径中目录的写法正确。例如:错误:`-classpath$HADOOP_HOME.lib`(这会被解释为类路径包含一个名为HADOOP_HOME.lib的目录,但实际目录是lib,且环境变量替换后应该是一个路径)正确:`-classpath$HADOOP_HOME/lib/*`(使用通配符加载该目录下所有jar)步骤3:检查Hadoop配置文件(如果是MapReduce作业)-如果是运行MapReduce作业时出现的错误,参考引用[4]中的方法,配置mapred-site.xml文件:```xml<property><name>mapreduce.application.classpath</name><value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property>```注意:这里`$HADOOP_MAPRED_HOME`通常设置为`$HADOOP_HOME`,所以上面的配置中直接使用`${HADOOP_HOME}`来设置环境变量。步骤4:检查脚本中的环境变量引用-在Hadoop的启动脚本(如start-dfs.sh,start-yarn.sh)或你自己编写的脚本中,检查是否有错误的环境变量引用,比如将`$HADOOP_HOME/lib`写成了`$HADOOP_HOME.lib`。步骤5:重新启动Hadoop-修改配置后,重启Hadoop集群以使配置生效。如果问题仍然存在,可以尝试以下通用方法:-检查Hadoop安装目录下的lib目录是否存在,并且包含必要的jar文件。-检查用户是否有权限访问这些jar文件。根据引用[2],如果使用的是源代码版本,需要先编译。但用户的问题似乎不是这个原因。因此,我们重点检查环境变量和类路径的设置。下面我们将按照上述步骤详细说明。</think>## 解决 "Error: Could not find or load main class HADOOP_HOME.lib" 错误 此错误通常由 Hadoop 环境变量配置错误或类路径设置问题引起。以下是系统化的解决方案: ### 核心解决步骤 1. **验证环境变量配置**(引用[1][4]) ```bash # 检查关键环境变量是否正确 echo $HADOOP_HOME # 应输出Hadoop安装路径如/usr/local/hadoop echo $HADOOP_MAPRED_HOME # 应指向Hadoop的MapReduce目录 echo $CLASSPATH # 应包含Hadoop库路径 ``` 确保在 `~/.bashrc` 或 `~/.profile` 中正确定义: ```bash export HADOOP_HOME=/usr/local/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export CLASSPATH="$HADOOP_CONF_DIR:$HADOOP_HOME/lib/*:$JAVA_HOME/lib/tools.jar" ``` 2. **配置 mapred-site.xml**(引用[4]) 在 `$HADOOP_HOME/etc/hadoop/mapred-site.xml` 中添加: ```xml <property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> ``` 3. **检查库文件完整性**(引用[2]) ```bash # 确认lib目录存在且包含必要JAR文件 ls $HADOOP_HOME/lib # 检查文件权限(应为可读) ls -l $HADOOP_HOME/lib/hadoop-*.jar ``` 4. **重建类路径缓存**(引用[1][3]) ```bash # 刷新Hadoop配置 hdfs namenode -format # 注意:会清除HDFS数据! $HADOOP_HOME/sbin/stop-all.sh $HADOOP_HOME/sbin/start-all.sh ``` ### 验证与测试方法 1. 运行基础测试: ```bash hadoop version # 应显示版本信息 ``` 2. 执行MapReduce测试作业: ```bash hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input /output ``` 3. 检查日志文件: ```bash tail -n 100 $HADOOP_HOME/logs/*.log ``` ### 常见陷阱排查 1. **环境变量作用域问题** - 确保在相同终端会话中执行`source ~/.bashrc` - 使用`sudo -E`传递环境变量给特权命令 2. **路径通配符错误** - 使用`$HADOOP_HOME/lib/*`而非`$HADOOP_HOME.lib` - 确认路径包含实际JAR文件(而非空目录) 3. **版本不匹配**(引用[2]) - 确认安装的是二进制发行版而非源代码版 - 检查Hadoop与Java版本兼容性 --- ### 相关问题 1. 如何正确设置Hadoop集群的环境变量?[^1][^4] 2. Hadoop中`mapred-site.xml`和`yarn-site.xml`的核心配置项有哪些区别?[^4] 3. 为什么需要设置`HADOOP_MAPRED_HOME`环境变量?[^4] 4. Hadoop类路径(CLASSPATH)的配置原理是什么?[^1][^3] 5. 如何诊断Hadoop作业执行时的类加载失败问题?[^3][^4]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值