2011-01-18 12 views
5

Sto tentando di eseguire un lavoro di ridimensionamento della mappa su Hadoop Streaming con script Python e ottenere gli stessi errori di Hadoop Streaming Job failed error in python ma tali soluzioni non hanno funzionato per me.Hadoop Streaming Job non riuscito (non riuscito) in Python

miei script funzionano bene quando eseguo "cat sample.txt | ./p1mapper.py | sorta | ./p1reducer.py"

Ma quando ho eseguito il seguente:

./bin/hadoop jar contrib/streaming/hadoop-0.20.2-streaming.jar \ 
    -input "p1input/*" \ 
    -output p1output \ 
    -mapper "python p1mapper.py" \ 
    -reducer "python p1reducer.py" \ 
    -file /Users/Tish/Desktop/HW1/p1mapper.py \ 
    -file /Users/Tish/Desktop/HW1/p1reducer.py 

(NB: Anche se mi tolgo la "python" o digitare il percorso completo per -mapper e -reducer, il risultato è lo stesso)

Questa è l'uscita ottengo:

packageJobJar: [/Users/Tish/Desktop/HW1/p1mapper.py, /Users/Tish/Desktop/CS246/HW1/p1reducer.py, /Users/Tish/Documents/workspace/hadoop-0.20.2/tmp/hadoop-unjar4363616744311424878/] [] /var/folders/Mk/MkDxFxURFZmLg+gkCGdO9U+++TM/-Tmp-/streamjob3714058030803466665.jar tmpDir=null 
11/01/18 03:02:52 INFO mapred.FileInputFormat: Total input paths to process : 1 
11/01/18 03:02:52 INFO streaming.StreamJob: getLocalDirs(): [tmp/mapred/local] 
11/01/18 03:02:52 INFO streaming.StreamJob: Running job: job_201101180237_0005 
11/01/18 03:02:52 INFO streaming.StreamJob: To kill this job, run: 
11/01/18 03:02:52 INFO streaming.StreamJob: /Users/Tish/Documents/workspace/hadoop-0.20.2/bin/../bin/hadoop job -Dmapred.job.tracker=localhost:54311 -kill job_201101180237_0005 
11/01/18 03:02:52 INFO streaming.StreamJob: Tracking URL: http://www.glassdoor.com:50030/jobdetails.jsp?jobid=job_201101180237_0005 
11/01/18 03:02:53 INFO streaming.StreamJob: map 0% reduce 0% 
11/01/18 03:03:05 INFO streaming.StreamJob: map 100% reduce 0% 
11/01/18 03:03:44 INFO streaming.StreamJob: map 50% reduce 0% 
11/01/18 03:03:47 INFO streaming.StreamJob: map 100% reduce 100% 
11/01/18 03:03:47 INFO streaming.StreamJob: To kill this job, run: 
11/01/18 03:03:47 INFO streaming.StreamJob: /Users/Tish/Documents/workspace/hadoop-0.20.2/bin/../bin/hadoop job -Dmapred.job.tracker=localhost:54311 -kill job_201101180237_0005 
11/01/18 03:03:47 INFO streaming.StreamJob: Tracking URL: http://www.glassdoor.com:50030/jobdetails.jsp?jobid=job_201101180237_0005 
11/01/18 03:03:47 ERROR streaming.StreamJob: Job not Successful! 
11/01/18 03:03:47 INFO streaming.StreamJob: killJob... 
Streaming Job Failed! 

Per ogni Impossibile/Ucciso Tentativo Compito:

Map output lost, rescheduling: getMapOutput(attempt_201101181225_0001_m_000000_0,0) failed : 
org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find taskTracker/jobcache/job_201101181225_0001/attempt_201101181225_0001_m_000000_0/output/file.out.index in any of the configured local directories 
    at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathToRead(LocalDirAllocator.java:389) 
    at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathToRead(LocalDirAllocator.java:138) 
    at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:2887) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522) 

qui sono i miei script Python: p1mapper.py

#!/usr/bin/env python 

import sys 
import re 

SEQ_LEN = 4 

eos = re.compile('(?<=[a-zA-Z])\.') # period preceded by an alphabet 
ignore = re.compile('[\W\d]') 

