【问题标题】:How can I mock DynamoDB access via Spark in Scala?如何在 Scala 中通过 Spark 模拟 DynamoDB 访问?
【发布时间】:2019-11-07 22:47:06
【问题描述】:

我有一个用 Scala 编写的 Spark 作业,最终写入 AWS DynamoDB。我想围绕它编写一些单元测试,但唯一的问题是我不知道如何去模拟写入 DynamoDB 的位。我正在使用他们的emr-dynamodb-connector 类,这意味着我没有使用任何依赖注入(否则这很容易)。

在我使用 Spark 读入一些 RDD 数据后,我对其进行了一些简单的转换,将其转换为 (org.apache.hadoop.io.Text, org.apache.hadoop.dynamodb.DynamoDBItemWritable) 类型的 Pair RDD。所以我的代码对 Dynamo 的唯一改进是创建 DynamoDBItemWritable 对象。该类本身不包含任何利用 AWS 开发工具包保存任何内容的逻辑;它本质上只是一个数据对象。然后我的代码调用这个:

val conf = new Configuration()
conf.set("dynamodb.servicename", "dynamodb")
conf.set("dynamodb.input.tableName", "MyOutputTable")
conf.set("dynamodb.output.tableName", "MyInputTable")
conf.set("dynamodb.endpoint", "https://dynamodb.us-east-1.amazonaws.com")
conf.set("dynamodb.regionid", "us-east-1")
conf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat")
conf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat")
myTransformedRdd.saveAsHadoopDataset(new JobConf(conf)

...连接器会神奇地注册正确的类并进行正确的调用,从而有效地将结果相应地保存到 DynamoDB。

我不能模拟SparkSession,因为它有一个私有构造函数(无论如何这会非常混乱)。据我所知,我没有任何直接的方法来模拟 DynamoDB 客户端。 Scala(或 Scalatest,或 Scalamock)中是否有一些神奇的语法可以让我告诉它,如果它想要实例化 Dynamo 客户端类,它应该使用模拟版本?

如果没有,我将如何测试这段代码?我想从理论上讲,也许有一种方法可以设置 Dynamo 的本地内存实例,然后更改 dynamodb.endpoint 的值,但这听起来非常混乱,只是为了让单元测试正常工作。另外,我不确定这是否可能。

【问题讨论】:

  • Local in-memory instance 可用。正如你所说,这是一个相当混乱的方法。我在项目中使用过它,即使使用相当简单的数据模型,文本固定装置也会变得相当复杂且容易出错。

标签: scala apache-spark amazon-dynamodb scalatest scalamock


【解决方案1】:

看看LocalStack。它提供了一个易于使用的测试/模拟框架,用于通过在本地机器或 Docker 中启动与 AWS 兼容的 API 来开发与 AWS 相关的应用程序。它支持两打 AWS API,DynamoDB 就是其中之一。它确实是一个很棒的功能测试工具,无需在 AWS 中使用单独的环境。

如果您只需要 DynamoDB,还有另一个工具:DynamoDB Local,一个带有 Amazon DynamoDB 的Docker image

两者都像启动 Docker 容器一样简单:

docker run -p 8000:8000 amazon/dynamodb-local
docker run -P localstack/localstack

如果您使用 JUnit 5 进行测试,我向您推荐 JUnit 5 extensions for AWS,这是一些 JUnit 5 扩展,可用于测试与 AWS 相关的代码。这些扩展可用于为本地堆栈(或真实工具)等工具提供的 AWS 服务客户端注入客户端。支持 AWS Java SDK v 2.x 和 v 1.x。

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多