【问题标题】:Pyspark: remote Hive warehouse locationPyspark:远程 Hive 仓库位置
【发布时间】:2018-02-13 13:55:18
【问题描述】:

我需要从 Pyspark 读取/写入存储在远程 Hive 服务器中的表。关于这个远程 Hive,我只知道它在 Docker 下运行。从 Hadoop Hue 中,我找到了一个 iris 表的两个 URL,我尝试从中选择一些数据:

我有一个表元存储网址:

http://xxx.yyy.net:8888/metastore/table/mytest/iris

和表位置网址:

hdfs://quickstart.cloudera:8020/user/hive/warehouse/mytest.db/iris

我不知道为什么最后一个 url 包含quickstart.cloudera:8020。也许这是因为 Hive 在 Docker 下运行?

讨论对 Hive 表的访问 Pyspark 教程写道:

https://spark.apache.org/docs/latest/sql-programming-guide.html#hive-tables

使用 Hive 时,必须使用 Hive 支持实例化 SparkSession,包括与持久 Hive 元存储的连接、对 Hive serdes 的支持以及 Hive 用户定义的函数。没有现有 Hive 部署的用户仍然可以启用 Hive 支持。 hive-site.xml未配置时,上下文自动在当前目录创建metastore_db,并创建spark.sql.warehouse.dir配置的目录,默认为Spark应用当前目录下的spark-warehouse目录已启动。请注意,hive-site.xml 中的 hive.metastore.warehouse.dir 属性自 Spark 2.0.0 以来已弃用。相反,使用 spark.sql.warehouse.dir 指定仓库中数据库的默认位置。您可能需要向启动 Spark 应用程序的用户授予写入权限。

就我而言,我设法获得的hive-site.xml 既没有hive.metastore.warehouse.dir 也没有spark.sql.warehouse.dir 属性。

Spark 教程建议使用以下代码访问远程 Hive 表:

from os.path import expanduser, join, abspath

from pyspark.sql import SparkSession
from pyspark.sql import Row

   // warehouseLocation points to the default location for managed databases and tables
val warehouseLocation = new File("spark-warehouse").getAbsolutePath

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL Hive integration example") \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .enableHiveSupport() \
    .getOrCreate()

在我的情况下,在运行类似于上面的代码之后,但 warehouseLocation 的值正确,我想我可以这样做:

spark.sql("use mytest")
spark.sql("SELECT * FROM iris").show()

那么我在哪里可以找到远程 Hive 仓库位置?如何使 Pyspark 与远程 Hive 表一起工作?

更新

hive-site.xml 具有以下属性:

...
...
...
 <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://127.0.0.1/metastore?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
...
...
...
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://127.0.0.1:9083</value>
    <description>IP address (or fully-qualified domain name) and port of the metastore host</description>
  </property>

所以看起来 127.0.0.1 是运行 Clouder docker 应用程序的 Docker 本地主机。根本无助于前往 Hive 仓库。

Cloudera Hive 作为 Docker 应用运行时如何访问 Hive 仓库?

【问题讨论】:

  • 嗨,这个问题你得到答案了吗

标签: hadoop docker hive pyspark hadoop2


【解决方案1】:

这里https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hive_metastore_configure.html在“远程模式”你会发现你Hive metastore运行自己的JVM进程,其他进程如HiveServer2, HCatalog, Cloudera Impala通过Thrift API使用属性hive.metastore.uri与它通信hive-site.xml:

<property>
  <name>hive.metastore.uris</name>
  <value>thrift://xxx.yyy.net:8888</value>
</property>

(不确定您必须指定地址的方式)

也许还有这个属性:

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://xxx.yyy.net/hive</value>
</property>

【讨论】:

  • Pyspark 文档(请参阅我的问题中的引文)谈到需要指定 warehouse 位置。和 hive metastore 一样吗?请查看我的问题的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2018-12-05
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多