避免以编程方式使用创建的上下文启动HiveThriftServer2

Vla*_*cak 10 hadoop hive apache-spark apache-spark-sql apache-spark-2.0

我们正在尝试使用ThriftServer从spark 2.0.0中的spark temp表中查询数据.

首先,我们创建了启用Hive支持的sparkSession.目前,我们使用sqlContext启动ThriftServer,如下所示:

HiveThriftServer2.startWithContext(spark.sqlContext());
Run Code Online (Sandbox Code Playgroud)

我们有注册临时表"spark_temp_table"的火花流:

StreamingQuery streamingQuery = streamedData.writeStream()
                                             .format("memory")
                                             .queryName("spark_temp_table")
                                             .start();
Run Code Online (Sandbox Code Playgroud)

通过直线,我们可以看到临时表(运行SHOW TABLES);

当我们想用这种方法运行第二个作业(第二个sparkSession)时,我们必须用不同的端口启动第二个ThriftServer.

我这里有两个问题:

  1. 有没有办法让一个端口上有一个ThriftServer可以访问不同sparkSessions中的所有临时表?

  2. HiveThriftServer2.startWithContext(spark.sqlContext());@DeveloperApi.注释.有没有办法以编程方式在代码中启动带有上下文的thrift服务器?
    我看到--conf spark.sql.hive.thriftServer.singleSession=true在启动时传递给ThriftServer的配置(sbin/start-thriftserver.sh)但是我不明白如何为作业定义它.我试图在sparkSession构建器中设置此配置属性,但beeline没有显示临时表.

小智 5

有没有办法让一个端口上有一个ThriftServer可以访问不同sparkSessions中的所有临时表?

否.ThriftServer使用特定会话和临时表只能在此会话中访问.这就是为什么:

beeline没有显示临时表.

当你启动独立服务器时sbin/start-thriftserver.sh.

spark.sql.hive.thriftServer.singleSession并不意味着您为多个服务器获得单个会话.它对与单个Thrift服务器的所有连接使用相同的会话.可能的用例:

  • 你开始节俭服务器.
  • client1连接到此服务器并创建临时表foo.
  • client2连接到此服务器并读取 foo