Python 如何在Thrift服务器上查看pyspark临时表?
我正在尝试通过节俭创建一个临时表。我的最终目标是能够使用JDBC从数据库客户端(如DBeaver)访问它 我先用直线测试 这就是我正在做的Python 如何在Thrift服务器上查看pyspark临时表?,python,apache-spark,pyspark,thrift,spark-thriftserver,Python,Apache Spark,Pyspark,Thrift,Spark Thriftserver,我正在尝试通过节俭创建一个临时表。我的最终目标是能够使用JDBC从数据库客户端(如DBeaver)访问它 我先用直线测试 这就是我正在做的 使用docker在我自己的机器上用一个工作进程启动集群,并在spark defaults.conf 启动Pyspark shell(为了测试),并运行以下代码: 从pyspark.sql导入行 l=[('Ankit',25),('Jalfaizy',22),('saurabh',20),('Bala',26)] rdd=sc.并行化(l) people=rd
spark defaults.conf
从pyspark.sql导入行
l=[('Ankit',25),('Jalfaizy',22),('saurabh',20),('Bala',26)]
rdd=sc.并行化(l)
people=rdd.map(lambda x:Row(name=x[0],age=int(x[1]))
people=people.toDF().cache()
peebs=people.createOrReplaceTempView('peebs'))
result=sqlContext.sql('select*from peebs')
到目前为止一切正常/sbin/start-thriftserver.sh--hiveconf-hive.server2.thrift.port=10001--conf-spark.executor.cores=1--masterspark://172.18.0.2:7077
服务器似乎正常启动,我可以看到pyspark和thrift服务器作业在我的spark群集主UI上运行/bin/beeline
直线>!连接jdbc:hive2://172.18.0.2:10001
这就是我得到的
连接到jdbc:hive2://172.18.0.2:10001
输入jdbc的用户名:hive2://172.18.0.2:10001:
输入jdbc的密码:hive2://172.18.0.2:10001:
2019-06-29 20:14:25信息用途:310-提供的机构:172.18.0.2:10001
2019-06-29 20:14:25信息用途:397-已解决权限:172.18.0.2:10001
2019-06-29 20:14:25信息HiveConnection:203-将尝试使用JDBC Uri打开客户端传输:JDBC:hive2://172.18.0.2:10001
连接到:Spark SQL(版本2.3.3)
驱动程序:Hive JDBC(版本1.2.1.spark2)
事务隔离:事务可重复读取 看起来还可以
显示表格时代码>我什么都看不见
ssh:无法解析主机名spark:名称或服务未知
rsync:连接意外关闭(到目前为止接收到0字节)[接收器]
rsync错误:io.c(235)[接收器=3.1.2]处的无法解释的错误(代码255)
启动org.apache.spark.sql.hive.thriftserver.HiveThriftServer2,登录到
谢谢
createOrReplaceTempView
创建内存中的表。Spark thrift服务器需要在创建内存表的同一驱动程序JVM上启动。在上面的示例中,创建表的驱动程序与运行STS(Spark Thrift server)的驱动程序不同。
两个选项
1.在启动STS的同一JVM中使用
createOrReplaceTempView
创建表。2.使用后备元存储,并使用
org.apache.spark.sql.DataFrameWriter#saveAsTable
创建表,这样就可以独立于JVM访问表(实际上没有任何spark驱动程序)
关于错误:1.与客户端和服务器元存储版本相关。
2.似乎有些rsync脚本试图解码
spark:\\\
url两者似乎都与这个问题无关。在做了几次测试后,我终于想出了一个简单的(无身份验证)代码,它适合我 需要注意的是,如果希望通过JDBC提供临时表,则需要在相同的JVM(相同的spark作业)中启动thrift server,并确保代码挂起,以便应用程序在集群中保持运行 下面是我创建的供参考的工作示例代码:
import time
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from py4j.java_gateway import java_import
spark = SparkSession \
.builder \
.appName('the_test') \
.enableHiveSupport()\
.config('spark.sql.hive.thriftServer.singleSession', True)\
.config('hive.server2.thrift.port', '10001') \
.getOrCreate()
sc=spark.sparkContext
sc.setLogLevel('INFO')
java_import(sc._gateway.jvm, "")
from pyspark.sql import Row
l = [('John', 20), ('Heather', 34), ('Sam', 23), ('Danny', 36)]
rdd = sc.parallelize(l)
people = rdd.map(lambda x: Row(name=x[0], age=int(x[1])))
people = people.toDF().cache()
peebs = people.createOrReplaceTempView('peebs')
sc._gateway.jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.startWithContext(spark._jwrapped)
while True:
time.sleep(10)
我只是在spark submit中使用了上面的.py,通过beeline和使用Hive JDBC驱动程序的DBeaver,我可以通过JDBC进行连接。如果有人需要在spark Streaming中执行此操作,我可以让它这样工作
from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from py4j.java_gateway import java_import
spark = SparkSession \
.builder \
.appName('restlogs_qlik') \
.enableHiveSupport()\
.config('spark.sql.hive.thriftServer.singleSession', True)\
.config('hive.server2.thrift.port', '10001') \
.getOrCreate()
sc=spark.sparkContext
sc.setLogLevel('INFO')
#Order matters!
java_import(sc._gateway.jvm, "")
sc._gateway.jvm.org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.startWithContext(spark._jwrapped)
#Define schema of json
schema = StructType().add("partnerid", "string").add("sessionid", "string").add("functionname", "string").add("functionreturnstatus", "string")
#load data into spark-structured streaming
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("subscribe", "rest_logs") \
.load() \
.select(from_json(col("value").cast("string"), schema).alias("parsed_value"))
#Print output
query = df.writeStream \
.outputMode("append") \
.format("memory") \
.queryName("view_figures") \
.start()
query.awaitTermination();
在你启动它之后,你可以用beehive测试JDBC。我不能理解的是,我必须用同一个脚本启动Thrift服务器。这就是如何启动脚本
spark-submit --master local[2] \
--conf "spark.driver.extraClassPath=D:\\Libraries\\m2_repository\\org\\apache\\kafka\\kafka-clients\\2.0.0\\kafka-clients-2.0.0.jar" \
--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.1 \
"C:\\Temp\\spark_kafka.py"
希望这对某人有所帮助。顺便问一下,我正处于初步研究阶段,所以不要评判我。关于#1,有没有一种方法可以在同一个JVM中创建视图,而不必在代码末尾启动STS?我的意思是,有没有一种方法可以创建视图,并且仍然使用start-thriftserver.sh启动STS?您有一些示例代码吗?关于#2问题是,我想在通过JDBC公开数据之前对数据进行一些转换,但我不想再生成或处理一个表。@BrunoFaria,你可以使用
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2#start
。在驱动程序代码中,创建临时表,并在驱动程序代码的最后一行启动STS。另外需要正确设置thrift属性(检查前缀为hive.server2
的属性)