【问题标题】:HiveMetaStore Error in Pyspark Shell but not in Jupyter NotebookPyspark Shell 中的 HiveMetaStore 错误,但在 Jupyter Notebook 中没有
【发布时间】:2019-05-12 22:48:22
【问题描述】:

当我尝试使用 pyspark 数据框或 sql 时,发生了一件奇怪的事情。虽然它在 ipython 笔记本或 python 控制台中工作,但在 pyspark shell 中运行它时出现“javax.jdo.JDOFatalInternalException:创建事务连接工厂时出错”错误。

简而言之,如果我在 iPython Notebook 或只是 python 终端中运行以下命令,一切正常:

import findspark
findspark.init("C:\Spark\spark-2.3.3-bin-hadoop2.7")

import pyspark # only run after findspark.init()
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()
spark.sql('''select 'spark' as hello ''').show()

当我通过键入“pyspark”打开 pyspark shell 时,我执行以下操作:(SparkSession 已初始化):

spark.sql('''select 'spark' as hello ''').show()

我被抛出了错误:

>>> spark.sql('''select 'spark' as hello ''').show()
2019-05-12 18:41:35 WARN  HiveMetaStore:622 - Retrying creating default database after error: Error creating transactional connection factory
javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
...
pyspark.sql.utils.AnalysisException: 'java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;'

这很奇怪,知道为什么它在一种环境中有效,而在另一种环境中无效吗?谢谢!

编辑: 更多错误:

java.sql.SQLException: Unable to open a test connection to the given database. JDBC url = jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true, username = root. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

【问题讨论】:

    标签: python hive pyspark pyspark-sql


    【解决方案1】:

    我让它工作了。因此,在启动 Spark 时,您有两个选项可用于“spark.sql.catalogImplementation”设置(配置单元或内存中)。我正在使用 Windows,并且在设置 Hive 以使用 pyspark 时遇到了麻烦。由于某种原因,运行 pyspark 的 jupyter 笔记本没有实现该设置(因此它正在工作)。但是,在运行交互式 pyspark 时,该设置使用默认值 spark.sql.catalogImplementation=hive 运行。如果您想避免 Hive 头痛,只需在运行时提供参数:

    pyspark --conf spark.sql.catalogImplementation=in-memory
    

    然后运行这一行来测试它是否有效:

    spark.sql('''select 'spark' as hello ''').show()
    

    如果运行,那么一切正常。

    如果您想将该设置设为默认值,只需转到您的 spark 目录并编辑文件 conf/spark-defaults.conf 并添加设置“spark.sql.catalogImplementation=in-memory”。它最初可能是一个 TEMPLATE 文件,因此请确保将其保存为 .conf 文件。在那之后,你启动 pyspark 的一切,你应该对 hive 没有任何问题。

    另一种检查方法是在 pyspark 会话开始时转到 UI 并检查环境页面 (http://localhost:4041/environment/)。在“Spark Properties”下,您可以看到 spark.sql.catalogImplementation 的值(我相信您也可以在交互式 shell 中检查该值)。

    同样,我只是在我的 Windows 机器上本地运行 pyspark,但现在,pyspark 以及数据帧支持可以与 jupyter notebook 和交互式 shell 无缝协作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多