通过zookeeper连接时,如何确定选择了哪个Apache Drill钻头



我正在使用zookeeper连接字符串来获得到钻集群的连接。我想记录我成功连接到的钻取位(主机名或IP地址(,但在java.sql.Connection类上找不到任何属性或方法来获取这些信息。

我尝试了connection.getMetaData.getURL,但它只返回了我用来获取连接的zookeeper连接字符串(下面的scala代码(:

import java.sql._
Class.forName("com.mapr.drill.jdbc41.Driver")
val con = DriverManager.getConnection("jdbc:drill:zk=<server1>:5181,<server2>:5181/drill/<cluster_name>...")
con.getMetaData().getURL()  // returns "jdbc:drill:zk=<server1>..."
val st  = con.createStatement()
val res = st.executeQuery("select *,'findme' from sys.drillbits")
while(res.next()) { println(res.getString(1)) }

如果我在findme的所有钻头服务器上grepdrillbit_queries.json日志,我可以找到哪个钻头被用来执行查询。为了跟踪连接问题,我希望能够从应用程序中记录正在使用的钻头,而不必grep日志文件。

别忘了,您可以在Drill邮件列表或空闲通道上直接向Apache Drill社区提出这些问题。看见https://drill.apache.org/community-resources/了解更多详细信息。

针对您的问题,请查看系统表(https://drill.apache.org/docs/querying-system-tables/)。特别是sys.profiles_json表,它似乎可以为您提供所需的信息。

一般来说,如果你能在Drill的web界面中看到你需要的信息,你也能在系统表中找到这些信息,这是一个非常安全的赌注。通常,快速扫描文档和一些试用查询会为您提供所需的信息。由于web界面是开源的,您也可以浏览源代码,了解web界面是如何为您提供相关信息的。

特别是,这个查询大致给出了您想要的内容:

with t1 as (
select convert_from(x.json, 'JSON') js from sys.profiles_json x
)
select t1.js.queryId id, t1.js.foreman.address foreman, t1.js.query query
from t1
limit 3

我实际上找到了我要找的东西:https://github.com/apache/drill/blob/master/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java#L462

private void connect(DrillbitEndpoint endpoint) throws RpcException {
client.connect(endpoint, properties, getUserCredentials());
logger.info("Foreman drillbit is {}", endpoint.getAddress());
}

因此,现在的问题是(假设MapR DrillJDBC驱动程序类似(,我们的应用程序能否访问DrillbitEndpoint对象?

在UserClient代码中(DillClient是UserClient的包装器(,我看到https://github.com/apache/drill/blob/master/exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserClient.java#L109

DrillbitEndpoint endpoint;

是一个私有实例变量,我看不到任何公开它的公共方法。所以我认为我们的应用程序没有办法访问它。

Ted建议使用Java反射或和/或Drill将来的pull请求来公开此字段。


如果您不介意进行另一个查询,https://drill.apache.org/docs/troubleshooting/#identify-工头有答案:

SELECT hostname FROM sys.drillbits WHERE `current` = true;

这将返回会话中连接到的钻头(即工头(的主机名。

最新更新