2014-09-22 63 views
0

我想用hadoop流式傳輸,其中有一個用作映射器的java類。爲了使問題簡單,讓我們假設的Java代碼如下所示:hadoop流式傳輸的命令行

[[email protected] java]$ cat a.dat 
abc 
[[email protected] java]$ cat a.dat | java Test 
abc 
[[email protected] java] 

令:

import java.io.* ; 

class Test { 

    public static void main(String args[]) { 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      String input ; 
      while ((input = br.readLine()) != null) { 
        System.out.println(input) ; 
      } 
     } catch (IOException io) { 
      io.printStackTrace() ; 
     } 
    } 
} 

我可以這樣編譯它作爲「的javac Test.java」從命令行運行我們假設我在HDFS文件:a.dat

[[email protected] java]$ hadoop fs -cat /user/abhattac/a.dat 
Abc 

[[email protected] java]$ jar cvf Test.jar Test.class 
added manifest 
adding: Test.class(in = 769) (out= 485)(deflated 36%) 
[[email protected] java]$ 

現在我嘗試使用(Test.java)在Hadoop的數據流映射。我該如何提供 [1] -mapper命令行選項。它應該像以下一樣嗎? [2] - 文件命令行選項。我需要從Test.class中創建一個jar文件嗎?如果是這種情況,我是否需要包含MANIFEST.MF文件來指示主類?

我試過所有這些選項,但沒有一個似乎工作。任何幫助將不勝感激。

hadoop jar /export/apps/hadoop/latest/contrib/streaming/hadoop-streaming-1.2.1.45.jar -file Test.jar -mapper'java test'-input /user/abhattac/a.dat - 輸出/用戶/ abhattac /輸出

上述命令不起作用。在任務日誌的錯誤消息是:

標準錯誤日誌

Exception in thread "main" java.lang.NoClassDefFoundError: Test 
Caused by: java.lang.ClassNotFoundException: Test 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
+0

你爲什麼在java中使用hadoop streaming?在使用不同於Java的語言編寫map/reduce函數時,通常會使用Hadoop流式處理。 – SelimN 2014-09-23 00:08:52

回答

0

由於Hadoop的流只是鏟通過標準輸入工作提高到一個命令行可執行文件你可以在你的Test.class運行「的Java測試」像你這樣的會在本地。沒有必要打包成一個罐子。

我跑這個成功使用自己的代碼:

hadoop jar hadoop-streaming.jar -file Test.class -mapper 'java Test' -input /input -output /output 

SelimN是正確的,這是一個非常奇怪的方式去了解它,雖然,因爲你也可以同樣被寫入本地Java映射。

當您想要使用諸如bash或python之類的腳本語言而不是使用Java時,通常會使用流式處理。