我是 Hadoop 和 python 的新手,遇到了一些问题。感谢您的帮助...
我有一个包含 150 条记录(只是一个示例)的文件,每条记录有 10 列,这些列被加载到 Hive 表(表 1)中。列号。 10(我们称之为 col10)是 utf-8 编码的,所以为了解码它,我编写了一个小的 Python 函数(命名为 pyfile.py),如下所示:
Python 函数:
import sys
import urllib
for line in sys.stdin:
line = line.strip()
col10 = urllib.unquote(line).decode('utf8')
print ''.join(col10.replace("+",' '))
我使用以下命令将文件添加到分布式缓存中:
add FILE folder1/pyfile.py;
现在,我使用 Transform 在我的配置单元表的 col10 上调用这个 Python 函数,如下所示:
Select Transform(col10)
USING 'python pyfile.py'
AS (col10)
From table1;
面临的问题:
问题是在表的前 100 条记录上调用它时,它工作得很好,但对于 101-150 条记录失败并出现以下错误:
2015-10-30 00:58:20,320 INFO [IPC Server handler 0 on 33716] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Diagnostics report from attempt_1445826741287_0032_m_000000_0: Error: java.lang.RuntimeException: Hive Runtime Error while closing operators
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:217)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20003]: An error occurred when trying to close the Operator running your custom script.
at org.apache.hadoop.hive.ql.exec.ScriptOperator.close(ScriptOperator.java:557)
at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610)
at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610)
at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610)
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:199)
... 8 more
我将 101-150 条记录复制到一个文本文件中,分别在它们上运行 python 脚本
并发现它运行良好。
请让我知道为什么会抛出错误的解决方案。
最佳答案
您看到的错误消息意味着 Python 正在抛出一些异常。在调试此类事情时对我有用的一件事是在我的 UDF 代码( see also my blog post about this )中使用以下模式:
import sys
import urllib
try:
for line in sys.stdin:
line = line.strip()
col10 = urllib.unquote(line).decode('utf8')
print ''.join(col10.replace("+",' '))
except:
#In case of an exception, write the stack trace to stdout so that we
#can see it in Hive, in the results of the UDF call.
print sys.exc_info()
关于python - Hive:python UDF 提供 "Hive Runtime Error while closing operators",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33470603/