7

Her şey yerel çalışıyor başarısız olmasına AWS üzerinde akışı Elastik MapReduce işi neden olur başarıyla tamamlandı. mapper.py, yol boyunca ilerliyor (bunu, yol boyunca stderr'a yazdığım için biliyorum). İşteKırık Boru Hata yaptığımda aşağıdaki gibi

java.io.IOException: Broken pipe 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:282) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:109) 
    at java.io.DataOutputStream.write(DataOutputStream.java:90) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeUTF8(TextInputWriter.java:72) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeValue(TextInputWriter.java:51) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:109) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 


2012-03-26 07:19:05,400 WARN org.apache.hadoop.streaming.PipeMapRed (main): java.io.IOException: Broken pipe 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:282) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) 
    at java.io.DataOutputStream.flush(DataOutputStream.java:106) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:579) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:124) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

2012-03-26 07:19:05,400 INFO org.apache.hadoop.streaming.PipeMapRed (main): mapRedFinished 
2012-03-26 07:19:05,400 WARN org.apache.hadoop.streaming.PipeMapRed (main): java.io.IOException: Bad file descriptor 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:282) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) 
    at java.io.DataOutputStream.flush(DataOutputStream.java:106) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:579) 
    at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:135) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

2012-03-26 07:19:05,400 INFO org.apache.hadoop.streaming.PipeMapRed (main): mapRedFinished 
2012-03-26 07:19:05,405 INFO org.apache.hadoop.streaming.PipeMapRed (Thread-13): MRErrorThread done 
2012-03-26 07:19:05,408 INFO org.apache.hadoop.mapred.TaskLogsTruncater (main): Initializing logs' truncater with mapRetainSize=-1 and reduceRetainSize=-1 
2012-03-26 07:19:05,519 INFO org.apache.hadoop.io.nativeio.NativeIO (main): Initialized cache for UID to User mapping with a cache timeout of 14400 seconds. 
2012-03-26 07:19:05,520 INFO org.apache.hadoop.io.nativeio.NativeIO (main): Got UserName hadoop for UID 106 from the native implementation 
2012-03-26 07:19:05,522 WARN org.apache.hadoop.mapred.Child (main): Error running child 
java.io.IOException: log:null 
R/W/S=7018/3/0 in:NA [rec/s] out:NA [rec/s] 
minRecWrittenToEnableSkip_=9223372036854775807 LOGNAME=null 
HOST=null 
USER=hadoop 
HADOOP_USER=null 
last Hadoop input: |null| 
last tool output: |text/html 1| 
Date: Mon Mar 26 07:19:05 UTC 2012 
java.io.IOException: Broken pipe 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:282) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:109) 
    at java.io.DataOutputStream.write(DataOutputStream.java:90) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeUTF8(TextInputWriter.java:72) 
    at org.apache.hadoop.streaming.io.TextInputWriter.writeValue(TextInputWriter.java:51) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:109) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 


    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:125) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 
2012-03-26 07:19:05,525 INFO org.apache.hadoop.mapred.Task (main): Runnning cleanup for the task 
2012-03-26 07:19:05,526 INFO org.apache.hadoop.mapred.DirectFileOutputCommitter (main): Nothing to clean up on abort since there are no temporary files written 

mapper.py geçerli: mapper başarısız sonra görev girişimi syslog almak çalışabilirim bir "Kırık Boru" hatası ile kesilir. Ben hata ayıklama bilgi ile kendimi sağlamak için stderr yazmak unutmayın: Burada

#!/usr/bin/env python 

import sys 
from warc import ARCFile 

def main(): 
    warc_file = ARCFile(fileobj=sys.stdin) 
    for web_page in warc_file: 
     print >> sys.stderr, '%s\t%s' % (web_page.header.content_type, 1) #For debugging 
     print '%s\t%s' % (web_page.header.content_type, 1) 
    print >> sys.stderr, 'done' #For debugging 
if __name__ == "__main__": 
    main() 

