データアナリティクス事業本部の鈴木です。
AWS Glue Data Quality(プレビュー) をGlueのコンソールから試してみました。データ分析基盤や機械学習システムで非常に重要なデータ品質についてGlueの機能を使って非常に簡単にチェックすることができる機能です。
以前の記事でre:Invent2022のAWS Glue Data Qualityの紹介セッションである『[NEW] Monitor & manage data quality in your data lake with AWS Glue』を紹介しましたが、このセッションで中心に語られたようなGlueのコンソールの操作を実際に試せていなかったので、実際に触ってみました。
なお、Glue Stuioからの利用を例にした紹介は以下の記事で取り上げられています。
実際動かしてみたところ、セッション動画でみた通り、非常に簡単で使いやすく驚きました。IAMロールの準備で少し試行錯誤したので、これから触ってみたい方向けに、今回作ってみたIAMロールも紹介しつつ、この機能についてご紹介します。
AWS Glue Data Qualityについて
AWS Glueのネイティブなデータ品質の管理機能です。AWSの開発したOSSであるDeequによるデータ品質チェックを、AWS Glueのサーバレスかつマネージドな環境上で非常に簡単に実行できる機能となります。
AWS Glueコンソールからは個別のテーブルの画面から利用でき、誰でも簡単に品質ルールが作成できるDQDL(Data Quality Definition Language)という独自の言語でルールを定義し、品質チェックが実行できます。
やってみる
S3バケットに格納したデータに対して、AWS Glue Data Qualityによる品質チェックを実行する操作を試してみたので、ご紹介します。
1. データの準備
今回は下記リンクにて公開されている、UCI Machine Learning RepositoryのIris Data Setを使用しました。
- https://archive.ics.uci.edu/ml/datasets/iris
データをダウンロードし、iris.data
をS3バケットにアップロードしておきます。
以下のように、動作検証に使っていいデータベースに、iris_quality_check
テーブルを作成しました。データを置いたS3バケット名
とデータを置いたパス
はデータを置いた場所に合わせて変えておきます。
CREATE EXTERNAL TABLE IF NOT EXISTS iris_quality_check (
`sepal_length` float,
`sepal_width` float,
`petal_length` float,
`petal_width` float,
`class` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://データを置いたS3バケット名/データを置いたパス'
TBLPROPERTIES (
'classification'='csv',
'columnsOrdered'='false',
'compressionType'='none',
'delimiter'=',')
このようにデータの検索ができるようにしておきました。
2. IAMロールの準備
AWS Glue Data Qualityを実行する際に、コンピューティングリソースが稼働するときは以下の2パターンです。
- ルールセットの生成:データを元にDQDLで記述されたルールセットを生成する。
- 品質チェックの実行:テーブルのデータに対して品質チェックを実行する。
必要なIAMロールの権限は以下の開発者ドキュメントに記載がありますが、各々に必要な権限が異なります。
今回は以下のように2種類のIAMロールを作成できるようにCloudFormationテンプレートを用意しました。このテンプレートをCloudFormationからデプロイすることで、実行に必要な2つのIAMロールを作成することが可能です。
ポイントとしては、ドキュメントにyaml形式で記載されている定義は共通で必要なものだけなので、それに加えてS3バケットなど必要なリソースへのアクセスを状況に合わせて追加することです。今回は試行錯誤しつつできるだけ権限が狭くなるように定義してみましたが、より厳密にしたい方は適宜修正して頂ければと思います。
データのあるS3バケット名・テーブル名とそのデータベース名についてはパラメータとして渡せるようになっているので、検証する環境に合うものを入力してください。
AWSTemplateFormatVersion: "2010-09-09"
Description: Creating Role for Glue Data Quality
Parameters:
S3BucketName:
Description: Backet Name for Target Data.
Type: String
GlueDatabaseName:
Description: Glue Database for Target Data.
Type: String
GlueTableName:
Description: Glue Table for Target Data.
Type: String
Resources:
# Permissions to get recommended data quality rules
IAMRoleForRecommendRules:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: glue.amazonaws.com
Action: "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: GlueDataQualityPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: [
"glue:GetDataQualityRuleRecommendationRun",
"glue:PublishDataQuality",
"glue:CreateDataQualityRuleset"
]
Resource: [
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:dataQualityRuleset/*"
]
- Effect: Allow
Action:
- "s3:GetObject"
Resource: [
"arn:aws:s3:::aws-glue-*"
]
- Effect: "Allow"
Action: [
"glue:GetTable",
"glue:GetPartitions"
]
Resource: [
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog",
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${GlueDatabaseName}",
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${GlueDatabaseName}/${GlueTableName}"
]
- Effect: Allow
Action: [
"s3:ListBucket",
"s3:GetObject"
]
Resource: [
!Sub "arn:aws:s3:::${S3BucketName}",
!Sub "arn:aws:s3:::${S3BucketName}/*"
]
# Permissions to run a data quality task
IAMRoleForRunDataQuality:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: glue.amazonaws.com
Action: "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: GlueDataQualityPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
# glue:GetDataQualityRulesetは広めにつけてもよいと思ったので、ほかのGlueへのActionとまとめた。
Action: [
"glue:GetDataQualityRulesetEvaluationRun",
"glue:PublishDataQuality",
"glue:GetDataQualityRuleset"
]
Resource: [
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:dataQualityRuleset/*"
]
- Effect: Allow
Action:
- "s3:GetObject"
Resource: [
"arn:aws:s3:::aws-glue-*"
]
- Effect: Allow
Action:
- "cloudwatch:PutMetricData"
Resource: "*"
- Effect: Allow
Action: [
"s3:PutObject*"
]
Resource: [
!Sub "arn:aws:s3:::${S3BucketName}/*"
]
- Effect: Allow
# チェック対象のデータを取得できるように権限をつけました。
Action: [
"s3:ListBucket",
"s3:GetObject"
]
Resource: [
!Sub "arn:aws:s3:::${S3BucketName}",
!Sub "arn:aws:s3:::${S3BucketName}/*"
]
- Effect: "Allow"
Action: [
"glue:GetTable",
"glue:GetPartitions"
]
Resource: [
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog",
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${GlueDatabaseName}",
!Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${GlueDatabaseName}/${GlueTableName}"
]
3. ルールセットの生成
DQDLで定義したルールセットは、AWS Glue Data Qualityの機能を使って推奨されるものをデータから生成することができます。
まず、対象のテーブルのData quality
タブを開き、Recommend ruleset
を押します。
ルールセット名と、実行に必要なIAMロールを設定します。IAMロールにはルールセットの生成に使う方を設定します。必要であればAdditional configurations
からワーカー数とタイムアウトの時間を設定することもできます。
Recommend ruleset
を押して実行します。
しばらく待って、Run StatusがCompletedになることを確認します。
4. ルールセットの編集(任意)
Rulesets
のセクションに表示されているルールセット名のリンクを押すと、その詳細を確認することができます。
Actions
から編集や削除ができます。
編集する場合は、編集画面から定義を修正し、Update ruleset
を押します。
5. 品質チェックの実行
実行したいルールセットを選択し、Evaluate ruleset
を押します。
品質チェック実行用のIAMロールを選択します。必要であればワーカー数やデータ品質チェックの結果を格納するS3の場所を指定します。上記で紹介したIAMロールは、この画面でCloudWatchへのメトリクス発行やS3バケットへの結果の格納をする前提で権限設定をしています。Evaluate ruleset
を押すとチェックが実行されます。
Data quality results
タブから実行結果を確認することができます。しばらく待つとRun status
がCompleted
になれば成功です。各ルールの評価状況はDQ result
欄に表示されます。今回は一つ違反するルールがあったようです。画面下のセクションで、どのルールが違反したかとその詳細も確認できますね。
最後に
今回は現在プレビューのAWS Glue Data Qualityを試してみたい方向けに、AWS Glueコンソールからの使い方と、実行に必要なIAMロールの例をご紹介しました。
コンソールからの実行以外にも、冒頭で紹介したブログのようなGlue Studioから実行できたり、既にAWS SDK for Python (Boto3)からも実行することが可能なようです。
DQDLでは欠損値の有無のチェックや要約統計量などの計算に加え、あるカラムがPKとしての条件を満たしているかなど、多くの方が確認はしたいものの自作すると意外と大変だなと思っていたであろう品質チェックをサポートしており、この記事でご紹介した通りとても簡単に実行できます。
プレビュー段回ではあるものの、ご興味がある方はぜひ試してみてください。