2012-08-23 12 views
6

Uczę się ula. Przygotowałem tabelę o nazwie records. Ze schematu następująco:przykładowa mapa zredukować skrypt w python dla ula produkuje wyjątek

year  : string 
temperature : int 
quality  : int 

Oto przykładowe wiersze

1999 28 3 
2000 28 3 
2001 30 2 

Teraz Pisałem próbka mapa zmniejszyć skrypt w Pythonie dokładnie tak, jak podano w książce 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) 

Uruchomię to za pomocą następującego polecenia:

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

Wykonanie nie powiedzie się. Na terminalu uzyskać to:

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 

idę do nieudanej listy zadań i to jest ślad stosu

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 

Ten sam ślad powtórzony 3 razy więcej.

Proszę, czy ktoś może mi w tym pomóc? Co jest nie tak? Idę dokładnie według książki. Co wydaje się być problemem. Wydaje się, że są dwa błędy. Na terminalu mówi, że nie może czytać z adresu URL dziennika zadań. Na liście nieudanych zadań wyjątek mówi coś innego. Proszę pomóc

+0

Nie mam żadnego doświadczenia z hadoop/ula, więc nie będę ryzykował odgadnięcia odpowiedzi, ale robię szybki eksperyment, w którym uruchomiłem twój skrypt Pythona Standalone i wpisałem twoje przykładowe wiersze danych do stdin w CLI było udane - Z punktu widzenia ściśle pythonowego kod działa zgodnie z oczekiwaniami. – chucksmash

+1

tak, ten skrypt python jest poprawny. Musi być, pochodzi z bardzo znanej książki o mizdopach: D. – Shades88

+1

Dziękujemy za opublikowanie tego pytania. Szukałem podobnego przykładu. Bardzo przydatny! – S4M

Odpowiedz

2

Poszedłem do dziennika stedrr z interfejsu administratora hadoop i zobaczyłem, że był błąd składniowy z Pythona. Następnie stwierdziłem, że po utworzeniu tabeli ula ogranicznik pola był tabulatorem. I w split() nie wspominałem. Więc zmieniłem go na split('\t') i działało dobrze!

+0

Próbuję wysłać zapytanie do tabeli utworzonej przez kogoś innego. Myślę, że mogę mieć ten sam problem, który opisujesz. Czy wiesz, jak sprawdzić, jaki separator został użyty podczas tworzenia tabeli? –

0

po prostu użyj "opisz sformatowany", a u dołu wyjścia znajdziesz "Opisy pamięci masowej": opisujące używane ograniczniki.

Powiązane problemy