2012-08-23 5 views
6

Ich lerne Bienenstock. Ich habe eine Tabelle mit dem Namen records eingerichtet. Mit Schema wie folgt:Beispiel-Map Skript in Python für Stock reduzieren erzeugt Ausnahme

year  : string 
temperature : int 
quality  : int 

Hier sind Beispielzeilen

1999 28 3 
2000 28 3 
2001 30 2 

Jetzt habe ich eine Probe-Zuordnungs-Skript in Python reduzieren genau wie im Buch angegebenen Hadoop The Definitive Guide:

import re 
import sys 

for line in sys.stdin: 
    (year,tmp,q) = line.strip().split() 
    if (tmp != '9999' and re.match("[01459]",q)): 
     print "%s\t%s" % (year,tmp) 

Ich führe dies mit folgendem Befehl aus:

ADD FILE /usr/local/hadoop/programs/sample_mapreduce.py; 
SELECT TRANSFORM(year, temperature, quality) 
USING 'sample_mapreduce.py' 
AS year,temperature; 

Ausführung schlägt fehl. Auf dem Terminal bekomme ich dies:

Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0 
2012-08-23 18:30:28,506 Stage-1 map = 0%, reduce = 0% 
2012-08-23 18:30:59,647 Stage-1 map = 100%, reduce = 100% 
Ended Job = job_201208231754_0005 with errors 
Error during job, obtaining debugging information... 
Examining task ID: task_201208231754_0005_m_000002 (and more) from job job_201208231754_0005 
Exception in thread "Thread-103" java.lang.RuntimeException: Error while reading from task log url 
    at org.apache.hadoop.hive.ql.exec.errors.TaskLogProcessor.getErrors(TaskLogProcessor.java:130) 
    at org.apache.hadoop.hive.ql.exec.JobDebugger.showJobFailDebugInfo(JobDebugger.java:211) 
    at org.apache.hadoop.hive.ql.exec.JobDebugger.run(JobDebugger.java:81) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://master:50060/tasklog?taskid=attempt_201208231754_0005_m_000000_2&start=-8193 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436) 
    at java.net.URL.openStream(URL.java:1010) 
    at org.apache.hadoop.hive.ql.exec.errors.TaskLogProcessor.getErrors(TaskLogProcessor.java:120) 
    ... 3 more 

ich gescheitert Jobliste gehen und dies ist der Stack-Trace

java.lang.RuntimeException: Hive Runtime Error while closing operators 
    at org.apache.hadoop.hive.ql.exec.ExecMapper.close(ExecMapper.java:226) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) 
    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:1121) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hit error while closing .. 
    at org.apache.hadoop.hive.ql.exec.ScriptOperator.close(ScriptOperator.java:452) 
    at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:566) 
    at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:566) 
    at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:566) 
    at org.apache.hadoop.hive.ql.exec.ExecMapper.close(ExecMapper.java:193) 
    ... 8 more 

Die gleiche Spur wiederholt 3-mal mehr.

Bitte, kann mir jemand dabei helfen? Was ist hier falsch? Ich gehe genau nach dem Buch. Was scheint das Problem zu sein. Es scheint zwei Fehler zu geben. Am Terminal heißt es, dass es nicht aus der Task-Log-URL lesen kann. In der Liste der fehlgeschlagenen Jobs sagt die Ausnahme etwas anderes aus. Bitte helfen

+0

Ich habe keine Erfahrung mit Hadoop/Hive, also werde ich keine Vermutung auf eine Antwort riskieren, aber ein schnelles Experiment, wo ich Ihr Python-Skript standalone und tippte Ihre Beispieldatenzeilen in stdin am CLI war erfolgreich - Aus einer strikten Python-Perspektive funktioniert der Code wie erwartet. – chucksmash

+1

Ja, das Python-Skript ist korrekt. Muss sein, stammt von einem sehr berühmten Hadoop-Nachschlagewerk: D. – Shades88

+1

Vielen Dank für das Posten dieser Frage. Ich war auf der Suche nach einem ähnlichen Beispiel. Sehr praktisch! – S4M

Antwort

2

Ich ging zu Stedrr-Log von der Hadoop Admin-Schnittstelle und sah, dass es Syntaxfehler von Python gab. Dann fand ich, dass, wenn ich die Hive-Tabelle erstellte, das Feldbegrenzer Tab war. Und in der split() hatte ich nicht erwähnt. Also änderte ich es auf split('\t') und es funktionierte gut!

+0

Ich versuche eine Tabelle anzufordern, die jemand anders erstellt hat. Ich denke, ich habe das gleiche Problem, das Sie beschreiben. Wissen Sie, wie Sie überprüfen können, welches Trennzeichen beim Erstellen der Tabelle verwendet wurde? –

0

Verwenden Sie einfach "beschreiben formatiert" und nahe dem unteren Rand der Ausgabe finden Sie "Storage Desc Params:", die alle verwendeten Trennzeichen beschreiben.