Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Thrift服务器上查看pyspark临时表?_Python_Apache Spark_Pyspark_Thrift_Spark Thriftserver - Fatal编程技术网

Python 如何在Thrift服务器上查看pyspark临时表?

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

我正在尝试通过节俭创建一个临时表。我的最终目标是能够使用JDBC从数据库客户端(如DBeaver)访问它

我先用直线测试

这就是我正在做的

  • 使用docker在我自己的机器上用一个工作进程启动集群,并在
    spark defaults.conf
  • 启动Pyspark shell(为了测试),并运行以下代码:

    从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')

    到目前为止一切正常

  • 在不同的终端上,我初始化spark thrift服务器:
    /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)
    事务隔离:事务可重复读取

    看起来还可以

  • 当我列出
    显示表格时我什么都看不见

  • 我想强调的两件有趣的事情是:

  • 当我启动pyspark时,会收到这些警告

    警告ObjectStore:6666-在metastore中找不到版本信息。未启用hive.metastore.schema.verification,因此记录架构版本1.2.0

    警告ObjectStore:568-无法获取数据库默认值,返回NoSuchObjectException

    警告ObjectStore:568-无法获取数据库全局_temp,返回NoSuchObjectException

  • 当我启动thrift服务器时,我得到以下信息:

    rsync从spark://172.18.0.2:7077
    ssh:无法解析主机名spark:名称或服务未知
    rsync:连接意外关闭(到目前为止接收到0字节)[接收器]
    rsync错误:io.c(235)[接收器=3.1.2]处的无法解释的错误(代码255)
    启动org.apache.spark.sql.hive.thriftserver.HiveThriftServer2,登录到

  • 我已经看过好几篇文章和讨论。我看到有人说我们不能通过thrift公开临时表,除非您从同一代码中启动服务器。如果这是真的,我如何在python(pyspark)中实现这一点


    谢谢

    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
    的属性)