Pyspark:远程Hive仓库位置

时间:2017-09-05 09:55:14

标签: hadoop docker hive pyspark hadoop2

我需要从Pyspark读取/写入存储在远程Hive Server中的表。我对这个远程Hive的了解就是它在Docker下运行。从Hadoop Hue我发现了iris表的两个网址,我试图从中选择一些数据:

我有一个表Metastore url:

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

和表位置网址:

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

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

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

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

  

使用Hive时,必须使用Hive支持实例化SparkSession,包括连接到持久性Hive Metastore,支持Hive serdes和Hive用户定义函数。没有现有Hive部署的用户仍可以启用Hive支持。当未由hive-site.xml配置时,上下文会自动在当前目录中创建metastore_db,并创建一个由spark.sql.warehouse.dir配置的目录,该目录默认为Spark应用程序当前目录中的目录spark-warehouse开始了。请注意,自Spark 2.0.0起,不推荐使用hive-site.xml中的hive.metastore.warehouse.dir属性。而是使用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 app的Docker localhost。根本无法进入Hive仓库。

当Cloudera Hive作为Docker应用程序运行时,如何访问Hive仓库。

1 个答案:

答案 0 :(得分:1)

在“远程模式”下https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hive_metastore_configure.html,您会发现HiveServer2, HCatalog, Cloudera Impala运行自己的JVM进程,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>

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

也许这个属性也是:

@ConfigurationProperties