先说说需求背景:
Tableau支持提取数据库数据到服务器生成hpyer文件,基于hyper文件的查询比数据库快很多,所以对数据量比较大的自助分析来说,是一个很实用的功能。同时,数据源也支持定时刷新。由于数据仓库或者数据中台的跑批一般都是晚间进行,所以大多数情况下定时刷新都是可以满足需求。

也是基于上述原因,我们就没有考虑用调度任务刷新数据源了。这个事就这么搁置了。但是最近由于系统频繁调整,导致多次跑批都未能在六点之前完成,导致数据提取到了旧的数据。同时增量刷新还会导致数据翻倍,于是这个问题就提上来日程。
再说说解题思路:
首先,这个需求肯定是一个比较普遍的需求,跟随调度任务来刷新数据才是最合理的。笔者以前用过商业版kylin——Kyligence ,当时也有类似的需求,需要在Hive数仓跑完以后通过调度任务刷新kylin模型。当时就是找Kyligence 官方要了文档,然后根据文档开发了脚本。具体可以参考官方文档写了一个shell脚本,详见《分享最近写的一个调用kylin重新构建模型的脚本》。这次遇到相同的情况,首先也是找tableau官方:

结果,这次官方不仅没解决我的问题,还给指了一条比较偏的路。奈何英语水平太差,看不懂官方文档。于是求助百度。
在搜索“Tableau python”关键字后,功夫不负有心人,找到一篇文章《
通过Python刷新Tableau数据提取》(链接:https://blog.csdn.net/qq_33246702/article/details/104297938)。

根据这篇文章的提醒,我发现数据源的刷新时通过命令行来实现的,由于我们的调度环境和Tableau安装在不同的服务器,加之二者可以通过ssh打通,所以我准备用ssh+tabcmd命令来实现这个功能。
第三步,到tableau官方搜索“tabcmd refreshextracts”命令,于是找到了下面的资料:
refreshextracts workbook-name 或 datasource-name对属于指定工作簿或数据源的数据提取执行完全或增量刷新。此命令使用服务器上显示的工作簿或数据源的名称,而不使用发布时的文件名。仅允许管理员或者工作簿或数据源的所有者执行此操作。示例tabcmd refreshextracts --datasource sales_dstabcmd refreshextracts --project "Sales External" --datasource sales_dstabcmd refreshextracts --workbook "My Workbook"tabcmd refreshextracts --url SalesAnalysis选项--incremental运行增量刷新操作。--synchronous将完全刷新操作添加至后台程序进程所使用的队列,以在后台程序进程可用时立即运行。如果后台程序进程可用,则立即运行此操作。刷新操作会出现在“后台任务”报告中。在同步刷新期间,tabcmd 在刷新操作进行时保持实时连接到服务器,并且每秒钟进行一次轮询,直到后台作业完成为止。--workbook包含要刷新的数据提取的工作簿的名称。如果工作簿名称中含有空格,请将名称放入引号内。--datasource包含要刷新的数据提取的数据源的名称。--project与 --workbook 或 --datasource 结合使用可确定 Default 以外的项目中的工作簿或数据源。如果未指定,则使用“Default”项目。使用 tabcmd,您可以仅指定项目分层结构中的顶层项目。若要自动执行想要对父项目内的项目执行的任务,请使用等效的 Tableau REST API 调用。--url显示在 URL 中的工作簿的名称。发布为“Sales Analysis”工作簿的 URL 名称为“SalesAnalysis”。
上文介绍了tabcmd refreshextracts的用法,但是根据博文的提醒,操作之前需要先登录。于是又找到了下面的内容,提示怎么登录。

有了这些知识储备,接下来就可以干活了。测试了三把就成功了。

最后附上答案:
第一步,在调度平台服务器上生成ssh密钥。操作如下:
先看本地是否有密钥,如果有,则不用生成,否则会影响到以前打通的设备。ls ~/.ssh/id_rsa.pub没有则用 ssh-key-gen 在本地主机上创建公钥和密钥ssh-keygen -t rsa一路回车

第二步,把调度平台生成的密钥copy到tableau服务器。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.5.11

至此,ssh登录验证通过。
第三步,由于有多个任务需要调用刷新操作,因此我觉得生成一个通用脚本,一来方便隐藏tableau密码,二来提高程序复用性。
vi refresh_tableau_datasource.sh#!/bin/bash## @auther wcb## 程序功能:主动请求刷新tableau自主分析数据源# 使用方式# eg: ./refresh_tableau_datasource.sh xx自助分析数据源 [incr/all]set -e;if [ ! -n "$2" ]; thenecho "Invalid arguments. Usage: sh refresh_tableau_datasource.sh xx自助分析数据源 [incr/all]"exit -1elsedatasource=$1;refreshtype=$2;fiif [ $refreshtype = "incr" ]; thenssh tableau@192.168.5.11 "tabcmd refreshextracts --datasource ${datasource} --project '自助分析-提取数据源' --incremental --synchronous -s http://127.0.0.1 -u admin -p xxx"elif [ $syscode = "all" ]; thenssh tableau@192.168.5.11 "tabcmd refreshextracts --datasource ${datasource} --project '自助分析-提取数据源' --synchronous -s http://127.0.0.1 -u admin -p xxx"elseecho "第一个参数不正确。刷新方式仅支持 incr--增量/all 全量"fi
执行结果如下:

眼尖的同学可以看得出,我新加了一个参数“--synchronous”可以等待执行完成,返回执行结果。


《数据中台研习社》微信群,请添:laowang5244,备注【进群】
🧐分享、点赞、在看,给个三连击呗!👇




