【问题标题】:'No module named happybase' when running from PIG从 PIG 运行时“没有名为 happybase 的模块”
【发布时间】:2015-12-15 12:14:49
【问题描述】:

我有一个 Python UDF,它使用 Happybase 连接到 HBase。如果我从 Python 2.7 运行代码,它会完美运行。

但是,当我从 Pig 0.15.0 调用 Python UDF 时,出现以下错误:

错误 org.apache.pig.tools.grunt.Grunt - 错误 1121:Python 错误。 Traceback(最近一次调用最后一次):import happybase ImportError: No module named happybase

在我的 Pig 脚本中,我正在注册我的 Python 脚本 (pigtest.py),如下所示:

REGISTER 'pigtest.py' using jython as myfuncs;

我尝试如下在我的 Python 脚本中设置 Happybase 路径,但这并没有什么不同:

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages/happybase')
import happybase

我还尝试将“/usr/local/lib/python2.7/dist-packages/happybase”添加到 .bashrc 文件中的 JYTHON_PATH(我在 Ubuntu 上)但同样的错误出现了。

在我看来,我需要在某个地方设置 Happybase 路径,但我不知道在哪里。

【问题讨论】:

  • 注册UDF时,我相信它查看的路径是HDFS。因此,如果happybase 在您的本地文件系统上,它将无法按照您设置的方式工作。这也解释了为什么 pigtest.py 可以自己工作——将它移到另一台没有happybase 的机器上,它就无法再次工作了
  • 我明白了,那么有没有办法让 Happybase 在这种情况下工作?此外,我的“pigtest.py”位于本地文件系统(与 Pig 脚本相同的文件夹)上,而不是在 HDFS 中,但它确实找到了它,或者有什么不同?
  • 既然你这样做了REGISTER 'pigtest.py',它将在本地查找文件,但在后台将其上传到 HDFS。您可以将pigtest.py 隐式放在HDFS 上,然后执行REGISTER 'hdfs:///tmp/pigtest.py' 之类的操作。至于 Happybase 问题,我必须进一步研究,因为我之前没有使用过 Python UDF。
  • 我发现如果我尝试从 Jython(在 PIG 之外)导入 happybase,我会遇到同样的错误。我认为必须有一个环境变量或我需要指定 Happybase 文件路径的东西。知道在使用 Jython 时需要做什么来导入模块吗?我安装了 Jython 2.5.3。
  • 不确定,从未真正使用过 Jython。您在 python 上使用 Jython 有什么特别的原因吗?

标签: python hbase apache-pig jython happybase


【解决方案1】:

我能够在 Jython 用户邮件列表的帮助下解决这个问题。您需要通过执行以下操作之一来指定 Happybase 文件夹的父目录,而不是像我一样指定 Happybase 目录本身的路径:

将位置附加到 Python 脚本中的 sys.path:

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages')
import happybase

将位置作为环境变量添加到 JYTHONPATH(不是 JYTHON_PATH!):

export JYTHONPATH = $JYTHONPATH:/usr/local/lib/python2.7/dist-packages

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多