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

10

我们正在尝试使用ThriftServer从Spark 2.0.0中的临时表中查询数据。

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

HiveThriftServer2.startWithContext(spark.sqlContext());
我们有一个带有注册临时表“spark_temp_table”的Spark流:
StreamingQuery streamingQuery = streamedData.writeStream()
                                             .format("memory")
                                             .queryName("spark_temp_table")
                                             .start();

通过使用Beeline,我们可以看到临时表(运行SHOW TABLES);

当我们想要运行第二个作业(使用第二个sparkSession)时,我们必须使用不同的端口启动第二个ThriftServer。

在这里我有两个问题:

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

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


2
在回答你的问题之前,我想问一个问题 :) 你真的需要以编程方式启动“ThriftServer”吗? - user1314742
@user1314742 不,我们不需要(也不想使用 - 尽量避免 HiveThriftServer2.startWithContext(spark.sqlContext());)。我们实际上试图开始使用单个会话启动sbin/start-thriftserver.sh,但没有成功。基本上,我们需要通过Spark JDBC服务器访问“temp”表,并从具有“JDBC”连接的不同应用程序查询“temp”表。 - VladoDemcak
在使用 master local 时,是否有可能查看临时表? - VladoDemcak
1个回答

5
有没有办法在一个端口上拥有一个ThriftServer并访问不同sparkSessions中的所有临时表?
不行。ThriftServer使用特定的会话,临时表只能在该会话中访问。这就是为什么:当您使用sbin/start-thriftserver.sh启动独立服务器时,beeline没有显示临时表。
spark.sql.hive.thriftServer.singleSession并不意味着您可以为多个服务器获得单个会话。它将相同的会话用于连接到单个Thrift服务器的所有连接。可能的用例:
- 您启动Thrift服务器。 - 客户端1连接到此服务器并创建临时表foo。 - 客户端2连接到此服务器并读取foo

谢谢您的回答,现在我明白了很多,非常感谢!我这里还有一个问题。假设我想将client1作为Spark Streaming Job,是否可以获取ThriftServer Session,或者如何将流式作业“连接”到使用sbin/start-thriftserver.sh启动的运行中的Thrift Server? - VladoDemcak
@VladoDemcak,除了以编程方式运行HiveThriftServer2之外,您是否找到其他方法?我有一个非常类似的用例,想知道是否我选择的工具不正确。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接