暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数仓实战|Tableau数据源提取后台请求刷新

数据中台研习社 2021-09-18
2353

先说说需求背景

      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_ds
    tabcmd refreshextracts --project "Sales External" --datasource sales_ds
    tabcmd 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" ]; then
          echo "Invalid arguments. Usage: sh refresh_tableau_datasource.sh xx自助分析数据源 [incr/all]"
          exit -1
          else
          datasource=$1;
          refreshtype=$2;
          fi


          if [ $refreshtype = "incr" ]; then


          ssh 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" ]; then


          ssh tableau@192.168.5.11 "tabcmd refreshextracts --datasource ${datasource} --project '自助分析-提取数据源' --synchronous -s http://127.0.0.1 -u admin -p xxx"


          else
          echo "第一个参数不正确。刷新方式仅支持 incr--增量/all 全量"


          fi

              执行结果如下:

              

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







          数据中台研习社》微信群,请添:laowang5244,备注【进群】


                                                                   🧐分享、点赞、在看,给个三连击呗!👇


          文章转载自数据中台研习社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论