这个问题类似于管理AmazonDynamoDbClient限制和重试的另一个问题。但是,我认为解决方案可能在我进入发电机调用之前就已存在。
我的高级过程如下:我有一个scala应用程序,它利用Apache Spark读取大型CSV文件并对它们执行一些聚合,然后将它们写入dynamo。我将其部署到EMR以提供可扩展性。问题是,一旦聚合完成,我们就有数百万条记录准备进入发电机,但我们有发电机的写入容量。它们不需要立即插入,但控制每秒钟的数量会很好,所以我们可以根据用例对其进行微调。
以下是我目前所拥有的代码示例:
val foreach = new ForeachWriter[Row] {
override def process(value: Row): Unit = {
//write to dynamo here
}
override def close(errorOrNull: Throwable): Unit = {
}
override def open(partitionId: Long, version: Long): Boolean = {
true
}
}
val query = dataGrouped
.writeStream
.queryName("DynamoOutput")
.format("console")
.foreach(foreach)
.outputMode(OutputMode.Complete())
.start()
.awaitTermination()
有没有人有任何建议如何解决这个问题?
答案 0 :(得分:3)
您应该查看spark.streaming.backpressure.enabled
配置。来自documentation:
设置最大接收速率 - 如果群集资源不足以使流应用程序以接收数据的速度处理数据,则可以通过设置最大速率限制来限制接收器的速率。记录/秒。请参阅接收器的配置参数spark.streaming.receiver.maxRate和Direct Kafka方法的spark.streaming.kafka.maxRatePerPartition。在Spark 1.5中,我们引入了一项称为背压的功能,无需设置此速率限制,因为Spark Streaming会自动计算出速率限制,并在处理条件发生变化时动态调整它们。可以通过将配置参数spark.streaming.backpressure.enabled设置为true来启用此背压。