mapper.py çalıştırıldığında ben görev girişimi stderr'e alacağın şey budur:

text/html 1 
text/html 1 
text/html 1 

Temelde, döngü 3 kez çalışır ve herhangi bir hata atmadan python olmadan aniden durur. (Not: ,'un binlerce satırdan çıkması gerekir). Stderr'de bile yakalanmamış bir istisna görünmelidir.

MapReduce, yerel bilgisayarımda tamamen iyi çalıştığından, tahminimce bu, Hadoop'un mapper.py'den yazdırdığım çıktıyla nasıl başa çıktığı ile ilgili bir sorundur. Ama sorunun ne olabileceği konusunda clueless.

cevap

9

Akış işleminiz (Python betiğiniz) zamanından önce sona eriyor. Bu, girişin tamamlandığını (örneğin bir EOF'yi yorumlamak) veya yutulmuş bir istisnayı düşünmek için yapılabilir. Her iki durumda da Hadoop, komut dosyasına STDIN aracılığıyla girmeye çalışıyor, ancak uygulama sona erdiğinden (ve dolayısıyla STDIN artık geçerli bir Dosya Tanımlayıcısı değil), bir BrokenPipe hatası alıyorsunuz. Hangi girdi hattının soruna neden olduğunu görmek için komut dosyasına stderr izleri eklemenizi öneririm. Mutlu kodlama,

Geoff

+4

babonk, can Bu tavsiyeyi kullanarak probleminizi nasıl çözdüğünüze dair ayrıntılar veriyorsunuz? –

+0

Aynı. Görünüşe göre burada benzer bir hata var: http: // stackoverflow.com/questions/18556270/aws-elastic-mapreduce-doğru-dönüştürülecek-streaming-to-j-gibi görünmüyor ve piped çalışırken, ben nasıl bir kayıp olduğunu düşünüyorum akışı için "düzeltin. – Mittenchops

1

Ben AWS üzerinde Hadoop hiçbir deneyimi var ama normal bir Hadoop küme üzerinde aynı hata vardı - ve piton -mapper ./mapper.py -reducer ./reducer.py çalıştı başladı ama '-mapper python mapper.py vermedin nasıl benim durumumda sorun oldu t.

Ayrıca standart olmayan bir python paketi kullanıyorsunuz warc Gerekli dosyaları streamjob'e gönderiyor musunuz? -cacheFiles veya -cacheArchive yardımcı olabilir.

+0

Standart olmayan python paketlerini nasıl eklersiniz? Özellikle AWS elastik mapreduce, önbellek dosyaları gibi seçenekler oluşturmuyor. – Mittenchops

6

Yukarıda belirtildiği gibi, ama açıklığa kavuşturmaya çalışmama izin verin - ihtiyacınız yoksa bile, stdin'i engellemelisiniz! Bu, değil, değil, Linux boruları ile aynı, bu sizi kandırmasına izin vermeyin. Ne olur, sezgisel olarak, Streaming, çalıştırılabilirliğinizi ayağa kaldı, sonra "sizin için girdi aldığımda burada bekle" diyor. Yürütme, herhangi bir nedenle durursa, Aktarım, girişin% 100'ünü size gönderirse, Streaming diyor ki, "Hey, bu yürütülebilir dosyayı nereye çıktım? ... Hmmmm ... boru kırıldı, bu istisnayı yükseltmeme izin ver !" Yani, burada bazı piton kodu öyle hepsi, kedi yapar, ancak dikkat edeceğiz, ne bu kod tüm giriş dek değil çıkış işlenir olacak olan, ve bu anahtar noktasıdır:

#!/usr/bin/python 
import sys 

while True: 
    s = sys.stdin.readline() 
    if not s: 
     break 
    sys.stdout.write(s) 
+1

Bu hatayı alıyorum çünkü girdi ile hiçbir şey yapmıyordum. Bu kodu ekledim (benim için hiçbir şey yapmasa da) ve hata gitti. – schoon

İlgili konular