Linkis JDBC是如何适配Tableau的?


目录
javascript

1、       背景介绍
2、       使用案例
1     链接数据源
2     查看数据库并提交Linkis任务
3、       兼容Tableau的具体实现
1     定义JDBC展现属性的Manifest
2     用于定制链接器对话框的tcd文件
3     用于解析链接器的tcr文件
4     定制SQL方言的tdd文件
5     链接器的构造器connectionBuilder
6     链接器的参数配置文件Connection Properties
7     打包装入Tableau完成适配
4、       实现总结
5、       参考文献
 


01java

git

背景介绍github


----为何咱们须要Linkis JDBC去兼容Tableau?sql

毫无疑问,Tableau在当今商业化BI产品中有着普遍的客户群体,不少商业机构使用Tableau进行数据分析和构建报表,支持Tableau的兼容方案可使不懂java的数据分析人员依靠托拉拽的可视化方式向Linkis提交任务。不管对于用户仍是Linkis,实现Tableau兼容都是很是值得去作的一件事。数据库

对于用户来讲,使用JDBC的开发人员必须掌握JDBC的使用方法,这种限制增长了分析人员的学习成本,为了丰富用户的使用场景,不只仅依靠java api的方式去构建代码与Linkis互动,兼容可视化BI工具的想法应运而生,而Tableau正是这一想法的其中一个实现目标。api

对于Linkis来讲,Linkis项目诞生之时便有“链接一切”的愿景,实现丰富的底层计算存储组件的支持和知足多样的上层应用接入,经过JDBC的方式链接Linkis拓展了自身的适用场景,将Linkis JDBC适配Tableau自己也是拓展用户群体的一种体现。服务器


----应该如何去实现这一目标?
Tableau中提供了大量的数据源支持,而这些支持都是须要驱动类来实现的,例如Mysql、Hive等数据库的JDBC Driver,只须要数据源厂商定制知足Tableau接口规范的模组文件就能在Tableau中制定可插拔的数据源链接器。
图2-1 Tableau中已经适配的数据源


02

使用案例

Tableau的适配方法在第三章中会详细介绍,在介绍适配方法以前,咱们先来一块儿体验一下适配后的Tableau如何经过JDBC轻松地联动Linkis。

(1)链接数据源

在适配好了Tableau以后,咱们启动Tableau,能够看到“链接” ->“服务器” ->“更多”的列表中已经有了Linkis。
图2-1 服务器列表中已经有了Linkis
点击后弹出对话框须要填写数据源的相关配置,包含服务器的主机IP、端口、数据库、用户名及密码。这里的主机ip须要填写部署Linkis的服务器ip,端口是gateway的服务端口,数据库是Hive的数据库,须要注意的是,用户名是具备访问Linkis权限的用户,而不是数据库的用户,由于本质上是用户名和密码须要通过gateway服务进行登陆和权限校验。
图2-2 经过Linkis JDBC链接到Linkis
填写好相关数据点击登陆便可。

(2)查看数据库并提交Linkis任务

登陆后页面会自动跳转,左侧一栏展现当前数据库全部的Hive表信息
图2-3 登陆后的使用界面
咱们来试一下查询表的具体数据,这里使用的是testjohn1表,点击表右侧的按钮便可快速查询。
图2-4 查询表数据按钮
图2-5 查询结果
从图2-5能够看出,tableau已经成功提交SQL任务到Linkis执行,并将返回的结果集解析成表展现给用户。咱们从dss(DataSphere Studio)的管理台能够查看到该任务的提交和执行状况。在后续linkis1.0的版本中也将能够经过linkis的管理台直接查看任务的提交和执行状况。
图2-6 dss管理台任务执行状况
这里介绍了在Tableau使用Linkis JDBC提交任务到Linkis的具体案例,用户能够实现零代码编写使用Linkis,下面将介绍Tableau兼容方案的具体实现方式,会较为详细地介绍文件的做用和生成细节。


03

兼容Tableau的具体实现

为了实现将Linkis的JDBC驱动加入到服务器列表中实现适配,咱们须要自定义修改Tableau的适配文件,适配文件包含Manifest(.xml文件)、Tableau Custom Dialog file(.tcd文件)、Tableau ConnectionResolver file(.tcr文件)、Tableau Dialect file(.tdd)、connectionBuilder(.js文件)以及Connection Properties(.js文件)这六个文件[2],下面将逐一介绍。

(1)定义JDBC展现属性的Manifest微信

Manifest文件的主要做用是用于定义链接器名字,用于在可用的数据源UI页面展现给用户,该文件对于每一个客制化链接器来讲是必选的,一样地,在linkis的JDBC方案中,该文件也进行了修改与适配。

