【问题标题】:How to set up a local development environment for Scala Spark ETL to run in AWS Glue?如何为 Scala Spark ETL 设置本地开发环境以在 AWS Glue 中运行?
【发布时间】:2018-08-21 14:03:21
【问题描述】:

我希望能够在我的本地 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 库uses Py4J 以来,也许有可能。

【问题讨论】:

标签: scala pyspark sbt aws-glue


【解决方案1】:

很遗憾,没有可用于 Scala 胶水 API 的库。已经联系了亚马逊支持,他们知道这个问题。但是,他们没有提供任何 ETA 来交付 API jar。

【讨论】:

  • 谢谢。令人失望的是,他们似乎已经拥有那个图书馆了。但我想我们现在只使用 python。
【解决方案2】:

作为一种解决方法,您可以从 S3 下载 jar。 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

【讨论】:

    【解决方案3】:

    @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 下的 Glue dev-endpoint 获取适当的 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 .
    

    【讨论】:

    • 谢谢...我能够从 AWS Glue 控制台看到开发终端节点的公共地址,并在本地复制了 glue-assembly.jar。现在我的 scala 可以在本地构建。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多