Azure Synapse Pathway

#はじめに
Azure Synapse Pathway(ASP)はAzure Synapse Analyticsへの移行に役に立つアセスメントツール(DWHのコード翻訳ツール)です。ツール自体は、無償で提供されています。
Azure Synapse Pathway(ASP)はSQL Server Migration Assistant(SSMA)に似ていますが、主に分析データストア用の移行の焦点として、スマートロジックの上に作られています。
Azure Synapse Pathwayを利用することで、既存DWHのスクリプトの変換にかかる時間を短縮でき、データベースエンジニアのコストにも削減できるようになります。
![Synapse Pathway animation_GIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/517a11ad-aefe-5c69-d2a3-5159989b3703.gif)

DWHの移行Projectに携わったことがあれば、新しいデータベーステクノロジを採用するには時間がかかることがあります。
それは、移行計画や移行PoC、そして移行予算に時間がかかってしまいます。
上記の動画図のように、元々のDWHをAzure Synapse Analyticsに移行するために、ETLやELT、またはSQL Code Translationが必要です。
Azure Synapse Pathway(ASP)を使えば、その手間を省くことができるようになります。

特に、運用してきたEnterprise DWH環境にとっては、移行するのに、もっと時間やコストがかかる傾向があります。
おそらくずっと運用してきたEnterprise DWH環境はオンプレミスかプライベートクラウド環境を想定していますが、そのEnterprise DWH環境は長年にわたって、DWHの使命や目的を果たしてきたかもしれませんが、現在のパブリッククラウドの発展によって、徐々に現在の市場ニーズに合わないレガシーシステムになりつつあります。
そのため、MicrosoftはIgnite 2021でAzure Synapse Pathwayを発表されました。既存のEnterprise DWH環境をAzure Synapseに移行できるように推進しています。

#Reference URLs
[Azure Synapse Pathway概要](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/azure-synapse-pathway-overview?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathwayに関する FAQ](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/pathway-faq?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathwayバックグラウンド](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/synapse-pathway-behind-the-scenes?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathwayダウンロード](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/synapse-pathway-download?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathwayを実行する](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/synapse-pathway-assessment?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathway保存と読み込み](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/tutorial-save-load-assessment?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)
[Azure Synapse Pathwayレポート生成](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/report-generation?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)

#Azure Synapse Pathwayとは
Azure Synapse Pathwayは他の分析用のDWHソースからAzure Synapse Analyticsへのスクリプト(テーブル、ストアドプロシージャ、関数、ビューなど) の移行を高速化してくれます。
なぜ、高速化というと、例えば、移行元のDWHには1000個のスクリプトを変換する予定として、Azure Synapse Pathwayを使うと、80%以上の変換率でツール側でやってくれます。
つまり、手動で変換することおは避けられます。そのため、DWHの移行Projectから見ると、全体の工数が減らすこともできるようになります。
Azure Synapse Analyticsに変換する必要があるスクリプトを選択するだけで、変換されたスクリプトが出力されます。とても便利なツールでも言えます。
![synapse-pathway-overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/ea649582-0e95-ee22-e5a6-79e25b35149b.png)

#サポートされデータソース
+ IBM Netezza
+ Microsoft SQL Server
+ Snowflake
+ Amazon Redshift
+ Google BigQuery
+ Teradata

