在同一会话上从 pyspark 运行多个 Hive 查询



我正在尝试使用 pyspark 运行 Hive 查询。我正在使用 Hortonworks,所以我需要使用 Hive WarehouseConnector。

运行一个或多个查询既简单又有效。我的问题是我想先发出set命令。例如,在 tez ui:set hive.query.name=something relevant中设置 dag 名称或设置一些内存配置set hive.tez.container.size = 8192。为了使这些语句生效,它们需要在与主查询相同的会话上运行,这就是我的问题。

我尝试了两种方法:

第一个是为每个查询生成一个新的 hive 会话,并具有正确设置的 url,例如:

url='jdbc:hive2://hiveserver:10000/default?hive.query.name=relevant'
builder = HiveWarehouseSession.session(self.spark)
builder.hs2url(url)
hive = builder.build()
hive.execute("select * from whatever")

它适用于第一个查询,但下一个查询会重复使用相同的 url(即使我尝试手动删除builderhive(,因此不起作用。

第二种方法是在 Spark 节俭服务器中全局设置spark.sql.hive.thriftServer.singleSession=true。这似乎确实有效,但我觉得为了一个应用程序的利益而限制全局火花节俭服务器是一种耻辱。

有没有办法实现我想要的东西?也许有一种方法可以将查询固定到一个执行器,所以希望是一个会话?

这是我的一个大烦恼......实际上仍然是。

为我解决这个问题的解决方案是将所有查询放在一个查询文件中,其中每个查询都用分号分隔。然后,我从 python 脚本中使用直线运行查询。

不幸的是,它不适用于返回结果的查询...仅适用于设置、覆盖、插入类型的查询。

如果您可能发现了更有效的方法,请分享。

最新更新