2016-12-21 5 views
1

ハイブテーブルにアクセスするCloud 4.2 EnterpriseのBigInsightsでpysparkスクリプトを実行しようとしています。スパークハイブの報告pyspark.sql.utils.AnalysisException:糸のクラスタで実行したときに 'テーブルが見つかりません:XXX'

まず、私はハイブのテーブルを作成します。

[[email protected] ~]$ hive 
hive> CREATE TABLE pokes (foo INT, bar STRING); 
OK 
Time taken: 2.147 seconds 
hive> LOAD DATA LOCAL INPATH '/usr/iop/4.2.0.0/hive/doc/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes; 
Loading data to table default.pokes 
Table default.pokes stats: [numFiles=1, numRows=0, totalSize=5812, rawDataSize=0] 
OK 
Time taken: 0.49 seconds 
hive> 

それから私は、単純なpysparkスクリプトを作成します。

[[email protected] ~]$ cat test_pokes.py 
from pyspark import SparkContext 

sc = SparkContext() 

from pyspark.sql import HiveContext 
hc = HiveContext(sc) 

pokesRdd = hc.sql('select * from pokes') 
print(pokesRdd.collect()) 

私が実行しようとする:

[[email protected] ~]$ spark-submit \ 
    --master yarn-cluster \ 
    --deploy-mode cluster \ 
    --jars /usr/iop/4.2.0.0/hive/lib/datanucleus-api-jdo-3.2.6.jar, \ 
      /usr/iop/4.2.0.0/hive/lib/datanucleus-core-3.2.10.jar, \ 
      /usr/iop/4.2.0.0/hive/lib/datanucleus-rdbms-3.2.9.jar \ 
    test_pokes.py 

しかし、私が遭遇エラー:

Traceback (most recent call last): 
    File "test_pokes.py", line 8, in <module> 
    pokesRdd = hc.sql('select * from pokes') 
    File "/disk6/local/usercache/biadmin/appcache/application_1477084339086_0481/container_e09_1477084339086_0481_01_000001/pyspark.zip/pyspark/sql/context.py", line 580, in sql 
    File "/disk6/local/usercache/biadmin/appcache/application_1477084339086_0481/container_e09_1477084339086_0481_01_000001/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__ 
    File "/disk6/local/usercache/biadmin/appcache/application_1477084339086_0481/container_e09_1477084339086_0481_01_000001/pyspark.zip/pyspark/sql/utils.py", line 51, in deco 
pyspark.sql.utils.AnalysisException: u'Table not found: pokes; line 1 pos 14' 
End of LogType:stdout 

私は火花提出スタンドアロンで実行した場合、私はテーブルがOK存在を確認できます。この質問は、この他の質問に似てhive spark yarn-cluster job fails with: "ClassNotFoundException: org.datanucleus.api.jdo.JDOPersistenceManagerFactory"

