如何修复 Jython 和 HBase 中的"ImportError: No module name apache"错误



我正在尝试运行以下jython代码来扫描HBase表:

    import java.lang
    from org.apache.hadoop.hbase import TableName, HBaseConfiguration
    from org.apache.hadoop.hbase.client import Connection, ConnectionFactory,         
    Result, ResultScanner, Table, Admin
    from org.apache.hadoop.conf import Configuration
    conf = HBaseConfiguration.create()
    connection = ConnectionFactory.createConnection(conf)
    admin = connection.getAdmin()
    tableName = TableName.valueOf('station')
    table = connection.getTable(tableName)
    cf = "stn"
    attr = "name"
    scanner = table.getScanner(cf)
    while 1:
         result = scanner.next()
         if not result:
            break
         print java.lang.String(result.row),   
         java.lang.String(result.getValue(cf, attr))

我正在使用以下命令尝试运行它:

jython test1.py

但是我会收到以下错误:

Traceback (most recent call last):
  File "test1.py", line 2, in <module>
    from org.apache.hadoop.hbase import TableName, HBaseConfiguration
ImportError: No module named apache

如何解决这个问题?我已经在独立模式下安装了HBase,并且工作正常(使用HBase Shell创建了一些样品表)。

更新:正如评论中建议的那样,我尝试了以下命令来运行它:

jython -dpython.path =。/hbase-1.4.8/lib/hbase-common-1.4.8.jar test1.py

我现在收到以下错误消息:

trackback(最近的最新呼叫):文件" test1.py",第2行 来自org.apache.hadoop.hbase导入tablename,hbaseconfiguration java.lang.noclassdeffounderror:org/apache/hadoop/io/awarcomparator at rog.apache.hadoop.hbase.namespacedescriptor。 atrg.apache.hadoop.hbase.tablename。(tableName.java:82) 在java.lang.class.forname0(本机方法) 在java.lang.class.forname(class.java:348) atrg.python.core.py.py.polanitclass(py.java:991) 在org.python.core.py.findclassinternal(py.java:926) 在org.python.core.py.findclassex(py.java:977) atrg.python.core.packagecache.syspackagemanager.findclass(syspackagemanager.java:133) atorg.python.core.core.packagecache.packagemanager.findclass(packagemanager.java:33) atrg.python.core.packagecache.syspackagemanager.findclass(syspackagemanager.java:122) atorg.python.core.pyjavapackage. findattr_ex (pyjavapackage.java:134) atorg.python.core.pyobject。 findattr (pyobject.java:946) 在org.python.core.imp.importfromas(imp.java:1160) 在org.python.core.imp.importfrom(imp.java:1132) atorg.python.pycode._pyx0.f $ 0(test1.py:13) atorg.python.pycode._pyx0.call_function(test1.py) atrg.python.core.pytablecode.call(pytablecode.java:167) atrg.python.core.pycode.call(pycode.java:18) 在org.python.core.py.runcode(py.java:1386) atrg.python.util.pythoninterpreter.execfile(pythoninterpreter.java:296) 在org.python.util.jython.run(jython.java:362) atorg.python.util.jython.main(jython.java:142)造成: atrg.python.core.syspathjavaloader.findclass(syspathjavaloader.java:131) 在java.lang.classloader.loadclass(classloader.java:424) 在java.lang.classloader.loadclass(classloader.java:357) ... 22多

java.lang.noclassdeffounderror:java.lang.noclassdeffounderror: org/apache/hadoop/io/rawcomparator

如何解决此问题?

似乎库中的库中缺少了库。默认情况下,jython.jar仅包含lib目录中存在的默认Python Mobules。任何第三方模块都需要在类路径中添加。

您需要在库模块中添加HBase Jar的引用如下:

jython -Dpython.path=/<location of jar>/hbase.jar test1.py

另一个选择是:

java -cp /<location of jar>/hbase.jar;jython.jar org.python.util.jython test1.py

jython classpath应该包括HBase classpath以包括所有依赖关系。

有关更多详细信息,请参考:https://hbase.apache.org/book.html#jython

最新更新