<?xml version='1.0' encoding='utf-8' ?><connector-plugin class='linkis_jdbc' superclass='jdbc' plugin-version='1.0' name='Linkis (JDBC)' version='2020.1.0'> <vendor-information> <company name="Linkis"/> <support-link url="https://github.com/WeBankFinTech/Linkis"/> </vendor-information> <connection-customization class="linkis_jdbc" enabled="true" version='2020.1.0'> <vendor name="linkis"/> <driver name="Linkis JDBC Driver"/> <customizations> <customization name="CAP_JDBC_METADATA_READ_PRIMARYKEYS" value="no"/> <customization name="CAP_JDBC_METADATA_READ_FOREIGNKEYS" value="no"/> <customization name="CAP_JDBC_QUERY_ASYNC" value="yes"/> <customization name="CAP_JDBC_QUERY_CANCEL" value="yes"/> <customization name="CAP_FAST_METADATA" value="yes"/> <customization name="CAP_SELECT_INTO" value="no"/> <customization name="CAP_SELECT_TOP_INTO" value="no"/> <customization name="CAP_CREATE_TEMP_TABLES" value="no"/> <customization name="CAP_QUERY_BOOLEXPR_TO_INTEXPR" value="no"/> <customization name="CAP_QUERY_GROUP_BY_DEGREE" value="no"/> <customization name="CAP_QUERY_SORT_BY_DEGREE" value="no"/> <customization name="CAP_QUERY_SUBQUERIES" value="yes"/> <customization name="CAP_QUERY_TOPSTYLE_LIMIT" value="yes"/> <customization name="CAP_QUERY_WHERE_FALSE_METADATA" value="yes"/> <customization name="CAP_QUERY_SUBQUERIES_WITH_TOP" value="yes"/> <customization name="CAP_SUPPORTS_SPLIT_FROM_LEFT" value="yes"/> <customization name="CAP_SUPPORTS_SPLIT_FROM_RIGHT" value="yes"/> <customization name="CAP_SUPPORTS_UNION" value="yes"/> <customization name="CAP_QUERY_ALLOW_PARTIAL_AGGREGATION" value="no"/> <customization name="CAP_QUERY_HAVING_REQUIRES_GROUP_BY" value="yes"/> <customization name='CAP_JDBC_SUPPRESS_ENUMERATE_DATABASES' value='yes' /> <customization name='CAP_JDBC_SUPPRESS_ENUMERATE_SCHEMAS' value='yes' /> <customization name='CAP_QUERY_TOP_N' value='no' /> </customizations> </connection-customization> <connection-dialog file='connection-dialog.tcd'/> <connection-resolver file="connectionResolver.tdr"/> <dialect file='dialect.tdd'/></connector-plugin>

其中class的标签值必须是惟一的,能够用于其余链接器中.xml文件的寻址、客制化定制以及Tableau工做簿中匹配链接器。
name值在Tableau 链接器窗格中显示链接器名称,还能够指定供应商信息。
company name用于在Tableau 链接器窗格中的链接器名旁边显示,能够展现链接器的建立者,也就是connector name by company name,例如Linkis JDBC Driverby linkis。
customizationname主要用于定制Linkis中JDBC的功能。

(2)用于定制链接器对话框的tcd文件svg

Tableau CustomDialog file即tcd文件,该文件是可选的,主要用于定制链接器对话框的内容。

   
   
    
    
             
    
    
<connection-dialog class='linkis_jdbc'> <connection-config> <authentication-mode value='Basic' /> <authentication-options> <option name="UsernameAndPassword" default="true" /> </authentication-options> <db-name-prompt value="Database: " /> <has-pre-connect-database value="true" /> <port-prompt value="Port: " default="9001" /> <show-ssl-checkbox value="true" /> </connection-config></connection-dialog>

(3)用于解析链接器的tcr文件

解析器tcr用于Tableau建立链接时寻找Connection文件,配置以下:

<?xml version='1.0' encoding='utf-8' ?><tdr class='linkis_jdbc'> <connection-resolver> <connection-builder> <script file='connectionBuilder.js'/> </connection-builder> <connection-normalizer> <required-attributes> <setImpersonateAttributes/> <attribute-list> <attr>server</attr> <attr>port</attr> <attr>dbname</attr> <attr>username</attr> <attr>password</attr> <attr>sslmode</attr> </attribute-list> </required-attributes> </connection-normalizer> <connection-properties> <script file='connectionProperties.js'/> </connection-properties> </connection-resolver></tdr>


这里指定了connection-builder和connection-properties的文件名,以及链接器链接时的必要属性,Tableau会将用户填写的这些数据信息组装成URL字符串用于创建链接。

(4)定制SQL方言的tdd文件

SQL方言是指的不一样数据库之间的命令字不一样,为了使Tableau兼容数据源,须要对数据源的方言进行转换,因为篇幅缘由,这里只列出部分tdd文件的数据:

