hadooppythonudf_使用 Python 编写 Hive UDF 环境问题

在使用Python编写Hive UDF时遇到找不到numpy模块的问题,通过添加ARCHIVE将Anaconda环境引入,成功解决运行时环境缺失的问题。这种方法虽然可行但不推荐,因为大型包可能占用大量网络带宽。
摘要由CSDN通过智能技术生成

在 《使用Python编写Hive UDF》 文章中,我简单的谈到了如何使用 sys 包,而这个包是 numpy 中的一些函数呢?假设我们有一个表,表结构和数据如下: hive (iteblog)> show create table test_a;

OK

CREATE TABLE `test_a`(

`data` string

)

hive (iteblog)> select * from test_a;

OK

1,3,4,5

2,5,6,6

3,5,6,7

7,1,5,8

Time taken: 0.321 seconds, Fetched: 4 row(s)

hive-UDF-in-python_iteblog.jpg

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

每行数据是一个数字序列,现在我们需要求每行数字的最小值,我们使用 Python 编写的代码如下: #!/usr/bin/python

import sys

import numpy as np

def toInt(num):

return int(num)

for line in sys.stdin:

x = line.split(",")

v = np.array(map(toInt, x))

print v.min()

这里面使用了 numpy 相关的函数,现在我们来使用这个 UDF: hive (iteblog)> add file /tmp/iteblog.py;

Added resources: [/tmp/iteblog.py]

hive (iteblog)>select

> TRANSFORM(data)

> USING 'python iteblog.py'

> as (min_num)

>from test_a;

不幸的是,我们的程序运行遇到了问题: Traceback (most recent call last):

File "iteblog.py", line 4, in

import numpy as np

ImportError: No module named numpy

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:560)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:192)

at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)

at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)

at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:422)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)

at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)

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:560)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:192)

at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)

at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)

at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:422)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)

at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)

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:560)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:630)

at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:192)

at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)

at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)

at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:422)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)

at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)

从错误中我们可以看出,集群的 Python 环境并没有 numpy 的环境,所有出现了 No module named numpy 的异常。这时候我们可以通知集群的维护人员给我们部署好相关的环境,但是这个可能很麻烦。不过高兴的是,我们其实可以自己部署相关的环境,操作如下: hive (iteblog)> add ARCHIVE /home/iteblog/anaconda2.tar.gz;

hive (iteblog)> add file /tmp/iteblog.py;

hive (iteblog)> select

> TRANSFORM(data)

> USING 'anaconda2.tar.gz/anaconda2/bin/python iteblog.py'

> as (min_num)

> from test_a;

OK

1

2

3

1

Time taken: 32.728 seconds, Fetched: 4 row(s)

这次我们顺利的解决了这个问题。注意,本文提供的方法只是一种可行的方案,并不是推荐大家都这么使用,正如本文例子里面用到的 anaconda2 包,它的大小有 1G 多,如果大家都这么使用势必造成网络带宽的问题,所有如果这个包真的很常用,还是得和集群管理员商量部署好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值