2014-10-27 129 views
1

我试图从Java代码执行hadoop fs -put <source> <destination>。当我直接从终端执行此命令,它工作正常,但是当我试图从Java代码中执行此命令使用无法执行来自Java的hadoop fs -put命令

String[] str = {"/usr/bin/hadoop","fs -put", source, dest}; 
Runtime.getRuntime().exec(str); 

我得到错误的Error: Could not find or load main class fs。我试图执行一些非Hadoop命令,如来自Java的ls,mkdir命令,它们工作正常,但hadoop命令没有得到执行,即使它们在终端上工作正常。

这可能是什么原因造成的?我该如何解决?

JAVA API TRY:我试图使用java api来执行复制操作,但我得到错误。 Java代码是:

 String source = "/home/tmpe/file1.csv"; 
     String dest = "/user/tmpe/file1.csv"; 
     Configuration conf = new Configuration(); 
     conf.set("fs.defaultFS", "hdfs://node1:8020"); 
     FileSystem fs = FileSystem.get(conf); 
     Path targetPath = new Path(dest); 
     Path sourcePath = new Path(source); 
     fs.copyFromLocalFile(false,true,sourcePath,targetPath); 

这是我得到的错误是:

Exception in thread "main" java.io.IOException: Mkdirs failed to create /user/tmpe 
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:378) 
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:364) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:564) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:545) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:452) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:229) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1230) 

我已经创建/user/tmpe文件夹,它有完整的读写权限,但仍这个错误出现。我无法解决问题

回答

1

我想你可能没有HADOOP_HOME环境变量集。

但是既然你是在爪哇,为什么地球上你会想在外部过程中做一个haddop fs -putJava API比shell更友好?

+0

您能否提供一个我如何使用Java API执行复制的例子?抱歉,我对hadoop有点新,因此我不确定如何去做。我需要从'maven'中获得什么API? – 2014-10-27 01:08:46

+0

以及如何设置'HADOOP_HOME'? – 2014-10-27 01:12:47

+0

@JasonDonnald我提供的“Java API”链接应该足以让你开始。 'maven'只能给你依赖,而不是API。至于'HADOOP_HOME'变量(如果你真的想坚持这种方法),这应该是一个有用的资源:http://stackoverflow.com/questions/580085/is-it-possible-to-set-an-运行环境变量从java – 2014-10-27 01:19:04