如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionH

Posted

技术标签:

【中文标题】如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient【英文标题】:How to fix error on pyspark EMR Notebook - AnalysisException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 【发布时间】:2019-09-04 00:56:43 【问题描述】:

我正在尝试使用附加的 EMR 笔记本在公共数据集上使用 spark.sql() 或 sqlContext.sql() 方法运行 SQL 查询(这里 spark 是我们启动 EMR 笔记本时可用的 SparkSession 对象的变量)到安装了 Hadoop、Spark 和 Livy 的 EMR 集群。 但是在运行任何基本的 SQL 查询时,我都会遇到错误:

AnalysisException: u'java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;

我想使用 SQL 查询,所以我不想使用 Dataframe API 作为替代方案。

这个 spark EMR 集群没有安装单独的 Hive 组件,我不打算使用它。 我已尝试寻找导致此问题的各种原因,其中一个原因可能是 EMR 笔记本可能没有创建 metastore_db 的写入权限。但是,我无法证实这一点。 我试图在集群的日志文件中找到此错误,但找不到它,并且不确定哪个文件可能包含此错误,以便获取更多详细信息。

重现问题的步骤:

    使用控制台创建 AWS EMR 集群并使用快速启动视图,选择 spark 选项。它将包括基于 Hadoop 2.8.5 YARN 的 Spark 2.4.3 以及 Ganglia 3.7.2 和 Zeppelin 0.8.1。它可以只有 1 个主节点和 2 个核心节点,也可以只有 1 个主节点。

    从 EMR 页面中的 Notebooks 链接创建 EMR Notebook,将其附加到您刚刚创建的集群并打开它(默认情况下,选择的内核将是 pyspark,如笔记本右上角所示)。

    我使用的代码在公开的亚马逊评论数据集上运行 spark.sql 查询。 代码:
# Importing data from s3
input_bucket = 's3://amazon-reviews-pds'
input_path = '/parquet/product_category=Books/*.parquet'
df = spark.read.parquet(input_bucket + input_path)
# Register temporary view
df.createOrReplaceTempView("reviews")
sqlDF = sqlContext.sql("""SELECT product_id FROM reviews LIMIT 5""")

我希望从这个数据集中返回 5 个 product_id 但是我得到了错误:

u'java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;'
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/context.py", line 358, in sql
    return self.sparkSession.sql(sqlQuery)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/session.py", line 767, in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
AnalysisException: u'java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;'

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,但我意识到我的 EMR 集群上没有 Hive。

在启动另一个集群并确保选择了 Hive 后,它就可以工作了。

【讨论】:

如何在 emr 上使用 spark 启动 hive? @kmkhan 在创建集群时只需在控制台上选择 Hive。或者,如果您使用的是 aws cli,请将 Name=Hive 添加到您的应用程序列表中。【参考方案2】:

Notebook 应该在兼容 HIVE 版本的 EMR 集群上运行

【讨论】:

以上是关于如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionH的主要内容,如果未能解决你的问题,请参考以下文章

EMR pyspark notebook Spark 进度小部件不见了

Jupyter + EMR + Spark - 从本地机器上的 Jupyter notebook 连接到 EMR 集群

toPandas() 在 Jupyter iPython Notebook 上工作,但提交失败 - AWS EMR

如何将变量从 EMR 集群传递到 Jupyter Notebook %%local 实例?

如何使用 AWS Lambda 在 AWS EMR 上运行 PySpark

如何在 AWS EMR 中一起添加 2 个(pyspark、scala)步骤?