対応するデータソースの詳細に関しては、[Azure Synapse Pathwayに関する FAQ](https://docs.microsoft.com/ja-jp/sql/tools/synapse-pathway/pathway-faq?view=azure-sqldw-latest&WT.mc_id=DT-MVP-5003822)を参考にしてください。

#Azure Synapse Pathwayのアーキテクチャ
![behind-the-scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/81b4260f-7793-5625-e4d5-a564103cfb30.png)
Azure Synapse Pathway(ASP)は、ソースシステムに接続し、データベースオブジェクトに関する詳細を検査します。
評価レポートには、Azure Synapse Analyticsに変換できるデータベース オブジェクトに関する詳細が記録されます。
Azure Synapse Pathway(ASP)を使用すると、ソースデータベースのオブジェクトが自動的に変換され、Azure Synapse AnalyticsでT-SQLコードに最適化されます。
つまり、既存のコードは、Azure Synapse Pathwayによって、行数関係なく、変換されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/9e73bb45-a78a-eeb5-9076-a7a1c640b35c.png)
まず、上記の図のように、ソースシステムがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/8e1525bf-9d1a-9a28-1eba-77c942d04f64.png)
それから、上記の図のように、
Lexerは、字句解析です。つまり、前者のソースシステムのメタデータから、ソースのステートメントを取得し、それを論理トークンに分割してから、セットまたはパーサー規則に対して実行して言語の一貫性を確保します。
Parserは、構文解析、整形、フォーマットをしてくれます。つまり、文字列フィールド内の‎‎SQL‎‎クエリを解析します。クエリを‎‎解析‎‎する場合、プロセッサは‎‎SQL‎‎クエリで定義されたフィールドに基づいてフィールドを生成し、レコードヘッダー属性でCRUD操作、テーブル、およびスキーマ情報を指定します。そして、後続Augmented abstract syntax tree(AST)処理するように、SQL文を整えてくれます。
そもそも、LaxerとParseの関係を理解するために、下記の図をお借りします。図はあくまで参考とします。[Ref URL](https://tomassetti.me/guide-parsing-algorithms-terminology/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/78963b0b-3dd7-a279-44c4-1aac7aecbd23.png) 
上記の図では、数字の足し算ですが、足し算の結果を求めるために、Lexerによって、それぞれの部品（トークン）に分割し、それから、Parserによって、Augmented abstract syntax tree (AST)を作りだして、計算式を決めてから、計算を行います。
SQL文も同様です。下記の図のように、SELECT文を分解して、Augmented abstract syntax tree(AST)処理するように、SQL文を整えてくれます。図はあくまで参考とします。[Ref URL](https://www.waitingforcode.com/apache-spark-sql/writing-custom-optimization-apache-spark-sql-parser/read)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/8fec4a29-ff66-ac39-60d3-41e3e87b7ba3.png)
ソースシステムのSQL用語次第ですが、例えば、Teradataなら、TeradataのSQL用語、SnowflakeならSnowflakeのSQL用語。Teradataの場合、LIKE ANYの書き方はありますが、Azure Synapse Analyticsにはこのような書き方はないため、変換してくれるように、Augmented abstract syntax tree(AST)内のすべてのオブジェクトの共通表現を定義して、ステートメントまたはフラグメント化されたメタデータを決定します。分かりやすく説明すると、つまり、Azure Synapse Pathway(ASP)のコード変換エンジンがソース元のコードをAzure Synapse Analyticsでも認識できるように、整えることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/12e4c780-ebbe-b579-b7c4-3d955fee83c6.png)
その後に、Azure Synapse Analyticsがコード出力できるように、Augmented abstract syntax tree(AST)から、Azure Synapse Symbolic Treeになります。この時点では、Azure Synapse Pathwayの内部で、すでにAzure Synapse Analyticsが読めるように、整えた状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/15b97187-4828-0640-b776-6cd74d36bf11.png)
最後、Azure Synapse AnalyticsのSQL構文を生成します。SQL構文のGeneratorは、Azure Synapse AnalyticsのSQLステートメントを最適化してくれます。例えば、Azure Synapse Analyticsでは、よく使うCTAS(CREATE TABLE AS SELECT)を使うことで、データロードのパフォーマンスの改善にも繋がります。[What is Azure Synapse Analytics CTAS?](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-develop-ctas?WT.mc_id=DT-MVP-5003822)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/34d20771-827f-ac9c-6c33-69d3b830df74.png)
そして、ユーザー側に、分かりやすく変換レポートが出力され、どのぐらいエラーがあったか、どのぐらいコードが変換されたか、実際のプロジェクトの工数の見積計算ネタにもなります。

#Azure Synapse Pathwayインストール条件
Azure Synapse Pathwayを使用するには[.NET Core Desktop Runtime 3.1.11](https://dotnet.microsoft.com/download/dotnet-core/3.1)以降が必要です。

#Azure Synapse Pathwayダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/095d3027-3012-18da-0668-44fe6cf7656f.png)
上記の画像はMicrosoft Ignite 2021で発表された直後のVerです。最新版をダウンロードしてください。
[Download URL](https://www.microsoft.com/en-us/download/details.aspx?id=102787)

#Azure Synapse Pathwayインストール手順
ダウンロードしたMSIファイルを開いて、インストールを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/f5b43d67-76d4-8a95-f8f7-e552c082331b.png)
ライセンス同意にチェックを入れて、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d1a831b0-2ef8-08b7-5f4b-9e6fc7d40498.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/97b1581f-03f9-fe25-4e2a-e534728257da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/bf1121c8-064f-a8fc-e572-42be13df1a41.png)
サイズは小さいので、一般のPCではすぐに終わります。

#Azure Synapse Pathwayの使い方(GUI)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/280ff02a-2171-e6d3-9c05-8a3ba4b1d5e3.png)
このツールはとてもシンプルです。基本的に、InputとOuputの設定だけで、終わります。
まず、変換元のタイプを選びます。それから、InputとOutputのパスを設定します。
ここで、注意ですが、このツールは変換元のデータベースに接続する必要はありません。あらかじめに、SQLステートメントをExportする必要があります。
試しに、SnowflakeのTPCHのSampleDataを使って、[GET_DLL()](https://docs.snowflake.com/ja/sql-reference/functions/get_ddl.html)で、スキーマの定義を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/4940ad14-4361-fbe5-0975-6547a8b7a170.png)

~~~sql
select get_ddl('schema','jssug.AzureSynapsePathway',false);
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/4ace584d-b825-fa61-228d-09e865d33eb3.png)