[[email protected] ~]$ spark-submit test_pokes.py 
… 
… 
16/12/21 13:09:13 INFO Executor: Finished task 0.0 in stage 0.0 (TID 0). 18962 bytes result sent to driver 
16/12/21 13:09:13 INFO TaskSetManager: Finished task 0.0 in stage 0.0 (TID 0) in 168 ms on localhost (1/1) 
16/12/21 13:09:13 INFO TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool 
16/12/21 13:09:13 INFO DAGScheduler: ResultStage 0 (collect at /home/biadmin/test_pokes.py:9) finished in 0.179 s 
16/12/21 13:09:13 INFO DAGScheduler: Job 0 finished: collect at /home/biadmin/test_pokes.py:9, took 0.236558 s 
[Row(foo=238, bar=u'val_238'), Row(foo=86, bar=u'val_86'), Row(foo=311, bar=u'val_311') 
… 
… 

は、この問題に関連し、私の前の質問を参照してください。 Spark can access Hive table from pyspark but not from spark-submit。しかし、その質問とは異なり、私はHiveContextを使用しています。


更新:スパーク提出ジョブがhive-site.xmlを見つけることができないので、それはハイブメタストアに接続できないので、これは最終的な解決のためにここにhttps://stackoverflow.com/a/41272260/1033422

答えて

4

を参照してください。 spark-submitコマンドに--files /usr/iop/4.2.0.0/hive/conf/hive-site.xmlを追加してください。

+0

スタンドアロンモードで動作する理由はそれほど説明できません –

+0

これは私をさらに進歩させます。 'MetaException(メッセージ:com.ibm.biginsights.bigsql.sync.BIEventListenerという名前のリスナーのインスタンス化に失敗しました。理由:java.lang.ClassNotFoundException:com.ibm.biginsights.bigsql.sync.BIEventListener)' –

+0

申し訳ありませんが、私は説明する必要があります。スタンドアローンを実行すると、ドライバはマシン自体で実行されます。したがって、ローカルクラスパスから 'hive-site.xml'を取得します。 'cluster-mode'を実行すると、このxmlファイルはクラスタ上のコンテナに転送されないため、手動で指定する必要があります.Sparkはそれをクラスパスに入れます。 –

2

このバグの影響を受けているようです:https://issues.apache.org/jira/browse/SPARK-15345



私はHDP-2.5.0.0にスパーク1.6.2と2.0.0と同様の問題を持っていた:私の目標は、これらの条件下で、ハイブSQLクエリからのデータフレームを作成することでした

  • PythonのAPI、
  • クラスタ展開モード(ドライバプログラムは、エグゼキュータ・ノードの一つで実行されている)エグゼキュータのJVMを管理する
  • 使用糸(の代わりにスタンドアロンのSparkマスターインスタンス)。

    1. spark-submit --deploy-mode client --master local ... =>
    2. spark-submit --deploy-mode cluster --master yarn ...作業
    3. spark-submit --deploy-mode client --master yarn ... =>WORKING:

初期の試験は、これらの結果を与えました。=>ケース#3では

が動作していない、エグゼキュータ・ノードのいずれかで実行されているドライバは、データベースを見つけることができます。エラー:上記

pyspark.sql.utils.AnalysisException: 'Table or view not found: `database_name`.`table_name`; line 1 pos 14' 



Fokko Driesprongの答えは私のために働きました。
で、下記のコマンド、実行者のノード上で実行されているドライバがdefaultないデータベースにハイブテーブルにアクセスすることができたが:

$ /usr/hdp/current/spark2-client/bin/spark-submit \ 
--deploy-mode cluster --master yarn \ 
--files /usr/hdp/current/spark2-client/conf/hive-site.xml \ 
/path/to/python/code.py 



私が使用しているPythonコードスパーク1.6.2でテストおよび2.0.0をスパークすることがある:(。スパーク1.6.2でテストするための1に変更しSPARK_VERSION応じて火花-submitコマンドでパスを更新することを確認してください)

SPARK_VERSION=2  
APP_NAME = 'spark-sql-python-test_SV,' + str(SPARK_VERSION) 



def spark1(): 
    from pyspark.sql import HiveContext 
    from pyspark import SparkContext, SparkConf 

    conf = SparkConf().setAppName(APP_NAME) 
    sc = SparkContext(conf=conf) 
    hc = HiveContext(sc) 

    query = 'select * from database_name.table_name limit 5' 
    df = hc.sql(query) 
    printout(df) 




def spark2(): 
    from pyspark.sql import SparkSession 
    spark = SparkSession.builder.appName(APP_NAME).enableHiveSupport().getOrCreate() 
    query = 'select * from database_name.table_name limit 5' 
    df = spark.sql(query) 
    printout(df) 




def printout(df): 
    print('\n########################################################################') 
    df.show() 
    print(df.count()) 

    df_list = df.collect() 
    print(df_list) 
    print(df_list[0]) 
    print(df_list[1]) 
    print('########################################################################\n') 




def main(): 
    if SPARK_VERSION == 1: 
     spark1() 
    elif SPARK_VERSION == 2: 
     spark2() 




if __name__ == '__main__': 
    main() 
関連する問題