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

Avoid starting HiveThriftServer2 with created context programmatically

我们正在尝试使用 ThriftServer 从 spark temp tables,在 spark 2.0.0 中查询数据。

首先,我们创建了启用 Hive 支持的 sparkSession。 目前,我们像这样使用 sqlContext 启动 ThriftServer:

HiveThriftServer2.startWithContext(spark.sqlContext());

我们有带有注册温度的 spark 流 table "spark_temp_table":

StreamingQuery streamingQuery = streamedData.writeStream()
                                             .format("memory")
                                             .queryName("spark_temp_table")
                                             .start();

使用直线我们可以看到温度 tables (运行ning SHOW TABLES);

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

我这里有两个问题:

  1. 有没有办法在一个端口上安装一个 ThriftServer 并访问不同 sparkSession 中的所有临时 tables?

  2. HiveThriftServer2.startWithContext(spark.sqlContext()); 被注释为 @DeveloperApi。有没有什么方法可以以编程方式在代码中没有上下文的情况下启动节俭服务器?
    我看到有配置 --conf spark.sql.hive.thriftServer.singleSession=true 在启动时传递给 ThriftServer (sbin/start-thriftserver.sh),但我不明白如何为作业定义它。我尝试在 sparkSession builder 中设置此配置 属性,但直线没有显示温度 tables.

Is there any way to have one ThriftServer on one port with access to all temp tables in a different sparkSessions?

没有。 ThriftServer 使用特定会话,临时 table 只能在此会话中访问。这就是为什么:

beeline didn't display temp tables.

当您使用 sbin/start-thriftserver.sh 启动独立服务器时。

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

  • 您启动 thrift 服务器。
  • client1 连接到此服务器并创建临时文件 table foo.
  • client2 连接到此服务器并读取 foo