次の 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.
更新 ハイブのインポートが実行される方法を分析するのに、より多くの時間を費やしました。それらは、内部で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でも同様に守られています
このJavaクラス/クラスパスの問題を追跡するために他に何を調べるべきか途方に暮れています。