Hadoop JAR包运行时权限不够的问题

在运行Hadoop JAR包时遇到了'权限不够'的错误,错误涉及TaskRunner和execvp。尝试了修改log文件权限和删除userlog文件等方法未果。通过StackOverflow找到解决方案,问题出在$JAVA_HOME的配置上,需将其指向jre的bin目录,并确保文件具有执行权限。此外,也有建议检查是否因JDK位数不匹配导致问题。

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

错误信息如下:


13/11/10 22:19:09 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000002_0, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000002_0: execvp: 权限不够
13/11/10 22:19:12 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000002_1, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000002_1: execvp: 权限不够
13/11/10 22:19:15 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000002_2, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000002_2: execvp: 权限不够
13/11/10 22:19:22 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000001_0, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000001_0: execvp: 权限不够
13/11/10 22:19:25 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000001_1, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000001_1: execvp: 权限不够
13/11/10 22:19:28 INFO mapred.JobClient: Task Id : attempt_201311102206_0004_m_000001_2, Status : FAILED
java.lang.Throwable: Child Error
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Task process exit with nonzero status of 1.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)


attempt_201311102206_0004_m_000001_2: execvp: 权限不够


百度搜了半天,有说改log文件权限的,还有说把userlog删了的,都没用。最后想到取StackOverFlow上搜一下,结果还真有:
<blockquote>We have same problem. we fix it by adding 'execute' to below file.


$JAVA_HOME/jre/bin/java
Because hadoop use $JAVA_HOME/jre/bin/java to spawn task program instead of $JAVA_HOME/bin/java.


If you still have this issue after change the file mode, suggest you use remote debug to find the shell cmd which spawning the task, see debugging hadoop task</blockquote>
就是将hadoop-env中不应改设置成jdk的home,应该设为jre的home。果然成功!


楼下还有个老外是这么说的:
<blockquote>I have encountered the same problem.


You can try changing the jdk version 32bit to 64bit or 64bit to 32bit.</blockquote>
&nbsp;
<think>好的,我现在需要帮助用户了解如何在Eclipse中将项目导出为可执行JAR并在Hadoop集群中运行。首先,我要回想一下用户提供的引用内容,看看有没有相关的信息可以利用。 用户提到的引用[2]和引用[4]提到了在Eclipse中运行MapReduce程序可能会遇到的参数问题,特别是路径错误。这说明用户可能对如何正确配置运行环境有疑问。而用户现在的问题是关于打JAR文件并在集群上运行,这和直接在Eclipse中运行有所不同,所以需要分步骤讲解。 首先,我需要回忆Eclipse导出JAR的流程。通常是通过右键项目选择Export,然后选择JAR file,设置主类。但HadoopJAR需要含依赖库吗?根据经验,通常建议将依赖打成uber JAR含所有依赖),或者通过Hadoop的-classpath参数指定库路径。不过用户可能只需要基本的打步骤,所以先指导他们导出普通的可执行JAR。 然后,在Hadoop集群上运行JAR需要使用hadoop命令,例如hadoop jar xxx.jar MainClass input output。这里需要注意主类的全限定名是否正确,以及输入输出路径是否是HDFS的路径,如引用[4]提到的路径问题,用户可能需要确保输入路径存在于HDFS中,而不是本地文件系统。 另外,引用[3]提到输出路径的问题,用户可能需要指定HDFS路径如/user/lb/output/output.dat,所以在运行命令要正确指定路径。此外,用户可能遇到的常见错误括类找不到(依赖问题)或输入路径不存在,需要提醒他们检查这些点。 总结步骤应该是:1. 导出JAR;2. 传输到集群;3. 使用hadoop命令运行,并处理输入输出路径。同需要确保Hadoop配置正确,比如core-site.xml等是否指向集群的地址,而不是本地模式。 可能还需要考虑是否需要将依赖库打进去,或者使用Hadoop提供的类路径。如果用户的项目依赖其他库,比如第三方JAR,那么导出需要含这些,否则会出现NoClassDefFoundError。这可能需要使用Eclipse的“Runnable JAR”导出选项,并选择“Package required libraries into generated JAR”。 另外,需要提醒用户在运行前确保HDFS中存在输入文件,可以通过hadoop fs -put命令上传,如引用[1]和引用[4]提到的文件不存在问题,避免因此导致任务失败。 最后,可能的问题权限问题、集群资源不足、或者JAR中的主类配置错误。需要详细说明每个步骤,确保用户能正确执行。</think>### 如何将Eclipse工程打JAR并在Hadoop集群运行 #### 一、导出可执行JAR文件 1. **右键项目选择导出** 在Eclipse的`Package Explorer`中右键点击项目,选择 **Export** -> **Java** -> **Runnable JAR file**。 2. **配置导出参数** - **Launch configuration**: 选择含`main`方法的入口类(如`WordCount`) - **Export destination**: 指定JAR文件保存路径(如`WordCount.jar`) - **Library handling**: 建议选择 **Package required libraries into the generated JAR**(避免依赖缺失问题) 3. **完成导出** 点击 **Finish**,生成含依赖的可执行JAR文件[^2][^4]。 --- #### 二、将JAR传输至Hadoop集群 通过`scp`或文件管理工具将生成的JAR文件上传到Hadoop集群主节点: ```bash scp WordCount.jar hadoop@master-node:/home/hadoop/jars/ ``` --- #### 三、在Hadoop集群运行JAR 1. **确保输入文件已上传至HDFS** ```bash hadoop fs -mkdir /input # 创建输入目录 hadoop fs -put local_data.txt /input # 上传本地文件到HDFS ``` 2. **执行MapReduce任务** 使用`hadoop jar`命令运行JAR文件,并指定输入/输出路径: ```bash hadoop jar WordCount.jar WordCount /input /output ``` - `WordCount.jar`: 生成的JAR文件名 - `WordCount`: 主类的全限定名(如`org.example.WordCount`) - `/input`和`/output`: HDFS路径(确保输出目录不存在)[^3][^5] --- #### 四、验证运行结果 1. **查看任务日志** 命令行会显示MapReduce任务进度和最终状态。 2. **检查输出文件** ```bash hadoop fs -ls /output # 查看输出目录 hadoop fs -cat /output/part-r-00000 # 查看统计结果 ``` --- #### 常见问题排查 1. **ClassNotFoundException** - 导出JAR含依赖库 → 重新导出并选择 **Package required libraries** - 主类名错误 → 检查`hadoop jar`命令中的全限定类名 2. **输入路径不存在** - 确保输入路径在HDFS中,而非本地路径(如`file:/home/...`) → 使用`hadoop fs -ls`验证 3. **权限问题** - 检查HDFS目录权限:`hadoop fs -chmod -R 755 /input` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值