Spark Hive 报告 pyspark.sql.utils.AnalysisException: u'Table not found: XXX' when 运行 on yarn cluster
Spark Hive reporting pyspark.sql.utils.AnalysisException: u'Table not found: XXX' when run on yarn cluster
我正在尝试 运行 BigInsights on Cloud 4.2 Enterprise 上访问 Hive table 的 pyspark 脚本 table。
首先我创建配置单元 table:
[biadmin@bi4c-xxxxx-mastermanager ~]$ 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 脚本:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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() )
我尝试执行:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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
如果我 运行 spark-submit standalone,我可以看到 table 存在 ok:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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')
…
…
请参阅我之前与此问题相关的问题:
这个问题与另一个问题类似:。但是,与那个问题不同,我使用的是 HiveContext。
更新:最终解决方案请看这里
这是因为 spark-submit 作业无法找到 hive-site.xml
,因此无法连接到 Hive 元存储。请将 --files /usr/iop/4.2.0.0/hive/conf/hive-site.xml
添加到您的 spark-submit 命令中。
您似乎受到此错误的影响: https://issues.apache.org/jira/browse/SPARK-15345.
我在 HDP-2.5.0.0 上的 Spark 1.6.2 和 2.0.0 遇到了类似的问题:
我的目标是在这些条件下从 Hive SQL 查询创建数据框:
- python API,
- 集群部署模式(驱动程序 运行 在其中一个执行节点上)
- 使用 YARN 来管理执行器 JVM(而不是独立的 Spark 主实例)。
初步测试给出了这些结果:
spark-submit --deploy-mode client --master local ...
=>
正在工作
spark-submit --deploy-mode client --master yarn ...
=> 正在工作
spark-submit --deploy-mode cluster --master yarn ...
。 => 不工作
在案例 #3 中,其中一个执行程序节点上的驱动程序 运行 可以找到数据库。错误是:
pyspark.sql.utils.AnalysisException: 'Table or view not found: `database_name`.`table_name`; line 1 pos 14'
上面列出的 Fokko Driesprong 的回答对我有用。
使用下面列出的命令,执行程序节点上的驱动程序 运行 能够访问不是 default
:
的数据库中的 Hive table
$ /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
我用来测试 Spark 1.6.2 和 Spark 2.0.0 的 python 代码是:
(将 SPARK_VERSION 更改为 1 以使用 Spark 1.6.2 进行测试。确保相应地更新 spark-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()
对我来说,接受的答案没有用。
(--文件 /usr/iop/4.2.0.0/hive/conf/hive-site.xml)
在代码文件顶部添加以下代码解决了问题。
import findspark
findspark.init('/usr/share/spark-2.4') # for 2.4
我正在尝试 运行 BigInsights on Cloud 4.2 Enterprise 上访问 Hive table 的 pyspark 脚本 table。
首先我创建配置单元 table:
[biadmin@bi4c-xxxxx-mastermanager ~]$ 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 脚本:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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() )
我尝试执行:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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
如果我 运行 spark-submit standalone,我可以看到 table 存在 ok:
[biadmin@bi4c-xxxxxx-mastermanager ~]$ 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-submit 作业无法找到 hive-site.xml
,因此无法连接到 Hive 元存储。请将 --files /usr/iop/4.2.0.0/hive/conf/hive-site.xml
添加到您的 spark-submit 命令中。
您似乎受到此错误的影响: https://issues.apache.org/jira/browse/SPARK-15345.
我在 HDP-2.5.0.0 上的 Spark 1.6.2 和 2.0.0 遇到了类似的问题:
我的目标是在这些条件下从 Hive SQL 查询创建数据框:
- python API,
- 集群部署模式(驱动程序 运行 在其中一个执行节点上)
- 使用 YARN 来管理执行器 JVM(而不是独立的 Spark 主实例)。
初步测试给出了这些结果:
spark-submit --deploy-mode client --master local ...
=> 正在工作spark-submit --deploy-mode client --master yarn ...
=> 正在工作spark-submit --deploy-mode cluster --master yarn ...
。 => 不工作
在案例 #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
我用来测试 Spark 1.6.2 和 Spark 2.0.0 的 python 代码是:
(将 SPARK_VERSION 更改为 1 以使用 Spark 1.6.2 进行测试。确保相应地更新 spark-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()
对我来说,接受的答案没有用。
(--文件 /usr/iop/4.2.0.0/hive/conf/hive-site.xml)
在代码文件顶部添加以下代码解决了问题。
import findspark
findspark.init('/usr/share/spark-2.4') # for 2.4