Help us understand the problem. What is going on with this article?

Glueの使い方的な⑰(DynamoDBをデータソースにする)

More than 1 year has passed since last update.

概要

GlueがデータソースにDynamoDBをサポートしました。試してみます。
手順は、DDBに権限のあるロールを作り、DDBをクロールするクローラーを作ってクローリングしテーブルを作り、GlueジョブでDDBのデータをETLしてS3に出力する

ジョブ名

se2_job10

クローラー名

se2_in7
se2_out10

全体の流れ

  • 前準備
  • IAMポリシー作成しロールに追加
  • クローラー作成と実行
  • ジョブ作成と実行

前準備

ソースデータ(19件)

※データの内容は以下がDynamoDBのse2_ddb1というテーブルにあります

deviceid,uuid,appid,country,year,month,day,hour
iphone,11111,001,JP,2017,12,14,12
android,11112,001,FR,2017,12,14,14
iphone,11113,009,FR,2017,12,16,21
iphone,11114,007,AUS,2017,12,17,18
other,11115,005,JP,2017,12,29,15
iphone,11116,001,JP,2017,12,15,11
pc,11118,001,FR,2017,12,01,01
pc,11117,009,FR,2017,12,02,18
iphone,11119,007,AUS,2017,11,21,14
other,11110,005,JP,2017,11,29,15
iphone,11121,001,JP,2017,11,11,12
android,11122,001,FR,2017,11,30,20
iphone,11123,009,FR,2017,11,14,14
iphone,11124,007,AUS,2017,12,17,14
iphone,11125,005,JP,2017,11,29,15
iphone,11126,001,JP,2017,12,19,08
android,11127,001,FR,2017,12,19,14
iphone,11128,009,FR,2017,12,09,04
iphone,11129,007,AUS,2017,11,30,14

DynamoDBで確認するとこう

スクリーンショット 0030-07-12 9.16.21.png

IAMポリシー作成しロールに追加

"se2_glueddbtest"というポリシーを作成

スクリーンショット 0030-07-12 8.32.24.png

※ 以下参考
https://docs.aws.amazon.com/glue/latest/dg/console-crawlers.html

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:Scan"
      ],
      "Resource": [
        "arn:aws:dynamodb:region:account-id:table/table-name*"
      ]
    }
  ]
}

作成したポリシーをIAMロールにアタッチ

スクリーンショット 0030-07-12 9.21.22.png

クローラーの作成と実行

以下の手順で、DynamoDBをクロールするクローラーを作成します。

Glueの画面からCrawlersをクリックし"Add Crawler"をクリック

スクリーンショット 0030-07-12 8.27.06.png

Crawler nameに"se2_in7"を入力

スクリーンショット 0030-07-12 8.28.52.png

Choose a data store に "DynamoDBを選択

スクリーンショット 0030-07-12 8.29.01.png

Table name には DynamoDBのテーブル"se2_ddb1"を選択

スクリーンショット 0030-07-12 8.29.18.png

IAM role を"test-glue"を選択

スクリーンショット 0030-07-12 9.30.56.png

Databaseに"se2"、prefix に "se2_"を入力し、最後に "Finish" をクリック

スクリーンショット 0030-07-12 8.29.57.png

クローラーの実行

"se2_in7"にチェックを入れ、"Run Crawler"をクリックしクローラーを実行する

スクリーンショット 0030-07-12 8.42.31.png

テーブルの確認

"se2_se2_ddb1"のテーブルができていることを確認する

スクリーンショット 0030-07-12 8.44.33.png

Classificationがdynamodb
Locationがarn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/se2_ddb1
を確認する
スキーマがDynamoDBのテーブルと同じであることを確認する

スクリーンショット 0030-07-12 8.48.23.png

ジョブ作成

Glueの画面からJobをクリックし、"Add job"をクリック

スクリーンショット 0030-07-12 8.50.18.png