for line in sys.stdin: 
    array = re.split(eos, line) 
    for sent in array: 
     sent = ignore.sub('', sent) 
     sent = sent.lower() 
     if len(sent) >= SEQ_LEN: 
      for i in range(len(sent)-SEQ_LEN + 1): 
       print '%s 1' % sent[i:i+SEQ_LEN] 

p1reducer.py

#!/usr/bin/env python 

from operator import itemgetter 
import sys 

word2count = {} 

for line in sys.stdin: 
    word, count = line.split(' ', 1) 
    try: 
     count = int(count) 
     word2count[word] = word2count.get(word, 0) + count 
    except ValueError: # count was not a number 
     pass 

# sort 
sorted_word2count = sorted(word2count.items(), key=itemgetter(1), reverse=True) 

# write the top 3 sequences 
for word, count in sorted_word2count[0:3]: 
    print '%s\t%s'% (word, count) 

Sarebbe davvero apprezzare alcun aiuto, Grazie!

UPDATE:

HDFS-site.xml:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<!-- Put site-specific property overrides in this file. --> 

<configuration> 

<property> 

      <name>dfs.replication</name> 

      <value>1</value> 

</property> 

</configuration> 

mapred-site.xml:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<!-- Put site-specific property overrides in this file. --> 

<configuration> 

<property> 

      <name>mapred.job.tracker</name> 

      <value>localhost:54311</value> 

</property> 

</configuration> 
+0

potrebbe essere un problema di configurazione può anche pubblicare il tuo HDFS-site.xml e mapred -site.xml configurazioni per favore. –

+0

incollato sopra. Grazie mille Joe! – sirentian

risposta

4

ti manca un sacco di configurazioni ed è necessario definire le directory e come. Vedi qui:

http://wiki.apache.org/hadoop/QuickStart

operazione Distributed è proprio come l'operazione di pseudo-distribuito descritto sopra, ad eccezione di:

  1. Specificare il nome host o l'indirizzo IP del server master i valori per fs.default. nome e mapred.job.tracker in conf/hadoop-site.xml. Questi sono specificati come host: coppie di porte.
  2. Specificare le directory per dfs.name.dir e dfs.data.dir in conf/hadoop-site.xml. Questi sono usati per contenere i dati del filesystem distribuiti rispettivamente sul nodo principale e sui nodi slave. Si noti che dfs.data.dir può contenere un elenco di nomi di directory separati da virgole o virgole, in modo che i dati possano essere archiviati su più dispositivi.
  3. Specificare mapred.local.dir in conf/hadoop-site.xml. Questo determina dove vengono scritti i dati MapReduce temporanei. Potrebbe anche essere una lista di directory.
  4. Specificare mapred.map.tasks e mapred.reduce.tasks in conf/mapred-default.xml. Come regola generale, utilizzare 10 volte il numero di processori slave per mapred.map.tasks e 2x il numero di processori slave per mapred.reduce.tasks.
  5. Lista tutti gli hostname di schiavi o gli indirizzi IP nel conf/file schiavi, uno per riga e assicurarsi JobTracker è nel file/etc/hosts che punta al nodo JobTracker
0

Beh, ho bloccato sullo stesso problema per 2 giorni ora .. La soluzione che Joe fornito nei suoi other post funziona bene per me ..

come soluzione al vostro problema suggerisco:

1) Seguire ciecamente e solo ciecamente le istruzioni su come configurare un cluster a nodo singolo here (presumo che lo abbiate già fatto)

2) Se ovunque si faccia un java.io.IOException: Incompatibile errore namespaceIDs (lo troverete se si esaminano i registri), hanno uno sguardo here

3) RIMUOVERE tutte le citazioni doppie da TUO COMANDO, nel tuo esempio eseguire

./bin/hadoop jar contrib/streaming/hadoop-0.20.2-streaming.jar \ 
    -input "p1input/*" \ 
    -output p1output \ 
    -mapper p1mapper.py \ 
    -reducer p1reducer.py \ 
    -file /Users/Tish/Desktop/HW1/p1mapper.py \ 
    -file /Users/Tish/Desktop/HW1/p1reducer.py 

questo è ridicolo, ma è stato il momento in cui ho attaccato per 2 giorni interi