Hadoop Streaming 常見錯誤(不斷更新ing)

1、streaming默認的情況下,mapper和reducer的返回值不是0,被認爲異常任務,將被再次執行,默認嘗試4次都不是0,整個job都將失敗

java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 127
	at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:320)
	at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:533)
	at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:120)
	at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
	at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
	at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:396)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:

解決方法:

  1. hadoop jar hadoop-streaming*.jar  
  2. -D stream.non.zero.exit.is.failure=false  


2、在執行streaming任務時,出現:Environment variable CLASSPATH not set!
解決方法:

在執行streaming時,加上選項:

  1. -cmdenv CLASSPATH=$CLASSPATH   


3、在調用HDFS的C接口時,出現:Call to JNI_CreateJavaVM failed with error: -1

原因:貌似是因爲在編譯的時候加上了libjvm,然後動態鏈接庫那也加了。解決方法,編譯的時候去掉libjvmm的鏈接就可以了。


關於grep:
hadoop streaming -input /user/hadoop/hadoopfile -output /user/hadoop/result -mapper "grep hello" -jobconf mapre.job.name="grep-test" -jobconf stream.non.zero.exit.is.failure=false -jobconf mapred.reduce.tasks=1
說明:
-input  /user/hadoop/hadoopfile : 待處理文件目錄
-output /user/hadoop/result   :處理結果存放目錄
-mapper "grep hello" :map程序
-jobconf mapre.job.name="grep-test" :任務名
-jobconf stream.non.zero.exit.is.failure=false  : map-reduce程序返回值不做判斷;streaming默認的情況下,mapper和reducer的返回值不是0,被認爲異常任務,將被再次執行,默認嘗試4次都不是0,整個job都將失敗。而grep在沒有匹配結果時返回1。

-jobconf mapred.reduce.tasks=1 : reduce任務數。 此處也可配置爲0,爲0配置表示告訴Map/reduce框架不要創建reducer任務

關於awk:
hadoop jar $HADOOP_STREAMING_JAR \
-input /test/ylb/mock_data/cv-pt-demo.txt \
-output /test/ylb/mock_data/output/cv-pt-demo-10 \
-mapper "awk '\$1~/1/ {printf(\"%s\t%s\n\",\$1,\$2)}'" \
-reducer "awk 'BEGIN{pt[\"test_key\"]=0;} {key=\$2/10;pt[key]+=1;} END{ for(k in pt){printf(\"%d\t%d\n\",k,pt[k]);} }'"
-mapper " awk '  '  " , 這種寫法的話, ' ' 裏面的腳本中有三種字符(shell特殊字符)需要轉義,分別是  " ' $ ,這種寫法的好處是可以方便的引用外部shell變量
-mapper '  awk " "  '    這種寫法則不需要轉義

類似的其他命令中需要嵌套單引號雙引號也是這樣。


  在調試mapred程序時,經常會遇到以下錯誤代碼:


java.io.IOException: Cannot run program "/data3/hadoop/mapred/mrlocal/taskTracker/test/jobcache/job_201203021500_101813/attempt_201203021500_101813_m_000000_0/work/./FptreeMap.py": java.io.IOException: error=2, No such file or directory 


    以上錯誤通常是由於腳本格式不正確導致(在windows上進行編碼,linux上運行)

   運行linux命令:dos2unix ,將腳本編碼轉換爲unix格式即可解決錯誤



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章