在 Python 中以编程方式启动 HiveThriftServer
Posted
技术标签:
【中文标题】在 Python 中以编程方式启动 HiveThriftServer【英文标题】:Start HiveThriftServer programmatically in Python 【发布时间】:2016-04-14 16:32:02 【问题描述】:在 spark-shell (scala) 中,我们导入, org.apache.spark.sql.hive.thriftserver._ 用于以编程方式为特定 hive 上下文启动 Hive Thrift 服务器 HiveThriftServer2.startWithContext(hiveContext) 为该特定会话公开已注册的临时表。
我们如何使用 python 做同样的事情? python 上是否有用于导入 HiveThriftServer 的包/api?任何其他想法/建议表示赞赏。
我们使用 pyspark 来创建数据框
谢谢
拉维·纳拉亚南
【问题讨论】:
为什么你需要一个 Thrift 服务器,因为它是一个临时表?你不能创建自己的 Hivecontext 来连接到本地临时创建的元存储吗? 顺便说一句,你为什么需要从你的代码开始呢? 如果我们将 thrift 服务器作为守护进程启动,我们将无法查看临时表(会话与我们启动 HiveContext 的会话不同,临时表将可用于特定会话) 您正在启动 Metastore 服务吗?如果不是,我并不感到惊讶,因为当你运行 Spark Thrift 服务器时,它会创建它的 Metastore 后端。在您的代码中,您还创建了另一个 Metastore 后端,这两个 Metastore 是独立的。 你知道怎么做吗? 【参考方案1】:您可以使用 py4j java gateway 导入它。以下代码适用于spark 2.0.2,可以通过beeline查询python脚本中注册的临时表。
from py4j.java_gateway import java_import
java_import(sc._gateway.jvm,"")
spark = SparkSession \
.builder \
.appName(app_name) \
.master(master)\
.enableHiveSupport()\
.config('spark.sql.hive.thriftServer.singleSession', True)\
.getOrCreate()
sc=spark.sparkContext
sc.setLogLevel('INFO')
#Start the Thrift Server using the jvm and passing the same spark session corresponding to pyspark session in the jvm side.
sc._gateway.jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.startWithContext(spark._jwrapped)
spark.sql('CREATE TABLE myTable')
data_file="path to csv file with data"
dataframe = spark.read.option("header","true").csv(data_file).cache()
dataframe.createOrReplaceTempView("myTempView")
然后去直线检查它是否正确启动:
in terminal> $SPARK_HOME/bin/beeline
beeline> !connect jdbc:hive2://localhost:10000
beeline> show tables;
它应该显示在 python 中创建的表和临时表/视图,包括上面的“myTable”和“myTempView”。必须有相同的 spark 会话才能看到临时视图
(参见答案:Avoid starting HiveThriftServer2 with created context programmatically。 注意:即使 Thrift 服务器从终端启动并连接到同一个元存储,也可以访问配置单元表,但是无法访问临时视图,因为它们在 spark 会话中并且未写入元存储)
【讨论】:
以上是关于在 Python 中以编程方式启动 HiveThriftServer的主要内容,如果未能解决你的问题,请参考以下文章