如何使pyspark数据库对Windows上的直线可见?

时间:2019-01-11 01:07:05

标签: jdbc pyspark jupyter-notebook beeline spark-thriftserver

大家好,我需要一些帮助才能在pyspark中打开一个酱菜罐。我正在学习pyspark,作为一种练习,我正在尝试做一些我认为很简单的事情……但这给我带来了很大的困难。

所以让我们从我正在做的事情开始。我正在使用Windows,并且正在尝试启动本地节俭服务器并通过beeline连接到在Spark会话中在应用程序中创建的数据库。

::step1 - start master in cmd
start %SPARK_HOME%\bin\spark-class.cmd org.apache.spark.deploy.master.Master

步骤1很好用,我可以看到使用我的spark 2.3.2创建的主服务器spark://n.n.n.n:7077。在localhost:8080中。

::step2 - start worker in cmd
start %SPARK_HOME%\bin\spark-class.cmd org.apache.spark.deploy.worker.Worker spark://n.n.n.n:7077

到目前为止很好,我可以看到我有一个正在运行8个内核的工作线程。

::step3 - start thrift server
start %SPARK_HOME%\bin\spark-submit.cmd --verbose --class org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 spark-internal --hiveconf hive.server2.thrift.port=10000 --master spark://n.n.n.n:7077 --total-executor-cores 4

步骤3好的,我可以看到SparkSQL应用程序正在运行,甚至可以通过beeline连接到它!

::if I do
start %SPARK_HOME%\bin\beeline.cmd

Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: username
Enter password for jdbc:hive2://localhost:10000: password

Connected to: Spark SQL (version 2.3.2)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> SHOW TABLES;
+-----------+------------+--------------+--+
| database  | tableName  | isTemporary  |
+-----------+------------+--------------+--+
+-----------+------------+--------------+--+

最后一步:创建我的应用程序并将其提供给我的Spark Master 。现在,我进入jupiter-notebook以以下方式运行我的应用程序:

spark=SparkSession.builder.appName("Publish a database attempt").master("spark://n.n.n.n:7077").config('spark.sql.warehouse.dir','file:///D:/tmp/SparkDatabase/').getOrCreate()
df1=spark.read.csv('C:/data.csv',inferSchema=True,header=True)
df1.coalesce(1).write.mode('overwrite').saveAsTable('testTable')

spark.sql('show tables in default').show()
+--------+-----------+-----------+
|database|  tableName|isTemporary|
+--------+-----------+-----------+
| default|  testTable|      false|
+--------+-----------+-----------+

spark.sql("SELECT * FROM testTable").show()
+--------+--------+--------+
| column1| column2| column3|
+--------+--------+--------+
|      hi|   there|  friend|
+--------+--------+--------+    

这是火花扑朔迷离的时候... 我可以在我的应用程序会话中看到此数据库,但它不会与直线显示。回到直线,再做一张SHOW TABLES;不要骗人。

评论:

  1. 我注意到,当我启动Thrift服务器时,它会创建一个metastore_db,而当我从jupiter笔记本中创建应用程序时不会发生这种情况。
  2. 如果我尝试从pyspark实例而不是jupyter-notebook创建应用程序,则会收到错误XSDB6:另一个运行的Derby实例。

我要在这里实现的目的只是为了能够通过Windows中的直线查看和查询我的表。非常感谢您使用该酱菜罐子的帮助。

使用: conda 4.5.12; Python 3.6.5; PySpark 2.3.2; hadoop-3.0.0

1 个答案:

答案 0 :(得分:0)

我在stackoverflow中发现了另一个问题,其中包含一种解决我的问题的方法,我可以考虑作为答案: Start HiveThriftServer programmatically in Python

基本上,我需要忘记步骤3,并在Jupyter-notebook中使用以下命令运行我的应用程序:

from pyspark import *
from pyspark.sql import *

spark = SparkSession.builder \
 .appName('Hi there') \
 .master('spark://n.n.n.n:7077') \
 .enableHiveSupport() \
 .config('spark.sql.hive.thriftServer.singleSession', True) \
 .getOrCreate()

#Start the Thrift Server using the jvm and passing the same spark session corresponding to pyspark session in the jvm side.
spark.sparkContext._gateway.jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.startWithContext(spark._jwrapped) 

df1=spark.read.csv('C:/data.csv',inferSchema=True,header=True)
df1.coalesce(1).write.mode('overwrite').saveAsTable('testTable')

这样,我将在当前会话中使用java启动Thrift Server。这样,我可以轻松地连接到我的所有表并使用beeline或其他odbc连接器访问数据。