Apache Drill - 以嵌入式模式连接到 Drill [java]

Posted

技术标签:

【中文标题】Apache Drill - 以嵌入式模式连接到 Drill [java]【英文标题】:Apache Drill - connection to Drill in Embedded Mode [java] 【发布时间】:2015-07-27 13:38:31 【问题描述】:

我想通过 Java 应用程序连接到 Drill,到目前为止,我一直在尝试使用 JDBC 来完成它,我正在使用来自 https://github.com/vicenteg/DrillJDBCExample 的示例,但是... 当我将 DB_URL 静态变量更改为 "jdbc:drill:zk=local" 并启动应用程序时出现异常:

java.sql.SQLNonTransientConnectionException: 不支持单独使用 Drill 的 jdbc-all JDBC 驱动 Jar 文件以嵌入式模式运行 Drill。

到目前为止,我还没有找到任何解决方法。知道如何以嵌入式模式连接到 Drill 吗?到目前为止,我不想设置分布式模式。

网络上确实没有太多关于它的内容。

任何帮助将不胜感激!

【问题讨论】:

您是否尝试使用此 JDBC URL? jdbc:drill:drillbit=<drillbit-hostname>:31010 我使用的是嵌入式模式,所以据我所知我不会启动钻头 当您使用嵌入式模式时,您正在启动一个钻头,它只是这样做而不需要 Zookeeper 实例。 @vicenteg 在更改 JDBC URL 时显示此错误:找不到适合 dbc:drill:drillbit=localhost:31010 的驱动程序 【参考方案1】:

如果你连接到本地嵌入式实例(没有 Zookeeper),你应该直接使用 Drillbit 主机:

jdbc:drill:drillbit=<drillbit-host>:[port]

例如: jdbc:drill:drillbit=localhost

【讨论】:

这对我在 Squirrel 和 SQLWorkbench 上也很有效【参考方案2】:

TLDR: jdbc:drill:drillbit=localhost:31010

首先尝试使用 SQuirreL SQL 客户端。

我正在使用运行 linux 和 apache 的 vm 执行此操作,如果这一切都在一台主机上,您可以用 localhost 替换。

首先开始在您的虚拟机或主机上嵌入钻孔,例如:

/opt/apache-drill-1.1.0/bin/drill-embedded

这将启动嵌入式外壳。检查端口是否打开 - 它看起来与 Zookeeper 等的默认值不同:

sroot@localhost:/opt/apache-drill-1.1.0/bin [1089] netstat -anp | grep 31010

tcp 0 0 ::ffff:0.0.0.0:31010 :::* LISTEN 12934/java

你应该可以远程登录 localhost 31010 到这个端口。

您必须按照此处所述设置 jar 驱动程序: https://drill.apache.org/docs/using-jdbc-with-squirrel-on-windows/

确保带有驱动程序的 jar 是可执行的。

但使用以下内容修改字符串 - 没有 Zookeeper 的情况不同,例如在 squirrel 中应该看起来像这样(也感谢上面的其他答案

jdbc:drill:drillbit=localhost:31010

您可以用上面的 ip 替换 localhost - 然后测试连接。

我使用的jar是drill-jdbc-all-1.1.0.jar,类名是org.apache.drill.jdbc.Driver

example squirrel driver configuration

【讨论】:

【参考方案3】:

我认为您使用的 jar 不正确。看来您正在使用 jdbc-all-jar。有两个罐子。您需要添加另一个 jar 以使其工作。添加了maven pom。这应该会让你继续前进

<dependency>
      <groupId>org.apache.drill.exec</groupId>
      <artifactId>drill-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>

【讨论】:

java.lang.ClassNotFoundException: org.apache.drill.exec 现在。但它是新的东西!【参考方案4】:

您需要在您的 java 项目中添加以下依赖项(我假设是基于 maven 的

<dependency>
    <groupId>org.apache.drill.exec</groupId>
    <artifactId>drill-jdbc</artifactId>
    <version>1.4.0</version>
</dependency>

示例代码(假设你想在嵌入式模式下运行钻):

Class.forName("org.apache.drill.jdbc.Driver");
Connection connection =DriverManager.getConnection("jdbc:drill:zk=localhost");
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("SELECT * from cp.`employee`");
while(rs.next())
System.out.println(rs.getString(1));

如果您已经开始钻探(假设钻探正在本地机器上运行)。然后你应该改变连接:

Connection connection =DriverManager.getConnection("jdbc:drill:drillbit=localhost");

查看示例项目:https://github.com/devender-yadav/DrillJDBC

注意:我已经针对 Drill 1.2、1.3 和 1.4 进行了测试

【讨论】:

对于这两个选项,我是否需要明确开始练习?还是在第一个选项中它会以嵌入模式自动启动?

以上是关于Apache Drill - 以嵌入式模式连接到 Drill [java]的主要内容,如果未能解决你的问题,请参考以下文章

将 Apache Drill 连接到 Kudu

为啥在嵌入式模式下尝试启动 apache Drill 时出现错误?

apache钻java.lang.NullPointerException

Apache Drill 0.9 和 SQuirreL SQL 客户端 - 无法列出 JDBC 驱动程序

Apache Drill 和 databaseMetadata.getColumns:目录/模式的值?

Apache Drill 无法从 HDFS 读取文件(资源错误:无法创建模式树)