【发布时间】:2019-06-08 19:56:04
【问题描述】:
我无法配置 Spark SQL,以便我可以访问 Spark Thrift Server 中的 Hive 表(不使用 JDBC,但本地来自 Spark)
我对 Spark Thrift Server 和 Spark SQL 都使用单个配置文件 conf/hive-site.xml。我将javax.jdo.option.ConnectionURL 属性设置为jdbc:derby:;databaseName=/home/user/spark-2.4.0-bin-hadoop2.7/metastore_db;create=true。我还将spark.sql.warehouse.dir 属性设置为指向spark-warehouse 目录的绝对路径。我用./start-thriftserver.sh 运行Thrift 服务器,我可以观察到嵌入式Derby 数据库是用metastore_db 目录创建的。我可以与beeline 连接,创建一个表并查看使用表的子目录创建的spark-warehouse 目录。所以现阶段还好。
我启动启用了 Hive 支持的 pyspark shell ./bin/pyspark --conf spark.sql.catalogImplementation=hive,并尝试使用以下命令访问 Hive 表:
from pyspark.sql import HiveContext
hc = HiveContext(sc)
hc.sql('show tables')
我收到如下错误:
ERROR XJ040: 启动数据库失败 '/home/user/spark-2.4.0-bin-hadoop2.7/metastore_db' 与类加载器 sun.misc.Launcher$AppClassLoader@1b4fb997
错误 XSDB6:另一个 Derby 实例可能已经启动了 数据库 /home/user/spark-2.4.0-bin-hadoop2.7/metastore_db
pyspark.sql.utils.AnalysisException: u'java.lang.RuntimeException: java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;
显然 Spark 正在尝试创建新的 Derby 数据库,而不是使用我放在配置文件中的 Metastore。如果我停止 Thrift Server 并只运行 spark,一切都很好。我该如何解决?
嵌入式 Derby Metastore 数据库是否可以让 Thrift Server 和 Spark 访问一个 Hive,或者我需要使用例如MySQL?我没有集群,一切都在本地完成。
【问题讨论】:
标签: apache-spark hive pyspark spark-thriftserver