web-dev-qa-db-ja.com

Scala Spark ETL for AWS Glueで実行するためのETLのローカル開発環境をセットアップする方法は?

ローカルIDEにScalaを記述して、ビルドプロセスの一部としてAWS Glueにデプロイできるようにしたいと思います。しかし、AWSによって生成されたGlueAppスケルトンを構築するために必要なライブラリを見つけるのに苦労しています。

aws-Java-sdk-glue にはインポートされたクラスが含まれておらず、他の場所でこれらのライブラリを見つけることができません。それらはどこかに存在している必要がありますが、おそらくこのライブラリのJava/Scalaポートにすぎません: aws-glue-libs

AWSのテンプレートscalaコード:

import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import org.Apache.spark.SparkContext
import scala.collection.JavaConverters._

object GlueApp {
  def main(sysArgs: Array[String]) {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    // @params: [JOB_NAME]
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)
    // @type: DataSource
    // @args: [database = "raw-tickers-oregon", table_name = "spark_delivery_2_1", transformation_ctx = "datasource0"]
    // @return: datasource0
    // @inputs: []
    val datasource0 = glueContext.getCatalogSource(database = "raw-tickers-oregon", tableName = "spark_delivery_2_1", redshiftTmpDir = "", transformationContext = "datasource0").getDynamicFrame()
    // @type: ApplyMapping
    // @args: [mapping = [("exchangeid", "int", "exchangeid", "int"), ("data", "struct", "data", "struct")], transformation_ctx = "applymapping1"]
    // @return: applymapping1
    // @inputs: [frame = datasource0]
    val applymapping1 = datasource0.applyMapping(mappings = Seq(("exchangeid", "int", "exchangeid", "int"), ("data", "struct", "data", "struct")), caseSensitive = false, transformationContext = "applymapping1")
    // @type: DataSink
    // @args: [connection_type = "s3", connection_options = {"path": "s3://spark-ticker-oregon/target", "compression": "gzip"}, format = "json", transformation_ctx = "datasink2"]
    // @return: datasink2
    // @inputs: [frame = applymapping1]
    val datasink2 = glueContext.getSinkWithFormat(connectionType = "s3", options = JsonOptions("""{"path": "s3://spark-ticker-oregon/target", "compression": "gzip"}"""), transformationContext = "datasink2", format = "json").writeDynamicFrame(applymapping1)
    Job.commit()
  }
}

そしてbuild.sbtは、ローカルビルドのためにまとめ始めました。

name := "aws-glue-scala"

version := "0.1"

scalaVersion := "2.11.12"

updateOptions := updateOptions.value.withCachedResolution(true)

libraryDependencies += "org.Apache.spark" %% "spark-core" % "2.2.1"

AWS Glue Scala API のドキュメントは、AWS Glue Pythonライブラリで利用可能な同様の機能の概要を示しているようです。したがって、おそらく必要なことは、PySpark AWS Glueライブラリをダウンロードしてビルドし、クラスパスに追加することだけでしょうか。おそらく、Glue pythonライブラリ Py4Jを使用 から可能です。

9
James

現在、AWSからの最新リリースがサポートされています。

https://docs.aws.Amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html

@Fredericは、s3://aws-glue-jes-prod-us-east-1-assets/etl/jars/glue-Assembly.jarから依存関係を取得するための非常に役立つヒントを提供しました。

残念ながら、そのバージョンのglue-Assembly.jarはすでに古く、spark in versoin 2.1が含まれています。下位互換性のある機能を使用しているが、最新の= sparkバージョン(およびおそらく最新のグルー機能)) Glue dev-endpoint から/usr/share/aws/glue/etl/jars/glue-Assembly.jarの下で適切なjarを取得できます。

my-dev-endpointという名前の開発エンドポイントがある場合、そこから現在のjarをコピーできます。

export DEV_ENDPOINT_Host=`aws glue get-dev-endpoint --endpoint-name my-dev-endpoint --query 'DevEndpoint.PublicAddress' --output text`

scp -i dev-endpoint-private-key \
glue@$DEV_ENDPOINT_Host:/usr/share/aws/glue/etl/jars/glue-Assembly.jar .
12
botchniaque

残念ながら、Scala glue APIに使用できるライブラリはありません。すでにAmazonサポートに連絡しており、この問題については認識しています。しかし、API jarを配信するためのETAを提供していませんでした。

7
Natalia

回避策として、jarをS3からダウンロードできます。 S3 URIはs3://aws-glue-jes-prod-us-east-1-assets/etl/jars/glue-Assembly.jar

https://docs.aws.Amazon.com/glue/latest/dg/dev-endpoint-tutorial-repl.html を参照してください

4
Frederic