#データロード時のファイルは分割した方がいいか?分割しない方がいいか?
Azure Synapse Analytics SQLプールでCSVなどのファイルをロードする場合、ファイルは分割した方が高速にロードできるのか、分割しない方が高速にロードできるのか?
これは結論から言いますと、**「ロードするファイルが圧縮されているのか、圧縮されていないかによって異なる」**という事のようです。
このポイントについて実際にAzure Synapse Analytics SQLプールで検証を行ってみました。
#検証内容
TPCHの「lineitem」データをAzure DataLakeストレージに格納し、DataLakeストレージからSynapse AnalyticsへPolybaseを使ってロードしました。
ロードする件数は600,037,902件となります。
※ロード時のリソースクラスは「xlargerc」に指定。
以下4つのパターンで様々なDWUcにてロード処理を確認しました。
ファイル分割数 | 1ファイルあたりの容量 | 圧縮あり | |
---|---|---|---|
パターン1 | 60 | 約1.24GB | なし |
パターン2 | 60 | 約375.45MB | gzip圧縮 |
パターン3 | 1 | 約74.11GB | なし |
パターン4 | 1 | 約22.05GB | gzip圧縮 |
パターン1はパターン3のファイルを60分割したものになります。
また、パターン2、パターン4はそれぞれパターン1、パターン3のデータをgzip圧縮したものになります。
#検証結果
今回は4つのcDWUにて検証を行いましたが結果は以下の通りです。
パターン1(60分割、非圧縮) | パターン2(60分割、gzip圧縮) | パターン3(非分割、非圧縮) | パターン4(非分割、gzip圧縮) | |
---|---|---|---|---|
DW100c | 36分59秒 | 39分11秒 | 31分56秒 | 51分01秒 |
DW500c | 6分30秒 | 5分39秒 | 6分16秒 | 41分46秒 |
DW1000c | 3分44秒 | 3分43秒 | 4分28秒 | 45分57秒 |
DW2000c | 2分7秒 | 1分42秒 | 2分10秒 | 44分53秒 |
#検証結果からの考察
今回の検証結果からわかることは非圧縮の場合は、ファイルは分割していようが、分割していまいがロードの時間に大差がないという事です。
よって、非圧縮の時、ファイルが分割されていない場合には、内部で勝手にファイルが分割されパラレルロードしてくれているようです。
一方でファイルが圧縮(gzip)されている場合は、明示的にファイルを分割しなければパラレルロードされないようです。
今回の検証では圧縮されたファイルは、すべてのDWUcでAzure Synapse Analytics SQLプールの最小スペックである、DW100c相当のパフォーマンスしか出ませんでした。
なので、結論は以下の通りです。
##非圧縮のファイルのPolybaseによるロード
ファイルの分割はしてもしなくてもどちらでも性能に大差なし。
DWUcの値を大きくすれば、その恩恵を受けることが可能。
##圧縮したファイルのPolybaseによるロード
ファイルの分割を推奨。
ファイルを分割しなかった場合、DWUcを大きくしてもその恩恵を受けることが出来ず、DW100cのパフォーマンスとなる。
#最後に
今回の結果からは、非圧縮ファイルと圧縮ファイルでの動きの違いが確認出来ました。
結果だけでみると、非圧縮ファイルの方が、分割などの処理を検討する必要がないのでいいように思います。
ただ、今回の検証で着目したのはあくまで、__DataLakeストレージからSynapse Analyticsへのロード処理の部分__です。
一方で、システム全体のワークロードから考えると、非圧縮ファイルの場合以下のようなステップとなると思います。
①非圧縮ファイルのDataLakeストレージへのアップロード
②DataLakeストレージからAzure Synapse Analyticsへのロード
また、圧縮ファイルの場合のステップは以下の通りです。
⓪ファイルの圧縮
①非圧縮ファイルのDataLakeストレージへのアップロード
②DataLakeストレージからAzure Synapse Analyticsへのロード
ファイルを圧縮するのか、非圧縮のままでいいのかは上記の⓪~②までの全体のワークロードを鑑みて決定する必要がありそうです。
そして、圧縮ファイルを取り込むとなった場合には、必ず分割を検討した方が良さそうです。
ちなみにファイルを60に分割したのは、Azure Synapse Analytics SQLプールの__ディストリビューションの数が60__である為です。
一方で今回の検証から言えることは、ファイルの分割数は60ではなく、300に分割した方が理想的かもしれません。
これはDW6000c以上のDWUcになった場合に上手くリソースを使いきれない可能性があるためです。
(こんなに大きなDWUcで動かすことはめったにないので、そこまで気にする必要が無いかもしれませんが。。。)