2014-10-27 75 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