如何限制Spark Streaming?

时间:2017-03-28 17:28:45

标签: scala apache-spark amazon-dynamodb

这个问题类似于管理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()

有没有人有任何建议如何解决这个问题?

1 个答案:

答案 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来启用此背压。