2010-12-02 99 views
8

我想運行一個hadoop流python作業。Hadoop流 - 無法找到文件錯誤

bin/hadoop jar contrib/streaming/hadoop-0.20.1-streaming.jar 
-D stream.non.zero.exit.is.failure=true 
-input /ixml 
-output /oxml 
-mapper scripts/mapper.py 
-file scripts/mapper.py 
-inputreader "StreamXmlRecordReader,begin=channel,end=/channel" 
-jobconf mapred.reduce.tasks=0 

我確信mapper.py具有所有權限。它的錯誤了說

Caused by: java.io.IOException: Cannot run program "mapper.py":  
error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:214) 
... 19 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.(UNIXProcess.java:53) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:91) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 

我試圖複製mapper.py到HDFS並給出相同的HDFS://localhost/mapper.py鏈接,不工作過!有關如何解決這個錯誤的任何想法?

+0

你解決這個問題?我在Windows Server 2012上面臨同樣的問題。 – 2016-01-14 10:35:33

回答

6

望着在HadoopStreaming wiki page的例子,看來你應該改變

-mapper scripts/mapper.py 
-file scripts/mapper.py 

-mapper mapper.py 
-file scripts/mapper.py 

因爲「運文件去工作目錄」。您可能還需要直接指定python解釋器:

-mapper /path/to/python mapper.py 
-file scripts/mapper.py 
+0

感謝Brad,但錯誤更改爲 /System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python:can not打開文件'mapper.py':[Errno 2]沒有這樣的文件或目錄 java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子進程失敗,代碼爲2 – vkris 2010-12-03 14:00:28

+0

我有一個工作腳本,它具有-file ../scripts/ mapper.py -mapper ../scripts/mapper.py – Brig 2010-12-10 21:02:31

0

您的mapper.py是否對其執行權限?如果沒有,那麼你需要它。

chmod a+x scripts/mapper.py 

Hadoop的叉子和運行寫入之前的腳本/讀取到std所以你需要給它執行的許可才能運行。

+0

是的,它有。我在帖子中提到它擁有所有權限。 – vkris 2010-12-04 01:52:18

+1

也許你應該去任一個任務跟蹤器節點,並嘗試運行cat somedata.csv | ./mapper。你可能會發現數據節點有異常的錯誤。還有腳本目錄是bin和contrib的兄弟嗎? – 2010-12-04 02:04:28

+0

我正嘗試以僞分佈式模式運行。我曾嘗試使用實際的羣集運行,但仍出現同樣的問題。所以運行cat inputfile | ./mapper.py的作品! 是的,腳本目錄是bin,contrib的兄弟。 – vkris 2010-12-06 17:11:31

0

我剛收到同樣的錯誤,當我的映射器返回一個空或空字符串。因此,我不得不爲價值做了檢查:

try: 
    # Skip over any errors 

    word = words[18].strip() 

     if (len(word) == 0): 
      word = "UKNOWN" 

    print '%s\t%s' % (word, 1) 

except Value: 
    pass 
3

您的問題,最有可能的是,蟒蛇執行上不存在奴隸(其中的TaskTracker正在運行)。 Java會給出相同的錯誤信息。

將它安裝在使用它的地方。取消你的文件,你可以使用家當或許你已經這樣做:

#!/usr/bin/python -O 
rest 
of 
the 
code 

確保家當後的路徑是Python是安裝在的TaskTracker相同。

1

我在CDH4 Hadoop集羣上遇到完全相同的問題,試圖運行流python作業。關鍵是要在你的映射器/減速文件添加爲第一行:

import sys 
sys.path.append('.') 

這將使得在當前的工作目錄蟒的樣子,然後它應該可以運行,也確保你的家當是正確的。

2

另一個偷偷摸摸的事情可能會導致這種情況。如果腳本的行結束是DOS的風格,那麼你的第一行(「認領線」)可能看起來像這樣肉眼:

#!/usr/bin/python 

...my code here... 

但其字節像這樣的內核時它試圖執行腳本:

% od -a myScript.py 
0000000 # ! / u s r / b i n / p y t h o 
0000020 n cr nl cr nl . . . m y sp c o d e sp 
0000040 h e r e . . . cr nl 

它尋找稱爲"/usr/bin/python\r"可執行文件,它無法找到,因此它與"No such file or directory"死亡。

今天這個位,,所以我不得不把它寫在SO上的某個地方。

0

文件未找到錯誤有時並不意味着「未找到文件」,而是表示「無法執行此腳本」。

認識到這一點我解決了這樣的問題,當你與流媒體,我建議您按照檢查表的問題(沒有Java)面向:

  1. 是否腳本運行?不要開始使用解釋器,即 python myScript.py使它在啓動時可執行,如./myScript.py這是流將調用腳本的方式。
  2. 使用-verbose來查看將要部署到容器中的jar文件的內容,有時候會提供幫助。
  3. 容器腳本里面的符號鏈接不是真正的文件。
  4. 使用-file移動的文件不在文件夾中。 -mapper folder/script.py-reducer folder/script.py被視爲script.py
  5. 如果要查看容器中發生的事情,將容器及其內部的任何內容都刪除後,將其移入HDFS,IE:使用.sh替換映射器或reducer做這項工作的腳本。

這個清單幫了我很多,希望對你也有用。

下面是帶有模糊錯誤消息的經典日誌。

確實如此,它無法運行程序。

Caused by: java.io.IOException: Cannot run program "/hadoop/yarn/local/usercache/root/appcache/application_1475243242823_0007/container_1475243242823_0007_01_000004/./reducer.py": 
error=2, No such file or directory 

這是謊言的原因。

at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:209) 
    ... 15 more 

閱讀:

Caused by: java.io.IOException: error=2, No such file or directory 

這是一個謊言,不存在的文件,如果-verbose顯示它到包裝清單。

at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:187) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) 
0

我在使用python代碼運行map reduce時遇到了同樣的問題。 解決方法是:我們必須在mapper和reducer前面指定「-file」。

下面是一個命令:

hadoop jar /opt/cloudera/parcels/CDH-5.12.2-1.cdh5.12.2.p0.4/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.12.2.jar **-file /home/mapper.py** -mapper /home/mapper.py **-file /home/reducer.py** -reducer /home/reducer.py -input /system/mainstream/tmp/file.txt -output /system/mainstream/tmp/output 
相關問題