Как настроить локальную среду разработки для запуска Scala Spark ETL в AWS Glue?

Я хотел бы иметь возможность написать Scala в своей локальной среде IDE, а затем развернуть ее в AWS Glue как часть процесса сборки. Но у меня возникают проблемы с поиском библиотек, необходимых для построения GlueApp скелета, созданного AWS.

aws-java-sdk-glue не содержит классы импортированы, и я не могу найти эти библиотеки где-либо еще. Хотя они должны где-то существовать, но, возможно, они всего лишь порт этой библиотеки на Java / Scala: aws-glue -libs

Код шаблона Scala от AWS:

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 и добавить ее в путь к классам? Возможно, это возможно, поскольку библиотека Python Glue использует Py4J.


person James    schedule 13.03.2018    source источник
comment
Здесь есть открытая проблема: github.com/awslabs/aws-glue-libs/ вопросов / 15   -  person Gonzalo    schedule 05.02.2019


Ответы (4)


теперь он поддерживает недавний выпуск от AWS.

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

person sri hari kali charan Tummala    schedule 23.09.2019

@Frederic дал очень полезный намек на получение зависимости от s3://aws-glue-jes-prod-us-east-1-assets/etl/jars/glue-assembly.jar.

К сожалению, эта версия glue-assembly.jar уже устарела и приносит искру в версии 2.1. Это нормально, если вы используете функции обратной совместимости, но если вы полагаетесь на последнюю версию Spark (и, возможно, последние функции клея), вы можете получить соответствующую банку из Прикрепите конечную точку разработчика в /usr/share/aws/glue/etl/jars/glue-assembly.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 .
person botchniaque    schedule 02.05.2018
comment
Спасибо ... Мне удалось увидеть общедоступный адрес конечной точки разработчика из консоли AWS Glue и скопировать glue-assembly.jar локально. Теперь мой scala можно собирать локально. - person James; 02.05.2018

К сожалению, для Scala glue API нет доступных библиотек. Уже обратился в службу поддержки Amazon, и они знают об этой проблеме. Однако они не предоставили ETA для доставки jar-файла API.

person Natalia    schedule 13.03.2018
comment
Спасибо. Это досадно, похоже, что у них уже есть эта библиотека. Но я полагаю, что пока мы просто будем использовать python. - person James; 13.03.2018

В качестве обходного пути вы можете загрузить банку с S3. URI S3 - 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.

person Frederic    schedule 23.03.2018