Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Glueについての調査

Avatar for Koshi.Funamizu Koshi.Funamizu
September 10, 2018
200

AWS Glueについての調査

Avatar for Koshi.Funamizu

Koshi.Funamizu

September 10, 2018
Tweet

Transcript

  1. 目次 1. AWS Glue概要 2. Glue Data Catalog 3. Glue

    Crawlers 4. Glue ETL 5. 所感 6. その他
  2. 主な機能  Glue ETL  Spark Jobの作成、実行と管理  Python、ScalaのSpark scriptをジョブ登録して、実行、及び実行の管理。

     ジョブの実行はトリガー、オンデマンド、スケジュールを指定でき、 実行されたジョブのモニタリング、アラートを飛ばすことも可能  Glue上でScriptの生成、編集可能  Glue Data Catalog • カタログ情報の管理・登録 – AWSサービス上に保存されたデータに対してのメタデータテーブルの管理・登録 – 扱えるカタログ情報はAurora、RDS、Redshift、S3、Athena、EMR、Redshift Spectrum、Hive Metastore – スキーマ変更のバージョン管理可能  Glue Crawlers • Glue Catalogへカタログ情報自動登録 – スケジュール設定に従って、指定したデータストアに接続し、データのスキーマを自動判断し、Data Catalogにメタデータテーブルを作成 AWS Glueには主にETL,Data Catalog,Crawlersという3つの機能が存在する.
  3. クローラーの探索 • RDS • RDB on EC2 • Redshift •

    Amazon S3 • MySQL/MariaDB • PostgresSQL • Aurora • Oracle • SQL Server • Redshift • Avro • Parquet ,ORC • JSON • ログ • 区切り形式 … JDBC接続 オブジェクト接続 クローラの接続方法 クローラの接続先 クローラの探索する オブジェクト Grokでカスタム Classifierを作成可能
  4. ファイルの判別 分類子タイプ 分類文字列 コメント Apache Avro avro ファイルの先頭から読み取って形式を判断します。 Apache ORC

    orc ファイルのメタデータを読み取って形式を判断します。 Apache Parquet parquet ファイルの先頭から読み取って形式を判断します。 JSON json ファイルの先頭から読み取って形式を判断します。 バイナリ JSON bson ファイルの先頭から読み取って形式を判断します。 XML xml ファイルの先頭から読み取って形式を判断します。AWS Glue は、ドキュメントの XML タグに基づいてテーブルスキーマを判定します。 Ion ログ ion ファイルの先頭から読み取って形式を判断します。 Combined Apache ログ combined_apache grok パターンを通じてログ形式を判断します。 Apache ログ apache grok パターンを通じてログ形式を判断します。 Linux カーネルログ linux_kernel grok パターンを通じてログ形式を判断します。 Microsoft ログ microsoft_log grok パターンを通じてログ形式を判断します。 Ruby ログ ruby_logger ファイルの先頭から読み取って形式を判断します。 Squid 3.x ログ squid ファイルの先頭から読み取って形式を判断します。 Redis 監視ログ redismonlog ファイルの先頭から読み取って形式を判断します。 Redis ログ redislog ファイルの先頭から読み取って形式を判断します。 CSV csv 次の区切り記号をチェックします。カンマ (,)、パイプ (|)、タブ (¥t)、セミコロン (;)、および Ctrl-A (¥u0001) Amazon Redshift redshift JDBC 接続を使用してメタデータをインポートします。 MySQL mysql JDBC 接続を使用してメタデータをインポートします。 PostgreSQL postgresql JDBC 接続を使用してメタデータをインポートします。 Oracle データベース oracle JDBC 接続を使用してメタデータをインポートします。 Microsoft SQL Server sqlserver JDBC 接続を使用してメタデータをインポートします。 Amazon DynamoDB dynamodb DynamoDB テーブルからデータを読み取ります。 Glue Crawlersは下記タイプのファイルを判別することが可能 ※Zip,BZIP,GZIP,LZ4,Snappyといった圧縮形式でも分類可能
  5. ETLジョブの開発プロセス データソース選択 データターゲット選択 マッピング コーディング  データストア • JDBB •

    S3  形式 • JSON • Avro • Parquet • ORC  圧縮タイプ • None • Gzip • Bzip (snappyはデフォルトにはない)
  6. ジョブスクリプトの基本 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 ① ライブラリのインポート args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) ② 初期化処理 datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "kfunamizu_test", table_name = "json_sample", transformation_ctx = "datasource0") ③ カタログ経由で データソースへアクセスし、 DynamicFrame を作成
  7. ジョブスクリプトの基本 ##ここから変換処理を記述 applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [

    ("arraymap", "array", "arraymap", "array"), ("bool2", "boolean", "bool2", "boolean"), ("float", "double", "float", "double"), ("floatarray", "array", "floatarray", "array"), ("int", "long", "int", "long"), ("intarray", "array", "intarray", "array"), ("json_map", "string", "json_map", "string"), ("nestarray", "array", "nestarray", "array"), ("nestnestarray", "array", "nestnestarray", "array"), ("null", "int", "null", "int"), ("str", "string", "str", "string"), ("strarray", "array", "strarray", "array"), ("timestamp", "string", "timestamp", "string") ], transformation_ctx = "applymapping1") … ④ DynamicFrameを操作してデータ変換 今回はただのマッピング処理で列数を減らした ⑤ 変換後のDynamicFrameを カタログ経由でターゲットに出力 datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://kfunamizu/result", "compression": "gzip"}, format = "json", transformation_ctx = "datasink2") job.commit()
  8. DynamicFrameとDtaFrameの違い  DynamicFrameとは DynamicFrameはAWS Glueで独自に定義されたデータ構造  特徴 • Sparkで使われているDataFrameのようなテーブル形式でデータ •

    DataFrameと異なり、同一列内に複数のデータ型の混在が可能  一部不正なデータが含まれてしまっているのを検知するなど、後続の処理がそのままでは対応できなかった場面において前処 理として対処しておくのに非常に役立つ  DataFrameとの互換性 • fromDF/toDFメソッドでDynamicFrame ⇔dataFrameの変換が可能 • 同一列に複数の型が共存している場合は、toDFを使ってSparkのDataFrameには変換できない。修正してから変換する必要 あり  DataFrameとの使い分け • データ操作はDataFrameで実装し、データのI/Oの時だけDynamicFrameを使用するコーディングも可能 Col0に2つのデータ型が共存している。 なにかおかしいのでは?みたいなのを素早く検知
  9. DynamicFrameの変換クラス・メソッド DynamicFrameには変換のためのメソッドが用意されている。  GlueTransform 基本クラス  ApplyMapping クラス  DropFields

    クラス  DropNullFields クラス  ErrorsAsDynamicFrame クラス  フィルタクラス  Join クラス  マップクラス  MapToCollection クラス  クラスの関連付け  RenameField クラス  ResolveChoice クラス  SelectFields クラス  SelectFromCollection クラス  スピゴットクラス  SplitFields クラス  SplitRows クラス  Unbox クラス  UnnestFrame クラス 参照:https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-python-transforms.html 管理コンソールではクリ ックでビルドイン変換の サンプルコードが追加 される
  10. ライブラリの利用 ジョブ作成・編集時にs3からライブラリをインポート可能  Python 2.7 ライブラリ (v3はサポートされていない  S3にライブラリファイルを置いてジョブ作成時に指定 

    S3のURLはカンマ区切りで複数設定可能  Pure Pythonのコードであるということ(Pandasの様なC言語拡張に依存するライブラリは利用不可)  Java ライブラリ  S3にJarファイルを置いてジョブ作成時に指定  Pure Javaもしくは Scala 2.11ベースのコードのみ
  11. ETL ジョブの実行状況  ジョブ開始のタイミング  先行ジョブ完了時  スケジュール  オンデマンド

    • ETLジョブの状況は管理コンソールに表示される • ログはCloudWatch Logsに出力される ジョブのトリガー
  12. 所感  Glue ETL,DataCatalog, Crawlersは全体的に使いやすいサービス  Glue DataCatalogはAthenaやEMRなど他サービスでも共有して使えるので非常に便利  DataCatalogは使うべきサービス

     Crawlersはどこまで正確にテーブル定義してくれているかが未知数  Crawlersは探索にどのくらい時間がかかるのかも未知数で費用感が読めない  Glue ETLはコンセプトとしてはいいがPython3がサポートされていないのが難点  ETL ジョブは起動が遅く、ジョブが走るまでに5~10分くらいかかる。  DynamicFrameは気持ち悪いと思ったが、Spark DataFrameに容易に変換できるのであまり気にせずにコーディング できる。 • Glue ETLはPython3がサポートされていないっていう時点で使用対象外 (コンセプトとしてはいい) • Data CatalogはDataLakeを管理する上で使用すべきサービス • Crawlersは未知数な部分が多いが、パーティションを自動的に切ってくれたり、試してみたいサービス。テ ーブル定義が間違ってたとしても手動で直せばいいので。
  13. EMR と AWS Glue ETLの違い・使い分け EMR Glue 用途 汎用Hadoop/Spark環境 ETL処理に特化

    Spark ベース (Spark2.2.1をサポート) スケールアウト 可能(ユーザ設計) 可能(パラメータ指定) サーバ管理 数クリックで指定した環境が準備される 不要 (サーバレス) S3へのアクセス 可能 可能 プログラミング環境 Hadoopエコシステム上の多様なアプリケーション PySparkでETL処理を作成 コスト (机上で調べた限り) 高い 安い Python version 2 or 3 3の場合はジョブを設定するときに、設定コードを記述 すればよい V2.7のみ ライブラリ インストールすればなんでも使える Pure Pytho コードのもの  私が考えたEMRとの使い分け (もしPython3系がサポートされたら) • ETL作業はすべてGlueに集約してもいいかもしれない (管理が楽になるので) • Spark以外のアプリケーションを使いた場合やアドホックな分析をしたい場合はEMR
  14. コスト  データカタログの料金体系  最初の 100 万個のオブジェクトの保存は無料  100 万個を超えて保存された場合、100,000

    個のオブジェクトごとに毎月 1 ドル  ETL ジョブの料金体系 • *DPU 時間あたり 0.44 ドルが 1 秒単位で課金 • デフォルト10 DPU (最低 2 DPU)  開発エンドポイントの料金体系 • DPU 時間あたり 0.44 ドルが 1 秒単位で課金 • デフォルト5 DPU (最低 2 DPU) * 1DPU : 4 vCPU,16GB of memory 2018/08 時点  クローラの料金体系 • DPU 時間 あたり 0.44 ドルが 1 秒単位で課金され、クローラの実行ごとに最低 10 分