我正在尝试运行一个mapreduce作业。我将输出路径设置为:/local/mypath/mr_ruslt但是得到:
SEVERE: Mkdirs failed to create: /local/mypath/mr_reuslt/_temporary
但我确信,从我的帐户,我可以做mkdir到hadoop。如果我手动执行hadoop fs-mkdir/local/mypath/mr_reuslt/_temporary,它会创建文件夹。没有其他与之相关的异常消息。我真的不认为这是权限问题。当我在mk作业中显式调用create file时,它就会被创建。有人能就这里发生的事情给我一些建议吗?抱歉,我不得不提一下,我试图从我的java代码中调用map reduce作业。我打电话给:
ToolRunner.run(new Validation(), new String[]{...,...,...});
来自我的Java代码。这就是问题所在吗?我想问一下,有没有什么好的方法可以从普通的java代码中调用mapreduce作业?
这是我的测试代码:
for(final ExecJob e: jobSet){
Thread t = new Thread(new Runnable(){
@Override
public void run() {
String inputPath = pathsForValidation.get(e);
String outputPath = inputPath+validationExten;
logger.log(LogLevel.INFO,"Should validate data in "+inputPath+", validation result in "+outputPath);
try {
ToolRunner.run(new Validation(), new String[]{TransferToHadoopUtilities.hdfsPath,inputPath,outputPath});
} catch (Exception e1) {
logger.log(LogLevel.ERROR,"Thread encountered exception:");
TransferToHadoopUtilities.logger.log(e1);
}finally{
Thread.currentThread().interrupt();
}
}
});
t.start();
}
我只是在Java程序中启动这段代码。不要做Hadoop jar。
但从Java应用程序开始。
Hadoop可能没有创建该输出目录的适当权限。当以Hadoop用户以外的系统用户身份运行作业时,可能会发生这种情况。
我想最简单的方法是在运行作业之前手动创建输出目录。
这很可能是因为用户Hadoop作业运行时没有足够的权限。
但是,我要么更改输出目录权限,要么以用户身份运行作业,而不是在每次运行作业之前手动执行任何操作。
这可能是因为目录已经存在。根据您试图完成的任务,您可能会给目录加上时间戳。顺便说一句,确保你也清理干净。