我的用例是从Spark应用程序写入DynamoDB。由于我对DynamoDB的写入容量有限,并且不希望因成本问题而增加它,我如何限制Spark应用程序以规定的速度写入?
是否可以通过将分区减少为1然后执行foreachPartition()
?
我已经启用了自动缩放,但又不想再增加它。
请提出其他处理方式。
编辑:这需要在Spark应用程序在多节点EMR集群上运行时实现。
答案 0 :(得分:1)
我这样做的方法是在Spark应用程序中创建token bucket scheduler。设计令牌桶模式是常见的,以确保应用程序不会违反API限制。我在非常类似的情况下成功使用了这个设计。您可能会发现有人编写了一个可以用于此目的的库。
另一个(不太吸引人的)选项是增加DynamoDB连接的重试次数。当您的写入由于超出吞吐量而未成功时,您可以基本上指示您的DyanmoDB SDK继续重试,只要您愿意。 this answer中的详细信息。如果您想要“快速而肮脏”的解决方案,此选项可能会有吸引力。
答案 1 :(得分:0)
我们为Spark创建了DynamoDB自定义数据源:
https://github.com/audienceproject/spark-dynamodb
它具有许多优雅的功能:
您绝对可以使用吞吐量控制功能来实现您提到的有限的写容量。如果您可以检查一下并提供反馈,我们将非常乐意。