Linkis JDBC是怎么适配Tableau

这篇文章主要介绍“Linkis JDBC是怎么适配Tableau”,在日常操作中,相信很多人在Linkis JDBC是怎么适配Tableau问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linkis JDBC是怎么适配Tableau”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

01

背景介绍

—-为什么我们需要Linkis JDBC去兼容Tableau?

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

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

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

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

       

       
02
         

       

         

       
使用案例
   

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

   
(1)连接数据源
   

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

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

登录后页面会自动跳转,左侧一栏展示当前数据库所有的Hive表信息
Linkis JDBC是怎么适配Tableau
图2-3 登录后的使用界面
我们来试一下查询表的具体数据,这里使用的是testjohn1表,点击表右侧的按钮即可快速查询。
Linkis JDBC是怎么适配Tableau
图2-4 查询表数据按钮
Linkis JDBC是怎么适配Tableau
图2-5 查询结果
从图2-5可以看出,tableau已经成功提交SQL任务到Linkis执行,并将返回的结果集解析成表展示给用户。我们从dss(DataSphere Studio)的管理台可以查看到该任务的提交和执行情况。在后续linkis1.0的版本中也将可以通过linkis的管理台直接查看任务的提交和执行情况。
Linkis JDBC是怎么适配Tableau
图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文件

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,文件目录层级如下图所示:
Linkis JDBC是怎么适配Tableau
图3-1 适配文件路径

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

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

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

Linkis JDBC是怎么适配Tableau

图3-2 指定运行参数

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

到此,关于“Linkis JDBC是怎么适配Tableau”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/230422.html

(0)
上一篇 2022年1月15日
下一篇 2022年1月15日

相关推荐

发表回复

登录后才能评论