また、WebUI以外のSnowflakeクライアントツールもあります。例えば、Eclipse UI系の[DBeaver(Javaベース)](https://dbeaver.io/)です。
こちらも、DDL生成することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/17cd1249-9d92-fd03-b406-7170e2b954e8.png)
DDLが生成されたら、Azure Synapse Pathway(ASP)のInput Directoryフォルダに、一つSQLファイルを作っておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/de91f5b6-c74f-0669-6cf1-9ddecaf21f76.png)
それから、変換タイプは「Snowflake」を選択し、コードの変換を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/52728a54-6e89-e483-e7f8-d28cc70b56f3.png)
データ量次第ですが、時間がかかる場合もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/840077b0-5cfe-1051-46a9-f8e728ad7863.png)
そして、変換が終わったら、エラーか警告があるかどうかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/5a6ec29f-88d5-f33b-0290-82a1d4482085.png)
このテストでは、エラーもなく、一発ですべて成功したことが確認できます。
場合によって、ErrorまたはWarningsがある場合、Issuesの枠に情報が表してくれます。
そして、結果を確認しましょう。結果はOutputのフォルダに出力されます。直接Outputフォルダを開くか、View Resultsボタンをクリックして、フォルダにジャンプしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/23940de0-9527-8e4a-5b47-e3b2afd1f2f7.png)
今回は、TableのDDLしかなかったので、Azure Synapse Pathway(ASP)がTablesというフォルダを作ってくれました。もし、Viewがある場合、Viewフォルダも作ってくれます。
tablesフォルダのほかに、results.csvがあります。ここに注意ですが、すべて成功した場合、results.csvは空っぽです。確認しなくてもいいです。その以外の場合、まとめたエラーメッセージと警告が出力されます。Azure Synapse Pathway(ASP)はCsvHelper.dllを読んでいますので、csv形式として、出力されるでしょう。
次は、tablesフォルダを見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/4b70bf20-26f2-6989-6165-835becc901d6.png)
dboスキーマ(サブフォルダ)が作られて、その中に、SnowflakeのスキーマDDLに書かれたCREATE OR REPLACE TABLEの対象をぞれぞれに、SQLファイルを出力されたことが確認できます。
試しに、その中の一つSQLファイル(ORDERS.sql)を開いてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/b5c97ca6-64b7-24f4-59ba-e13a4b5edeff.png)
ここで判明したのは、Azure Synapse Analytics Dedicated SQL Pool用のSQL構文です。Azure Synapse Analytics Dedicated SQL Poolには、CREATE TABLEの際に、テーブル分散方式の指定と、デフォルトであるCLUSTERED COLUMNSTORE INDEXの指定が必要です。※CLUSTERED COLUMNSTORE INDEX以外は、HEAPなども指定可能です。
その部分は、Azure Synapse Pathway(ASP)のTranslationエンジンによって、SQLコードを変換されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/751202bd-d13d-bcf5-e2d4-b19cf6009240.png)
アセスメントを保存する場合、Save Assessmentボタンを押します。
ファイルの拡張子は、aspprojになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/eee07848-2a8f-4531-984f-454b23945f70.png)
保存したaspprojファイルをLoadすることもできます。
最後に、出力したSQLファイルをAzure Synapse Studioか、SSMSで、実行すれば、Azure Synapse Analytics Dedicated SQL Poolに、Snowflakeと同様のTableが作られます。

>もちろん、Azure Synapse Pathway(ASP)を使わずに、Azure Data Factory V2のSnowflakeコネクタを使って移行することも可能です。

#Azure Synapse Pathwayの使い方(CUI)
インストールされますと、インストールパスに、AspCmd.exeファイルができます。バッチ処理にも使えます。

~~~txt
aspcmd.exe --help
~~~
コマンドのパラメータを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d1cba2ca-d97e-4757-91bf-87f2dedb2298.png)

#Azure Synapse Pathwayのまとめ
今回は、他のプロバイダーによって管理されている分析データストアか Azure Synapse Analyticsの移行を加速する最初の例とします。
SSMAのように、アセスメントを行い、SQLコードを変換してくれていることで、移行プロジェクトから見ると必須アイテムであることに違いないです。
今後、ほかのプロバイダーも出てきそうですね。今後のアップデートを楽しみにしています。

この度、ぜひAzure Synapse Pathwayを利用してみたらいかがでしょうか。
Azure Synapse Analytics、またSQL Serverの導入及び相談を承ります。