在错误的情况下追踪py4j中缺少的导入"尝试调用包"

时间:2014-12-12 03:40:45

标签: python py4j

给出以下python片段:

from pyspark.mydb.mydb import *
class HBaseTest:

  def __init__(self):
    from pyspark.context import SparkContext
    sc = SparkContext('local[4]', 'PythonTest')
    self._hbctx = MyDbSQLContext(sc)

感兴趣的行是最后一行:MyDbSQLContext是org.apache.spark.mydb包中的一个类。在pyspark.mydb.mydb.py文件中有一个python包装器

为了使py4j java网关知道导入,执行以下语句:

java_import(self._sc._gateway.jvm,'org.apache.spark.sql.mydb.*')
java_import(self._sc._gateway.jvm,'org.apache.hadoop.conf.Configuration')

然而,在原始片段的最后一行:

    self._hbctx = MyDbSQLContext(sc)

我们收到以下错误:

sc=org.apache.spark.SparkContext@4925069a conf=<py4j.java_gateway.JavaMember object at 0x10bdd5090>
Traceback (most recent call last):
  File "pyspark/hbase/hbase_tests.py", line 81, in <module>
    test._test()
  File "pyspark/hbase/hbase_tests.py", line 76, in _test
    self.create_test_tables()
  File "pyspark/hbase/hbase_tests.py", line 46, in create_test_tables
    self._ctx().sql(create_sql).toRdd().collect()
  File "/shared/pyjava/python/pyspark/sql.py", line 1620, in sql
    return SchemaRDD(self._ssql_ctx.sql(sqlQuery).toJavaSchemaRDD(), self)
  File "/shared/pyjava/python/pyspark/hbase/hbase.py", line 58, in _ssql_ctx
    self._scala_HBaseSQLContext = self._get_hbase_ctx()
  File "/shared/pyjava/python/pyspark/hbase/hbase.py", line 83, in _get_hbase_ctx
    return self._jvm.HBaseSQLContext(self._jsc.sc())
  File "/shared/pyjava/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 726, in __getattr__
py4j.protocol.Py4JError: Trying to call a package.

更新我花了更多时间分析为hive执行导入的方式。它们是通过内部调用 compute-classpath.sh 的spark-submit脚本添加的。我已经正确地将$ MYDB_HOME / lib / *添加到该脚本中的类路径中。 mydb jar文件在类路径中可用:

此外,正在打印java_imports - 这里他们确实显示了mydb导入:

java_imports: [u'org.apache.hadoop.conf.Configuration', u'org.apache.spark.SparkConf',
u'org.apache.spark.sql.hive.LocalHiveContext', u'org.apache.spark.sql.hive.TestHiveContext', 
u'org.apache.hadoop.mydb.client.Client', u'scala.Tuple2', u'org.apache.spark.sql.mydb.mydbSQLContext', 
u'org.apache.spark.sql.hive.HiveContext', u'java.lang', u'org.apache.hadoop.mydb', u'org.apache.hadoop.mydb.client', 
u'org.apache.hadoop.mydb.filter', u'org.apache.hadoop.mydb.util', u'org.apache.log4j', u'org.apache.spark.api.java', 
u'org.apache.spark.api.python', u'org.apache.spark.mllib.api.python', u'org.apache.spark.sql', u'org.apache.spark.sql.mydb']

目前尚不清楚这个问题的根源是什么。我们已经确认:

  • mydb类在路径中
  • mydb类正在由java_import
  • 导入
  • AFAICT mydb同样遵循导入和使用hive类所遵循的模式

    我不知道还有什么可以检查来跟踪这个java类/类路径问题。

0 个答案:

没有答案