Spark Streaming + Kinesis:违反了Receiver MaxRate

时间:2016-11-29 05:53:08

标签: apache-spark spark-streaming amazon-kinesis

我正在调用spark-submit传递maxRate,我有一个kinesis接收器,以及1s批次

Text Score 1 morning 1 2 bliss 0 3 great 1 4 happy 0

然而,单个批次可能会大大超过已建立的maxRate。即:我得到300条记录。

我错过了任何设置吗?

2 个答案:

答案 0 :(得分:2)

对我来说这看起来像个错误。从代码中探讨,看起来Kinesis完全忽略了spark.streaming.receiver.maxRate配置。

如果您查看KinesisReceiver.onStart内部,您会看到:

val kinesisClientLibConfiguration =
  new KinesisClientLibConfiguration(checkpointAppName, streamName, awsCredProvider, workerId)
  .withKinesisEndpoint(endpointUrl)
  .withInitialPositionInStream(initialPositionInStream)
  .withTaskBackoffTimeMillis(500)
  .withRegionName(regionName)

此构造函数最终调用另一个构造函数,该构造函数具有许多配置的默认值:

public KinesisClientLibConfiguration(String applicationName,
        String streamName,
        AWSCredentialsProvider kinesisCredentialsProvider,
        AWSCredentialsProvider dynamoDBCredentialsProvider,
        AWSCredentialsProvider cloudWatchCredentialsProvider,
        String workerId) {
    this(applicationName, streamName, null, DEFAULT_INITIAL_POSITION_IN_STREAM, kinesisCredentialsProvider,
            dynamoDBCredentialsProvider, cloudWatchCredentialsProvider, DEFAULT_FAILOVER_TIME_MILLIS, workerId,
            DEFAULT_MAX_RECORDS, DEFAULT_IDLETIME_BETWEEN_READS_MILLIS,
            DEFAULT_DONT_CALL_PROCESS_RECORDS_FOR_EMPTY_RECORD_LIST, DEFAULT_PARENT_SHARD_POLL_INTERVAL_MILLIS,
            DEFAULT_SHARD_SYNC_INTERVAL_MILLIS, DEFAULT_CLEANUP_LEASES_UPON_SHARDS_COMPLETION,
            new ClientConfiguration(), new ClientConfiguration(), new ClientConfiguration(),
            DEFAULT_TASK_BACKOFF_TIME_MILLIS, DEFAULT_METRICS_BUFFER_TIME_MILLIS, DEFAULT_METRICS_MAX_QUEUE_SIZE,
            DEFAULT_VALIDATE_SEQUENCE_NUMBER_BEFORE_CHECKPOINTING, null);
}

您关心的是DEFAULT_MAX_RECORDS,它始终设置为10,000条记录。 KinesisClientLibConfiguration上有一个名为withMaxRecords的方法,您可以调用它来设置实际的记录数。这应该是一个简单的解决方法。

但就目前而言,似乎Kinesis接收器并不尊重该参数。

答案 1 :(得分:2)

供将来参考。

这是Spark 2.2.0版本中已修复的已知bug