0

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

所以让我们从我正在做的事情开始。我正在使用 Windows,我正在尝试启动本地 thrift 服务器并通过直线连接到我在 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://nnnn:7077。在本地主机: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 应用程序正在运行,我什至可以通过直线连接到它!

::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 创建应用程序,则会收到 ERROR XSDB6: Another instance of Derby running。

我在这里想要实现的只是能够通过 Windows 中的直线来查看和查询我的表格作为练习。非常感谢那个泡菜罐的帮助。

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

4

1 回答 1

2

我在 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 服务器。有了它,我可以轻松地连接到我的所有表并使用直线或其他 odbc 连接器访问数据。

于 2019-01-16T18:32:46.700 回答