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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索