OpenHack Modern Data Warehouse(2021年11月24日～26日)


2021/11/24～26にかけて開催された Microsoft 主催のイベント OpenHackに参加してきましたのでレポートします。今回は「Modern Data Warehouse」のOpenHackです。
OpenHackの課題そのものは、全世界で再利用されるので、詳細に触れられないのですが、公式ドキュメントでオープンになっている範囲で書こうと思います。
(運営の方々、ここは触れないほうがいいというところがありましたら、ご指摘ください。)

#OpenHack Modern Data Warehouse の特徴

OpenHack Modern Data Warehouse の特徴を箇条書きにします。

* ３日間フルで参加する。
* オンライン開催でTeamsで参加する。コロナ前は現地開催だった模様。
* Azure Synapse AnalyticsやAzure Databricksをさわり倒せる
  * OpenHackでは、Azureのサービス利用料はかからない。
* Microsoft のコーチが３日間つきっきりでアドバイスくれる
* ミニセッションでAzure Data Lake Storage や Azure Synapse Analyticsについて学べる
* Hackを一定のレベルまで達成すると、LinkedInで使えるバッチがもらえる！
  * 私の取得したバッチはこちら。https://www.credly.com/users/chinatsu-nabeshima/badges

**Azure Synapse AnalyticsやAzure Databricksをさわり倒せる** は具体的にいうと次の通りです。

* Openに募った参加者を5,6人で１チームに分けられる
* 架空の会社のデータが提供される
* チームごとにデータ分析基盤を選定
* データを取り込み・加工・可視化する

また **データを取り込み・加工・可視化する** ですが、手を動かしながらゲーミング感覚で進められます。
１面をクリアすると２面が、２面をクリアすると３面・・・といった塩梅で、クリアするごとにむずかしくなっていきます。
全部で10以上(13?うる覚え...)の面があるらしいんですが、どのチームもクリアできたのは４面までぐらいだったと思います。

私の参加したチームではデータ分析基盤にAzure Synapse Analytics(以下、Synapse)を選定しました。
Synapseを触るのが初めてのメンバーも多い状況でしたが、コーチが適宜ヒントをくれたり、ドキュメントを教えてくれますので、学習しながら進める感じになります。

# 学習したこと 
ここからは、３日間で学習したことで、記憶に残っていることを走り書きします。サービスや機能を体系的に説明したものではないので悪しからず。

## Azure Data Lake Storage Gen2
* コストが安いストレージ
* Azure Storage を作る時に、オプションで階層型名前空間が使えるようにすると Azure Data Lake Storage Gen2になる
* 階層型名前空間の特徴
    * 階層ごとにフォルダが作成できる。
    * ディレクトリの移動、名前変更、削除などの操作のコストが安い。
        * このオプションを入れない場合は、「/」を使って模倣しているだけなので、ディレクトリ名を変更すると配下のファイルすべて個別に変更がかかる
* 権限はAzure Storage Account自体のアクセス制御(IAM)と、コンテナやフォルダのACLの管理を両方確認する。
* 設計は要件を確認しながら慎重に進める必要がある。メダリオンアーキテクチャごとにフォルダ分けたり、ネットワーク環境毎にフォルダ分けたり。

## Azure Synapse Analytics 
データ分析基盤でDataFactory、Apache Spark、DataWarehouseが１つになったサービス。

* バッチでデータを取り込んで、データ処理して、データストアに格納するところまで１つのサービス上で完結できる。
* 処理も分散、データベースも分散。大量のデータを高速に処理するのに向いている。
* Azure Synapse Analytics は ブラウザ上で動く Synapse Studio で開発をすすめる。
* オンプレのデータもパブリックのデータもコピーできる。別のクラウドサービスからのコピーもできる。

## CI/CD
Synapseは Gitでバージョン管理できます。

* gitレポジトリは github でも Azure DevOpsでもOK。
* 開発、テスト、本番と３つのSynapseの環境を用意すると、CI/CDできる。
    * 開発が終わったものを自動でテスト環境に反映したり、テストが終わったものを、本番環境に反映したりする。
* 複数のアカウントが同じソースで開発を進めると、競合する可能性が高いので、別で開発したほうがいい。
  * DataFactoryでは Datasetも共有してるから名前を変えるときは要注意。
* マージはSynapseで出来ないので、git上でマージすることになる。

## DataFactory
データ取込、加工をするための機能です。

* データコピーアクティビティでサポートされているデータストアはめっちゃある。CSV、Parquet、データベース、CosmosDB、オンプレのファイル・・・・
  * (https://docs.microsoft.com/ja-jp/azure/data-factory/copy-activity-overview)
  *  ソースはわかるけど、「シンク」が変換先という意味なのが日本人にはなかな慣れない。
  *  先頭行を列名に使うオプションを入れるのを忘れないように。
  *  Foreach では @item で 現在の値を取得できる。加工して値を作る時によく使う。  
* SSISを使ってた人なら、使い方が分かればすぐ慣れる。
  * SSISと違うことで気づいたのは、アクティビティが無効化できない。
* データフローアクティビティでデータ変換を行う。
  * ウィンドウ変換でRank付けなどができる。
  * チューニング。なるべくシンプルに作る。分散処理で何度も派生列アクティビティをつなげるなら、１つのアクティビティの中で派生列作るほうがいい。
* オンプレや別のクラウドサービスなど、ネットワークが別の環境からデータをコピーするときは Selfhosted IRをインストール必要がある。
  * ネットワーク環境毎に１つの Selfhosted IR があればよい。
  * Selfhosted IR からの変換では、サーバ側にJREをインストールしないとParquetに変換できない。サポートされているデータはドキュメント参照。
  * Selfhosted IR はWindows だけサポート。Linuxの環境の場合、同じネットワーク環境に１台Windowsの仮想マシンを立てる必要がある。

## 専用(Dedicated) SQL プール
データウェアハウスです。

* 分散データベースなので、ノードがたくさんある。コントロールノードの下に、複数のコンピュートノードがぶら下がる。
* DWU100cからDWU30000cまで処理能力がある。DWU100CはコンピュートノードとしてSQL Server 1台相当と考える。DWU600Cなら６台のコンピュートノード。
* テーブルを定義するときは、分散戦略を考えなければならない。
    * ラウンドロビン、ハッシュ分散、レプリケート
    * マスターテーブルはレプリケートにする。すべてのコンピュートノードにコピーされるから、処理が高速になる。
* テーブルを定義する時のインデックスのつけ方は４種類ある。
    * Clustered Columnstore Index、 Clustered (Rowstore) Index、 Heap、 Nonclustered Index がある。
    * マスターテーブルはHeapにする。
    *  Clustered Columnstore Indexは6,000 万行を超えて初めて圧縮されるので、6,000万行以下ならHeapでOK。   
* SSMSからもテーブル作成できるが、GUIに対応していない。CREATE文をガリガリ書こう。
    * 接続情報はSynapseのワークスペースを作成した時に作ったアカウント

# 最後に
余りに多くのことを３日間で学んだので、抜けもかなりあります。
何言っているかわからない方は今後もOpenHack開催予定があるようなので、参加をぜひおすすめします。
コーチの皆さんありがとうございました！


３日間でめっちゃ頭疲れた…