概要 AWS Glueの環境構築は過去の記事にあるのですが、公式のDockerイメージが案内されているので改めて、構築してみます。
なお、Glueの公式イメージでもJupyter Notebookは利用できるのですが、使い勝手を考慮し、Jupyterlabに差し替えています。
手順
Dockerfile作成
docker-compose.yml作成
動作確認
Dockerfile PySparkのオプションを設定しつつ、gluepysparkを実行していますが、gluepysparkがPySparkのwrapperになっているため、こちらの設定で問題なく動作しています。
Dockerfileでコピーしているファイルです。
jupyter_start.sh #!/bin/bash /home/aws-glue-libs/bin/gluepyspark
.aws/config [default] region = ap-northeast-1 output = json
.aws/credentials [default] aws_access_key_id = xxx aws_secret_access_key = xxx
docker-compose.yml line10 で、jupyterlabのdefaultのWorkspaceにlocalをマウントしています。 S3(localstack)にアップロードするファイルやソースコードの同期を取ります。
Docker 起動 docker-compose up --build
動作確認(準備) Glue/localstack(s3)を初期化し、dynamic frameで取り込んだファイルをdata frameに変換して、spark sqlを実行します。 こちらのスクリプトをjupyterlabで動かします。
import sysimport osimport ioimport csvimport boto3from pyspark.context import SparkContextfrom awsglue.context import GlueContextfrom awsglue.job import Jobfrom awsglue.dynamicframe import DynamicFramefrom botocore.client import Configos.environ["TEST_S3_ENDPOINT_URL" ] = "http://gule.dev.s3.local:4566" glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init("JobName" ) sc._jsc.hadoopConfiguration().set ("fs.s3a.endpoint" , "http://gule.dev.s3.local:4566" ) sc._jsc.hadoopConfiguration().set ("fs.s3a.path.style.access" , "true" ) sc._jsc.hadoopConfiguration().set ("fs.s3a.signing-algorithm" , "S3SignerType" ) s3 = boto3.resource( "s3" , endpoint_url=os.environ["TEST_S3_ENDPOINT_URL" ], region_name="ap-northeast-1" , use_ssl=False , config=Config(s3={"addressing_style" : "path" }), ) bucket_name = "test-csv-bucket" bucket = s3.Bucket(bucket_name) bucket.create(ACL="public-read-write" ) bucket.upload_file("tests/data/sample.json" , "sample/sample.json" ) p = "s3://test-csv-bucket/sample/" .format ("input-tables" , f"sample.json" ) df = glueContext.create_dynamic_frame.from_options( connection_type="s3" , connection_options={"paths" : [p]}, format ="json" , ).toDF() df.count() df.show() df.createOrReplaceTempView("sample" ) spark.sql("show tables" ).show() spark.sql("select count(*) from sample" ).show() spark.sql("select * from sample" ).show()
動作確認 ブラウザより、http://localhost:8888 を実装し、jupyterlabで動かします。
docker-compose.yml でマウントしたlocalストレージにtests/data/sample.jsonを用意して、実行してみます。 せっかくなので、処理ブロック単位に動かします。
所感 ローカルでAWSに依存せず、GlueのAPIをインタラクティブに確認できるので、開発効率としては良いのではないでしょうか。