<dialect name='HiveDialectSDK' base='HiveDialect' class='linkis_jdbc' version='18.1'> <function-map> <function group='numeric' name='LN' return-type='real'> <formula>(CASE WHEN %1 &gt; 0 THEN LN(%1) ELSE CAST(NULL AS DOUBLE) END)</formula> <argument type='real' /> </function> <function group='numeric' name='LOG' return-type='real'> <formula>(CASE WHEN %1 &gt; 0 THEN LOG10(%1) ELSE CAST(NULL AS DOUBLE) END)</formula> <argument type='real' /> </function> <function group='numeric' name='LOG' return-type='real'> <formula>(CASE WHEN %1 &gt; 0 THEN LOG10(%1) / LOG10(%2) ELSE NULL END)</formula> <argument type='real' /> <argument type='real' /> </function> <function group='numeric' name='MAX' return-type='real'> <formula>(CASE&#10;&#9;WHEN (%1 IS NULL) OR (%2 IS NULL) THEN NULL&#10;&#9;WHEN %1 &gt; %2 THEN %1&#10;&#9;ELSE %2 END)</formula> <argument type='real' /> <argument type='real' /> </function> <function group='numeric' name='MAX' return-type='int'> <formula>(CASE&#10;&#9;WHEN (%1 IS NULL) OR (%2 IS NULL) THEN NULL&#10;&#9;WHEN %1 &gt; %2 THEN %1&#10;&#9;ELSE %2 END)</formula> <argument type='int' /> <argument type='int' /> </function> </function-map></dialect>
完整的SQL方言文档能够参考
https://github.com/tableau/connector-plugin-sdk/blob/master/samples/plugins/postgres_jdbc/dialect.tdd

(5)链接器的构造器connectionBuilder

Tableau使用链接构造器(Linkis JDBC中的脚本名为connectionBuilder.js)建立JDBC链接URL的字符串,脚本映射定义链接配置方式的属性,在这里数据库地址、端口、以及数据库名构形成JDBC链接字符串传给驱动程序。
文件具体内容以下:

(function dsbuilder(attr) { var urlBuilder = "jdbc:linkis://" + attr[connectionHelper.attributeServer] + ":" + attr[connectionHelper.attributePort] + "/" + attr[connectionHelper.attributeDatabase];
return [urlBuilder];})


(6)链接器的参数配置文件Connection Properties

该参数配置文件是可选的,仅仅当数据源驱动是JDBC时才须要(Linkis JDBC中的脚本名为connectionProperties.js),用于构建URL最后的参数设置。

(function propertiesbuilder(attr) { var props = {}; props["user"] = attr[connectionHelper.attributeUsername]; props["password"] = attr[connectionHelper.attributePassword]; if (attr[connectionHelper.attributeSSLMode] == "require") { props["ssl"] = "true"; props["sslmode"] = "require"; }
return props;})


(7)打包装入Tableau完成适配

方法一:自定义链接器插件装载路径(已验证可行)
首先咱们将前面六个文件装入目录linkis_jdbc目录(该目录名应该和Mainfest中的class='linkis_jdbc'是一致的),该目录位于C:\connectors,文件目录层级以下图所示:
图3-1 适配文件路径

上述路径和文件名是自定义的,没必要和本文章彻底一致,在启动时咱们须要添加额外参数-DConnectPluginsPath=/Path定向加载适配文件。在CMD命令行中输入

E:\tableau\bin\tableau.exe  -DConnectPluginsPath=C:\connectors

其中E:\tableau\bin\tableau.exe是Tableau的运行路径。也能够在Tableau快捷方式中指定运行参数,这样就能够避免每次经过命令行启动。

图3-2 指定运行参数

方法二:经过官方文档构建(尝试过未成功,可能方法有误)
该种方法是经过构造.taco文件存入Tableau的数据源根目录,实现具体方法能够参考[1] 。
咱们经过第一种方法完成了适配,在适配好了Tableau以后,咱们启动Tableau,能够看到“链接”->“服务器”->“更多”的列表中已经有了Linkis JDBC。
图3-3 适配成功


04

实现总结

Tableau做为一款受众面极广的商业BI软件,兼容Tableau可使Linkis的适用性更广,用户能够经过Linkis在Tableau上实现底层spark集群的SQL请求。Tableau为数据源服务商提供了一套完整的接口方案,方便服务商定制属于本身的数据源驱动的适配文件,只须要服务商根据自身驱动的特性适当地修改,便可方便地完成适配过程,整个适配流程也遇到了一些困难,经过查看Tableau的日志和其余产品的兼容方案[3]才得以解决。
       咱们也将在将来对Linkis作更多的适配内容,欢迎广大社区用户加入到Linkis的开源建设工做中,咱们也将极力提供应有的支持。



05

参考文献

[1] 使用 Tableau Connector SDK 組建的連接器外掛程式
https://help.tableau.com/current/pro/desktop/zh-tw/examples_connector_sdk.htm
[2] connector-plugin-sdk
https://github.com/tableau/connector-plugin-sdk
[3] tableau-qubole-connector
https://github.com/qubole/tableau-qubole-connector/tree/master/Hive/qubole_hive


WeDataSphere,BIG DATA MADE EASY.

用心作一个有温度的开源社区

~欢迎关注~


扫码关注咱们

微信号公众号 : WeDataSphere

GitHub:WeDataSphere

若是喜欢咱们的产品或文章,请给咱们的GitHub点上你宝贵的star和fork哦~~

欢迎加入咱们的有奖征文活动哦,详见以下连接~

【有奖征文】我有酒,你有故事吗?

同时诚挚的但愿您点开“阅读原文”,在OSC开源投票中,为Linkis与DataSphere Studio投上您宝贵的一票哦~~

本文分享自微信公众号 - WeDataSphere(gh_273e85fce73b)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索