投稿日
AWS Glueをいつ採用するか考える
もくじ
AWS Glue Studioコーディングガイド
はじめに
【用語】
- 「ジョブ」:GUI上で”ジョブ”と表示されているもの
- 「ノード」:AWS Glueのジョブ内で組み合わせる1つの四角形(処理)のこと(Source/Action/Targetがある)
テーブル作成時
CSVファイル用のテーブルを作成する場合
CSVファイルにヘッダ行が含まれる場合、ヘッダ行がデータとして扱われないように以下のオプションを指定してください。
- まずテーブルを作成します。(テーブル作成時にオプションを指定できません。。)
- テーブルの詳細を開き「Edit table」を押下する。
- Table propertiesに以下を設定する。
- Key: skip.header.line.count
- Value: 1
Amazon QuickSightで読み込むテーブルを作成する場合
(パーティションを作成する場合)Amazon QuickSightから増分取り込みができるように、Partition列を設定してください。
(Partitionを設定しないと、Amazon QuickSightは毎回全量データを取り込み差分確認してしまい、時を追うごとにロードするデータ量=課金が増えていきます。)
- 名前:target_date
- 型:Date
サンプルデータ作成時
CSVファイルを準備するときは、文字コードは「UTF-8」で「BOM無し」で作成してください。
文字コードの確認・変更方法
サクラエディタでCSVファイルを開き、文字コードを確認してください
もし「BOM付き」などと出ていたらダメなので、文字コードをBOM無しのUTF-8に変更してください。
CSVファイルの準備にExcelは絶対に使用しないでください
ExcelがデフォルトでCSVを保存する際の文字コードは「Shift JIS」です。また、Excelで文字コードをUTF-8で指定してもBOMが付いてしまう事例がありました。なんとかしてExcelで保存する方法を考えるのではなく始めからBOMの有り無しを指定できるテキストエディタ(サクラエディタ・VS Codeなど)を使用してください。(Windows標準のメモ帳も避けてください。デフォルトでBOMを付けることがあるため)
ジョブ作成時
- ジョブ名は後から編集できません。ジョブ名には確定するまで見分け易い適当な名前を付けておき、名前が決まってから「ジョブをコピー」して名前を付け直してください。
- ジョブを作成後、まず始めにJob detailsで以下を設定してください。(開発中のみ)
- Requested number of workers: 2
- 理由:デフォルトの10だと、Runするたびに課金単位(DPU)×10の課金が発生しますが実装中はオーバースペックなので最小値である2DPUでRunするように設定してください。
- Job bookmark: Disable
- 理由:「一度処理したSourceファイルをbookmarkする」=「次回Runで無視する」ので、何度も同じSourceファイルでRunする開発中はDisableにしないと0件処理になってしまいます。
- Number of retries: 0
- 理由:開発中はRunがfailするのは当たり前なので不要なリトライをしないように設定してください。(ログが汚れ、課金もリトライした回数分発生するため)
- Job timeout: 15
- 理由:100件程度のサンプルデータなら15分以上かかることはないので、開発中に無駄にRunの結果を待ってしまうことを防ぎます(timeoutが発生するまでの時間にも課金が発生します)
- Requested number of workers: 2
ノード作成時
Source作成時
Source: Amazon S3 でも Source: AWS Glue Data Catalog でも同じ設定が可能です。
特に事情がない場合は Source: AWS Glue Data Catalog を使用してください。(GUI上でカタログを使っていることが明確なため。)
既に作ってあるジョブの場合、Source: Amazon S3のノードを選択し、Node properties>Node typeをAWS Glue Data Catalogに変えて、カタログを選択し直してください。
Target作成時
Target: Amazon S3 ではAmazon S3バケット名を指定する必要がありますが開発・本番のAWSアカウントでバケット名が異なるため、 Target: Amazon S3をやめて Target: Amazon Glue Data Catalog にすることにしました。デメリットとして「gzip圧縮できなくなる」が挙げられますが、本案件で一度に処理するファイルが高々数MBのため、トレードオフで享受できる利益としては薄いと判断します。
Action: Custom Transform 使用時
以下のノードを使用した際に、次の処理をする前に必ず Action: Select From Collection ノードを作成して列情報を固定する必要があります。
(参考: https://docs.aws.amazon.com/glue/latest/ug/transforms-selectfromcollection-overview.html )
- Action: Custom Transform (Pythonの任意のコードを実装するノード)
- Action: Split Dataset By Fields
Action: Select From Collection
ノード自体には業務的な意味はない(処理を行わない)ため、このノードは 確定処理(前ノード名) という名前で統一して設定してください。
Actionノード全般
- ノード名には日本語を付けることができます。見切れ易いので端的な処理名を心掛けて命名してください。
- 縦に長くなりすぎないように、Custom Codeでできることは1箇所にまとめて、ソースコードコメントに処理内容を記載してください。
- Action: Custom Transform のNode parentsが1つの場合は、特別な名前を付ける意味はないので df = dfc.select(list(dfc.keys())[0]).toDF() などとシンプルな名前を付けてください。本PJでは特別な名前を付けて可読性が上がる場合を除き、 df でお願いします。
- Action: Change Schema(Apply Mapping) ノードでは列のDropもできるので、 Action: Drop Fields を繋げて使用しないでください。