Tableau Generic JDBC 连接 Kylin

在 7 月 12 日的 Kylin Data Summit 上,来自丁香园的周天鹏获得“2019 最佳 Apache Kylin 社区贡献个人奖”,热心的天鹏同学修复了很多 Kylin 与 Tableau 集成的问题。社区小伙伴经常会问起『Tableau Generic JDBC 可以连 Kylin 吗』,终于,天鹏带来了下文为大家揭晓答案。

周天鹏(左三)

 

喜大普奔~ 喜大普奔~ 都 9102 年了,Tableau(2018.3及以后版本)终于能用自带的 Generic JDBC 驱动连接 Kylin 了。

 

Tableau Generic JDBC

提前声明,这些对 JDBC 驱动的不断贡献均来自于社区小伙伴。本人只是整理一下不同版本 Kylin JDBC 驱动能和 Tableau 能擦出怎样的火花,仅此而已。

Tableau 官方明确声明对 JDBC 驱动仅做了有限的支持,基本就是这个水平……

Tableau Generic JDBC 连接 Kylin_第1张图片

虽然支持了通用 JDBC 驱动,能不能用那可就看你的驱动了。想打印驱动的 Debug 日志信息?不好意思,不支持。

一时间竟无语凝噎。于是决定和 Tableau 拼了,既然它用了 JDBC 驱动,就不信找不到他的相关 Jar 包。果然,在 Tableau 安装路径的 bin 目录下,发现了可疑文件。

# ls -l tabjdbc.jar
-rw-r--r-- 1 root root 1562997 Jun 13 13:58 tabjdbc.jar

解压出来瞄了几眼里面的代码,基本可以确定这个就是 Tableau 访问 JDBC 数据源的关键了。

接下来的事情就很简单,利用 Jar 包中的方法,创建个 Demo,自己 Debug 即可。

package com.tableausoftware.data;

import com.tableausoftware.jdbc.JDBCProtocolImpl;
import com.tableausoftware.jdbc.TableauJDBCException;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) throws TableauJDBCException, SQLException {
        String uri = "jdbc:kylin://192.168.200.138:7070/KYLIN_SYSTEM";
        HashMap info = new HashMap();
        info.put("user", "ADMIN");
        info.put("password", "KYLIN");
        JDBCProtocolImpl jdbcProtocol = new JDBCProtocolImpl(uri, info, new HashMap());

        if (jdbcProtocol.isConnected(3)) {
            ProtobufResultSet protobufResultSet = jdbcProtocol.runQuery("select 2333");
            ResultSet resultSet = protobufResultSet.resultset;

            while (resultSet.next()) {
                System.out.println(resultSet.getString(1));
            }
        }
    }
}

 

老版本 Kylin JDBC 驱动的缺陷

1. Kylin 2.6.1 及以前

通过使用 Kylin 2.6.1 的 JDBC 驱动包,得到了如下报错:

Jul 16, 2019 2:00:17 PM com.tableausoftware.jdbc.JDBCProtocolImpl loadDriver
SEVERE: java.sql.SQLException: No suitable driver
No suitable driver
Exception in thread "main" com.tableausoftware.jdbc.TableauJDBCException: java.sql.SQLException: No suitable driver
No suitable driver
  at com.tableausoftware.jdbc.JDBCProtocolImpl.loadDrive  (JDBCProtocolImpl.java:158)
  at com.tableausoftware.jdbc.JDBCProtocolImpl.(JDBCProtocolImpl.java:70)
  at com.tableausoftware.jdbc.JDBCProtocolImpl.(JDBCProtocolImpl.java:114)
  at com.tableausoftware.data.Main.main(Main.java:16)
  used by: java.sql.SQLException: No suitable driver
  at com.tableausoftware.jdbc.JDBCProtocolImpl.loadDrive  (JDBCProtocolImpl.java:157)
  ... 3 more

Tableau 界面操作后报错如下:

