我正在使用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;
这将返回会话中连接到的钻头(即工头(的主机名。