はじめに
こんにちは、データ推進室マリッジ&ファミリー・自動車・旅行データソリューション部自動車データソリューショングループ(以下、自動車DSG)所属の荒木です。
自動車DSGでは、「カーセンサー」に関わる自動車領域の組織(以下、自動車領域)に対して、レコメンドシステム、データマートやBIツール等を提供し、データマネジメントからデータサイエンスまで幅広くサポートしています。
今回自動車領域の組織で、600人以上のユーザーが利用している Tableau Server を Tableau Cloud に 2025年1月から2025年3月にかけて、移行を行います。
この移行にあたり、移行の準備段階で検討した事項や機能要件・非機能要件の検証に関する取り組みについて紹介します。
Tableau Cloud への移行に関しては、 公式ドキュメント もありますので、そちらも合わせてご参照ください。
本記事は、データ推進室 Advent Calendar 2024 16日目の記事です
背景
自動車領域では、2018年頃から一部のユーザーが Tableau Server を利用し始め、2020年頃から営業担当者向けのワークブック提供を開始しました。
その結果、ユーザー数が増加し、2022年には新規利用ユーザーの接続環境の違いから Tableau Cloud の利用も開始しました。
約2年間、両環境を併用してきましたが、バージョン差によるメンテナンスの負担が年々増しており、Tableau Server のバージョンアップなどのメンテナンス工数も考慮すると、現状の運用を維持するのではなく、すべての資材を Tableau Cloud に移行する決断をしました。
移行にあたって、以下の事項を事前に検討・検証し、環境構築を行いました。
- 権限設計の見直し
- ワークブック/データソースの移行方法
- 機能要件・非機能要件( Tableau Server で実現できていた機能が Tableau Cloud でも同様に利用できるか)の確認
尚、今回の移行元である Tableau Server の バージョンは 2021.3 となります。
※
限定サポート
が2024年9月6日で切れてはいますが、移行する計画だったため、バージョンアップは行いませんでした。
権限設計の見直しについて
現在自動車DSGでは、提供しているワークブックに Tableau グループとユーザー名を掛け合わせた行レベルの権限制御を入れています。
今回の移行に際して、Tableau グループの設計を見直し、行レベルの権限制御を行う計算フィールドの内容を見直しました。
グループ設計AsIs→ToBe
Tableau Server のユーザー数も少なく、同一組織間でのワークブック共有が主な利用用途だったので、AsIsのように所属に合わせてグループ・プロジェクトを作成し、所属しているグループ以外のプロジェクトは閲覧できないようにパーミッションの設定していました。
しかしながら、当初よりもユーザー数も利用頻度も増え、組織外でのワークブック共有も活発になっており、利用用途に合わせて都度プロジェクト設計やパーミッション設計を見直す運用が続いていました。
今後スムーズに運用するために、ToBeのようにデータの公開範囲に基づいたグループの設計に見直すことにしました。
- スタッフ:全てのデータを利用可能
- ※データを利用した業務を行う担当者の分だけ Tableau Server のユーザーを作成しています
- 営業:担当顧客のデータのみ利用可能
上記の整理を行うことによって、行レベルの権限制御を行う計算フィールドは以下の通りすっきりさせることができました。
■AsIs
IF
// 担当者情報からで閲覧できる顧客である場合は、TRUEを返す
CONTAINS([担当者情報], ("|" + USERNAME() + "|")) THEN TRUE
// ワークブックへのアクセス権限を持つが、全ての顧客を見れるわけではない人は、FALSEを返す必要がある
// 経緯:
// 本来はホワイトリストで定義すべきあるが、スタッフのグループが非常に多いので、全部の組織を記載することは現実的ではなかった。
// そこでブラックリスト形式で閲覧できてはいけないグループを指定することとした
ELSEIF ISMEMBEROF("営業1部") THEN FALSE
ELSEIF ISMEMBEROF("営業2部") THEN FALSE
ELSEIF ISMEMBEROF("営業3部") THEN FALSE
// スタッフ組織のメンバー全員に対して、全データ閲覧可能なので、TRUEを返す
ELSE TRUE
END
■ToBe
IF
// 担当者情報からで閲覧できる顧客である場合は、TRUEを返す
CONTAINS([担当者情報], ("|" + USERNAME() + "|")) THEN TRUE
// 担当者情報には営業の名前しかないので、全データを閲覧できる人に対してはTRUEを返す
// 経緯:
// ホワイトリストとして全データを閲覧可能なグルーブを指定する
ELSEIF ISMEMBEROF("スタッフ") THEN TRUE
// 上記のいずれにも該当しない場合は、FALSEを返す
// 経緯:
// グループ設定にミスがある可能性があるので、不要な閲覧を生まないためにもFALSEを設定する
ELSE FALSE
END
あらかじめ、閲覧可能なユーザー情報(当環境はメールアドレス)を格納したマスタを作成し、[担当者情報]としてデータに持たせています。
余談にはなりますが、複数グループのユーザー情報を取得して一括で新しいグループにユーザー情報を追加する際には、以下の手順で行うと素早くグループ反映できました。
Tableau Server のログから既存のグループ情報とユーザー情報を取得します。
■ログ取得(PostgreSQLの場合)
select
*
from
_users as use
left outer join
group_users as gus
on
use.system_user_id = gus.user_id
left outer join
_groups as gro
on
gus.group_id = gro.id
上記で取得したユーザー情報から、必要なグループごとの CSV ファイルを作成します。
※ CSV ファイルにはヘッダー等はつけず、ユーザーネームのみを UTF-8 / LF で記載します。
tabcmd コマンド を利用して、ログイン、グループ作成、グループへの情報を追加します。
tabcmd login -s {Tableau Server の URL}
tabcmd creategroup "作成したいグループ名"
tabcmd addusers "作成したいグループ名" --users "CSV ファイル名"
ワークブックとデータソースの移行方法について
Tableau Server 内には以下のような資材があります。
- 自動車DSG提供
- データソース
- ユーザーが利用しやすいように接続情報を埋め込んだり、カラム等を整備したもの
- ワークブック
- ツールとして多くのユーザーに公開し、自動車DSGがメンテナンスしているもの
- データソース
- ユーザーが作成
- データソース
- 個人作成のローカルExcel等が埋め込まれている場合等もある
- ワークブック
- データソース
この中で自動車DSGとして Tableau Cloud に移行するのは自動車DSGが提供しているもの + ユーザーが作成した資材の一部としました。
自動車DSGが管理しているものは、品質を担保したいので手動で移行対応としました。
ユーザーが作成した資材の一部とは、自動車DSGで管理していないが、今後も必要になるワークブックやデータソースを指し、それらは特定のプロジェクトに移動してもらい、 Tableau Content Migration Tool(以下 TCMT)で移行することにしました。
TCMT を利用して全てを移行してもよかったのですが、以下の理由から TCMT と手動移行の2パターンの移行で対応することにしました。
- すでに Tableau Cloud 上に一定の資材がある
- Tableau Server 上にメンテナンスされていない、利用されていないワークブックも多い
- 多くのワークブックはパブリッシュされたデータソースに繋がっており、データソースは既に Tableau Cloud にもあるので、TCMT で移行しても再度データソースの置換を行う必要がある
- バージョン差分により体裁が崩れるので、基本的には手直しが必要になる
- 自動車DSGが管理しているものは、品質を担保したい
TCMT と手動移行を併用することで、ユーザーの事前準備は必要になりますが、必要な資材の棚卸しにも繋がりました。
手動移行を行う際に、データソースに関しては、パブリッシュ先を Tableau Server から Tableau Cloud に変更します。
ワークブックに関しては、Tableau Cloud にパブリッシュされたデータソースを追加し、参照の置換を行い、Tableau Cloud にパブリッシュします。
機能要件・非機能要件の検証について
検証事項
移行にあたり、Tableau Server と Tableau Cloud で機能差分がないかを、改めて確認しました。
確認点は以下の項目です。
- 機能要件
- Tableau Server 上でできることが Tableau Cloud でも再現可能なこと
- 開発に関する基本的な動作
- ワークブックのパブリッシュ / 保存(ローカル / ブラウザ上ともに)
- データソースのパブリッシュ / 保存(ローカル / ブラウザ上ともに)
- 提供ツール
- 基本的な動作
- フィルター / アクション
- 権限制御
- 基本的な動作
- 開発に関する基本的な動作
- Tableau Server 上でできることが Tableau Cloud でも再現可能なこと
- 非機能要件
- Tableau Server から Tableau Cloud に移行した際に、パフォーマンス劣化していないこと
- ユーザー数が3倍以上に増えるので各ワークブックの性能調査
- ワークブックの読み込み速度(ビューの描画)
- データソース抽出の所要時間
- Tableau Server から Tableau Cloud に移行した際に、パフォーマンス劣化していないこと
この中で今回はワークブックの性能調査について紹介します。
まずは Tableau Server と Tableau Cloud のスペックにどれだけ差分があるかを、洗い出しました。
項目 | Tableau Server | Tableau Cloud |
---|---|---|
バージョン | 2021.3 | 2024.3 ※2024年12月現在 |
ディスク容量 | 200 GB | 1 TB |
ノード数 | 1インスタンス | - |
バックグラウンダープロセス | 3個のジョブを並行実行できる ※1データソースの抽出可能時間は2時間と設定 |
Creator の ライセンス数 × 8時間 利用可能 この環境では24時間 25個並列実行できる ※1データソースの抽出可能時間は最大2時間 |
スペック上は Tableau Cloud が明らかに優れていることがわかりました。
検証中に発覚した問題点
両環境にあるワークブックに関してはパブリッシュした時点で性能差分がないかを確認していましたが、移行を機に再度性能調査を行いました。
調査の過程で、1つのワークブックに問題があることがわかりました。
- 問題のワークブック
- ダッシュボード数:55
- ワークシート数:140
- 問題点
- Cloud 版の方が、Server 版よりも読み込み速度が遅く、全てのダッシュボードをppt形式でダウンロードしようとすると、Server 版では5分程度だが、Cloud 版では20分以上かかってしまう。
- この現象は再度性能調査を始めた2024年8月頃から発生し、それ以前は発生していない。
このワークブックは閲覧ユーザー数が1番多いワークブックであり、現行の Tableau Cloud の性能のままだと業務上問題があるので移行を断念せざるを得ない状況でした。
どこに時間が掛かっているのかを確認するために、ブラウザのデベロッパーツールのネットワークログからpptのダウンロードログを探し、
1ワークシートずつパブリッシュしなおし、pptのダウンロード時間を Server 版と Cloud 版で比べました。
この作業を行い、特定のワークシートで速度が著しく遅くなっていることがわかりました。
(データは実際の値です。画像の比較結果は一部のみ掲載しています。)
原因になりそうなものを考えてみる
他のワークブックでも同様のテストを行ったのですが、他のワークブックでは Tableau Cloud の方が処理が早く、どこに原因があるのか不明でした。
Salesforce 社のサポートにも問い合わせてみたのですが、明確な回答が得られませんでした。
そこで他のワークブックでは行なっていない実装をしていないか? を調査しました。
思い当たった点としては以下の2点でした。
- Tableau Cloud にパブリッシュする際に、 データ型のエラー が発生する箇所があり、そのために一部のカラムを整数→小数に変更していた
- 1つのワークシートの中で、別々の条件を動的に設定し、2つのセットを使っていた
1点目について
データを読み込んでいる先の Big Query の型と Tableau データソースの型に差分がある状態が遅い原因では?と考えました。
そこで、Big Query の型に Tableau データソースの型を合わせるように再度データソースをパブリッシュし直して、 ワークブックの中身もエラーが出ないように変更してみましたが、
pptのダウンロード速度は遅いままでした。
2点目について
速度が遅くなっているワークシートでは、1つのワークシートの中で2つのセットを使っていました。
理由は以下のように別々の条件を動的に設定し、比較するグラフを作成するためです。
ワークシートは以下のイメージとなります。
セット自体は他のワークブックでも利用していたのですが、それらのワークブックではワークシート内で1つのセットしか使っておらず、Server 版と Cloud 版のダウンロード速度は変わりませんでした。
そのため、1つのワークシート内で2つのセットを使うことに問題があるのではないかと考え、計算方法を以下のように変更してみることにしました。
■AsIs
■オーダー数_条件A
{ FIXED [年月]:
SUM(IIF([セット:条件A], [オーダー数], 0))
}
■ オーダー数_条件B
SUM(IIF([セット:条件B], [オーダー数], 0))
[セット:条件A]は、条件Aを選んで対象のボタンを押下すると、[セット:条件A]に対象のデータがセットされるように設定していました。
[セット:条件B]は、条件Aを選んで対象のボタンを押下することで、[セット:条件B]に条件Aで選んだ対象のデータ以外がセットに設定される(=セットから削除される)ように設定していました。
この設定を入れて、対象のワークシートで条件Bに該当するフィルターをかけることで、条件Bから条件Aの被っている部分を抜いた値を出すことができます。
■ToBe
■オーダー数_条件A
{ FIXED [年月]:SUM(
IIF(
[セット:条件A]
, [オーダー数]
, 0
)
)}
■ 新オーダー数_条件B
フィルターに[セット:条件A]のOut(セットに含まれていないデータ)を追加
※フィルターには条件Bで絞った条件が含まれています
{ INCLUDE [年月]: SUM([オーダー数])}
上記のように、条件Bの値を取得する計算フィールドの変更と、[セット:条件A]のOutフィルターの追加により、同じ値を取得することができます。
ワークシート上では以下のように設定しています。
計算フィールドの変更とフィルターの追加を試した結果、
今回検証した全てのワークシートをダウンロードするのにかかっていた時間を 120.1秒 から 10.7秒 (約91%減) まで短縮することができました。
調査中に気づいたのですが、 Tableauの公式ドキュメント をよく読むと、セットを計算フィールドに入れることはアンチパターンであるという記載がありました。
ヒント 4: 計算にセットを使用しない 計算にセットを使用している場合、それを等価計算以外の別の要素に置き換えてください。
解決策 2 セットがさらに複雑な場合、セットに含まれるすべての要素を ‘IN’ などの指定した値または属性にマッピングするグループの作成を検討し、 その後、その値/属性を確認するように計算を変更してください。
今回のように2パターンの条件を選んで数値を比較したい場合は多いと思うので、ToBeのパターンを参考にいただければ幸いです!
おわりに
今回のように600人以上のユーザーが利用している Tableau Server を Tableau Cloud に移行する際には考慮しなければいけない点がたくさんあります。
Tableau Cloud で思ったように性能が出なくなってしまった…となった場合でも、
現状の実装が本当にベストなのか? を疑って試行錯誤してみると共に、もう一度公式ドキュメントを読んでみることをオススメします!
また、事前の準備は万端にしているつもりではありますが、実際の移行は来年から始まるので、
障害を起こすことなく移行できるように、気を引き締めて移行作業を行いたいと思います。
クラウドエンジニア、アナリティクスエンジニア
荒木彩也華
アーキテクトからアナリティクスまで担当しています。最近ゴルフにハマっています。