这里突然回想起 Kylin 官网的 JDBC 驱动使用 Demo(传送门:https://kylin.apache.org/docs/howto/howto_jdbc.html)。是需要手动指定 JDBC 驱动的实现类的:

Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();

然而,Tableau 在使用 JDBC 驱动时,好像并没有地方让我指定用哪个驱动类进行连接。这样看来,Tableau 使用 SPI 动态注册驱动基本石锤了。注:

Java SPI 机制详解传送门:https://juejin.im/post/5af952fdf265da0b9e652de3

再到 Tableau 官网看看,果然找到了如下内容:

  1. You must have read permissions on the .jar file.
  2. Tableau requires a JDBC 4.0 or later driver.
  3. Tableau requires a Type 4 JDBC driver.
  4. Install the latest 64-bit version of Java.

JDBC 4.0 及以后,已经不需要调用 Class.forName 来加载驱动程序了。

因为规范中要求所有的 JDBC 驱动 Jar 包必须在 META-INF/Services/java.sql.driver 中写明各自的驱动名称。开发人员只需要下面一行代码即可根据连接串自动匹配相应的 JDBC 驱动。

Connection con = DriverManager.getConnection(xxx);

这个问题已经在 KYLIN-3965 JDBC fix(https://github.com/apache/kylin/pull/616)中得到了修复。首次 Release 在 Kylin 2.6.2。

2. Kylin 2.6.2 & 2.6.3 & 3.0.0-alpha

因此我们使用 Kylin 2.6.2 及以后的 JDBC 驱动包,即可避免上面找不到驱动的问题。

但是通过使用 Kylin 2.6.2 的 JDBC 驱动包,又得到了如下报错:

Jul 16, 2019 2:42:06 PM com.tableausoftware.jdbc.JDBCProtocolImpl 
INFO: Initiating connection.
Exception in thread "main" com.tableausoftware.jdbc.TableauJDBCException: Error in isConnected
  at com.tableausoftware.jdbc.JDBCProtocolImpl.isConnected(JDBCProtocolImpl.java:775)
  at com.tableausoftware.data.Main.main(Main.java:18)
Caused by: java.sql.SQLFeatureNotSupportedException
  at org.apache.kylin.jdbc.shaded.org.apache.calcite.avatica.Helper.unsupported(Helper.java:68)
  at org.apache.kylin.jdbc.shaded.org.apache.calcite.avatica.AvaticaConnection.isValid(AvaticaConnection.java:376)
  at com.tableausoftware.jdbc.JDBCProtocolImpl.isConnected(JDBCProtocolImpl.java:773)
  ... 1 more

Tableau 界面操作后报错如下:

Tableau Generic JDBC 连接 Kylin_第2张图片

这次 Tableau 界面上或者日志中的报错信息量几乎为零。但好在我们找到了 tabjdbc.jar,因此通过 Demo 程序得到了一个稍微详细一点异常信息。

接下来开始面向 Google 编程,通过异常信息找到了这个 issue CALCITE-1520:https://issues.apache.org/jira/browse/CALCITE-1520。

原来是 Apache Calcite Avatica 1.10 的问题,Fix Version 是 avatica-1.12.0。现在我们只需要将 Avatica 的版本改为 1.12 即可。

相关 PR:Upgraded avatica/calcite version(https://github.com/apache/kylin/pull/739)

相关邮件:Kylin-and-Tableau-JDBC(http://apache-kylin.74782.x6.nabble.com/Kylin-and-Tableau-JDBC-td13471.html)

改完 Avatica 版本之后再打一个 JDBC 驱动包出来,上面的 Demo 程序稳稳地打印出了 2333。

Jul 16, 2019 3:28:13 PM com.tableausoftware.jdbc.JDBCProtocolImpl 
INFO: Initiating connection.
2333

 

完美支持 Tableau Generic JDBC

已经发布的 Kylin 3.0.0-alpha2 已修复上述两个问题,以后 Tableau 用户就可以在 Linux 环境下使用 JDBC 驱动访问 Kylin 数据源,不至于被绑死在 Windows 上(开源版 Kylin 仅有 Windows 版 Kylin ODBC 驱动)。

当然方法也很简单,只需要先将相应的 JDBC .jar 文件放置到相应目录,然后直接使用 Tableau 通用 JDBC 数据源进行连接即可。

操作系统 路径
Windows C:\Program Files\Tableau\Driver
Mac ~/Library/Tableau/Drivers
Linux /opt/tableau/tableau_driver/jdbc


Tableau 官方文档:https://help.tableau.com/current/pro/desktop/en-us/examples_otherdatabases_jdbc.htm

 

作者介绍:周天鹏,丁香园大数据运维工程师,主要负责 OLAP 平台的开发与维护。

了解更多大数据资讯,点击进入Kyligence官网

转载于:https://my.oschina.net/cicixing/blog/3086431

你可能感兴趣的:(Tableau Generic JDBC 连接 Kylin)