【问题标题】:sample map reduce script in python for hive produces exception用于 hive 的 python 中的示例 map reduce 脚本产生异常
【发布时间】:2012-08-23 13:08:25
【问题描述】:

我正在学习蜂巢。我设置了一个名为records 的表。架构如下:

year        : string
temperature : int
quality     : int

这里是示例行

1999 28 3
2000 28 3
2001 30 2

现在我完全按照 Hadoop The Definitive Guide 一书中的说明用 python 编写了一个示例 map reduce 脚本:

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)

我使用以下命令运行它:

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

执行失败。在终端上我得到了这个:

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

我转到失败的作业列表,这是堆栈跟踪

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

同一轨迹重复了 3 次以上。

请问,有人可以帮我解决这个问题吗?这里有什么问题?我完全按照书本行事。似乎是什么问题。似乎有两个错误。在终端上,它说它无法从任务日志 url 中读取。在失败的作业列表中,异常说明了一些不同的内容。请帮忙

【问题讨论】:

  • 我对 hadoop/hive 没有任何经验,所以我不会冒险猜测答案,而是做一个快速实验,我独立运行你的 python 脚本并将你的示例数据行输入到标准输入在 CLI 上是成功的 - 从严格的 python 角度来看,代码按预期工作。
  • 是的,python 脚本是正确的。必须是,它来自一本非常著名的 hadoop 参考书:D。
  • 感谢您发布这个问题。我正在寻找一个类似的例子。非常方便!

标签: python hadoop hive


【解决方案1】:

我从 hadoop 管理界面转到 stedrr 日志,发现 python 存在语法错误。然后我发现当我创建配置单元表时,字段分隔符是制表符。在split() 我没有提到。所以我把它改成了split('\t'),它工作正常!

【讨论】:

  • 我正在尝试查询其他人创建的表。我想我可能遇到了你描述的同样的问题。你知道如何检查创建表时使用的分隔符吗?
【解决方案2】:

只需使用“describe formatted”,在输出底部附近,您会发现“Storage Desc Params:”,它描述了所使用的任何分隔符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2019-01-17
    相关资源
    最近更新 更多