2012-08-23 15 views
6

Tôi đang học hive. Tôi đã thiết lập một bảng có tên là records. Với sơ đồ như sau:Bản đồ mẫu giảm tập lệnh trong python cho hive tạo ngoại lệ

year  : string 
temperature : int 
quality  : int 

Dưới đây là hàng mẫu

1999 28 3 
2000 28 3 
2001 30 2 

Bây giờ tôi đã viết một bản đồ mẫu giảm kịch bản trong python đúng như quy định trong cuốn sách 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) 

Tôi chạy điều này bằng cách sử dụng lệnh sau:

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

Thực hiện không thành công. Trên thiết bị đầu cuối tôi có được điều này:

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 

tôi đi đến danh sách công việc thất bại và đây là 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 

Các dấu vết tương tự lặp đi lặp lại nhiều hơn 3 lần.

Xin vui lòng, ai đó có thể giúp tôi với điều này? Có gì sai ở đây? Tôi sẽ chính xác bằng cuốn sách. Hình như có vấn đề gì thì phải. Có vẻ như có hai lỗi. Trên thiết bị đầu cuối nó nói rằng nó không thể đọc từ url đăng nhập nhiệm vụ. Trong danh sách công việc thất bại, ngoại lệ nói điều gì đó khác. Vui lòng giúp

+0

Tôi không có kinh nghiệm với hadoop/hive vì vậy tôi sẽ không gây nguy hiểm khi đoán câu trả lời nhưng thực hiện một thử nghiệm nhanh nơi tôi chạy tập lệnh python của bạn độc lập và nhập hàng dữ liệu mẫu vào stdin tại CLI - từ một quan điểm nghiêm ngặt python mã hoạt động như mong đợi. – chucksmash

+1

vâng, đó là kịch bản python là chính xác. Phải, đó là từ một cuốn sách tham khảo hadoop rất nổi tiếng: D. – Shades88

+1

Cảm ơn bạn đã đăng câu hỏi này. Tôi đang tìm một ví dụ tương tự. Rất tiện dụng! – S4M

Trả lời

2

Tôi đã đi tới nhật ký stedrr từ giao diện quản trị hadoop và thấy rằng có lỗi cú pháp từ python. Sau đó, tôi thấy rằng khi tôi tạo bảng hive thì dấu phân tách trường là tab. Và trong số split() tôi đã không đề cập đến. Vì vậy, tôi đã đổi nó thành split('\t') và nó hoạt động tốt!

+0

Tôi đang cố truy vấn một bảng mà người khác đã tạo. Tôi nghĩ rằng tôi có thể có cùng một vấn đề bạn mô tả. Bạn có biết cách kiểm tra dấu phân cách nào đã được sử dụng khi bảng được tạo không? –

0

chỉ cần sử dụng 'mô tả được định dạng' và gần cuối đầu ra, bạn sẽ tìm thấy 'Bộ nhớ mô tả dung lượng:' mô tả bất kỳ dấu phân cách nào được sử dụng.