Name に "se2_job10" を入力し、IAM role に "test-glueを選択し、"Next"をクリック

スクリーンショット 0030-07-12 8.53.07.png

Data source に "se2_se2_ddb1"を選択し"Next"をクリック

スクリーンショット 0030-07-12 8.53.42.png

Create Table in your targetにチェックを入れ、Data storeに"S3"、Formatに"Parquet"、Target pathに"s3://test-glue00/se2/out10"を選択

スクリーンショット 0030-07-12 8.57.47.png

そのまま"Next"

スクリーンショット 0030-07-12 9.01.08.png

次の画面で"Save.."をクリックしジョブが作成され、その次の画面で"Run Job"をクリックする

スクリーンショット 0030-07-12 9.02.34.png

ジョブ実行中画面

スクリーンショット 0030-07-12 9.03.53.png

se2_job10
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
## @type: DataSource
## @args: [database = "se2", table_name = "se2_se2_ddb1", transformation_ctx = "datasource0"]
## @return: datasource0
## @inputs: []
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "se2", table_name = "se2_se2_ddb1", transformation_ctx = "datasource0")
## @type: ApplyMapping
## @args: [mapping = [("country", "string", "country", "string"), ("month", "long", "month", "long"), ("hour", "long", "hour", "long"), ("year", "long", "year", "long"), ("appid", "long", "appid", "long"), ("deviceid", "string", "deviceid", "string"), ("uuid", "long", "uuid", "long"), ("day", "long", "day", "long")], transformation_ctx = "applymapping1"]
## @return: applymapping1
## @inputs: [frame = datasource0]
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("country", "string", "country", "string"), ("month", "long", "month", "long"), ("hour", "long", "hour", "long"), ("year", "long", "year", "long"), ("appid", "long", "appid", "long"), ("deviceid", "string", "deviceid", "string"), ("uuid", "long", "uuid", "long"), ("day", "long", "day", "long")], transformation_ctx = "applymapping1")
## @type: ResolveChoice
## @args: [choice = "make_struct", transformation_ctx = "resolvechoice2"]
## @return: resolvechoice2
## @inputs: [frame = applymapping1]
resolvechoice2 = ResolveChoice.apply(frame = applymapping1, choice = "make_struct", transformation_ctx = "resolvechoice2")
## @type: DropNullFields
## @args: [transformation_ctx = "dropnullfields3"]
## @return: dropnullfields3
## @inputs: [frame = resolvechoice2]
dropnullfields3 = DropNullFields.apply(frame = resolvechoice2, transformation_ctx = "dropnullfields3")
## @type: DataSink
## @args: [connection_type = "s3", connection_options = {"path": "s3://test-glue00/se2/out10"}, format = "parquet", transformation_ctx = "datasink4"]
## @return: datasink4
## @inputs: [frame = dropnullfields3]
datasink4 = glueContext.write_dynamic_frame.from_options(frame = dropnullfields3, connection_type = "s3", connection_options = {"path": "s3://test-glue00/se2/out10"}, format = "parquet", transformation_ctx = "datasink4")
job.commit()

Athenaから確認

DynamoDBと同じデータがクエリできている

スクリーンショット 0030-07-12 9.11.24.png

件数も19件で合っている

スクリーンショット 0030-07-12 9.11.51.png

フォーマットもparquet

スクリーンショット 0030-07-12 9.12.21.png

その他

DynamoDBのRCUについて
GlueによるDynamoDBへのReadにも、DynamoDBのRCUを消費します。

  • "dynamodb.input.tableName":(必須)読み取る元のDynamoDBテーブル。
  • "dynamodb.throughput.read.percent":(オプション)使用する予約済み容量ユニット(RCU)のパーセンテージ。 デフォルトは "0.5"に設定されています。 許容可能な値は、 "0.1"から "1.5"までです

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-dynamodb

こちらも是非

Glueマニュアル
https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f

pioho07
こちらに記載の内容は所属会社とは関係ありませぬ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした