Kinesis Shard GetRecords.IteratorAgeMilliseconds达到最大86.4M(1天),即使消耗也不会减少

时间:2017-11-22 01:40:07

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

  • 我正在使用Spark Streaming 2.2.0并使用 spark-streaming-kinesis-asl_2.11 来使用Kinesis流。
  • Kinesis Stream有150个分片,我正在监控GetRecords.IteratorAgeMilliseconds CloudWatch指标,以了解消费者是否跟上流。
  • Kinesis Stream的默认数据保留时间为86400秒(1天)。
  • 我正在调试一些Kinesis碎片达到最大GetRecords.IteratorAgeMilliseconds 86400000(==保留期)
  • 的情况
  • 这仅适用于某些分片(让我们称之为过时的分片),而不是全部分片。

我已经为过时的分片确定了shardIds。其中一个是shardId-000000000518,我可以在DynamoDB表中看到以下检查点信息:

leaseKey: shardId-000000000518
checkpoint: 49578988488125109498392734939028905131283484648820187234
checkpointSubSequenceNumber: 0
leaseCounter: 11058
leaseOwner: 10.0.165.44:52af1b14-3ed0-4b04-90b1-94e4d178ed6e    
ownerSwitchesSinceCheckpoint: 37
parentShardId: { "shardId-000000000269" }

我可以在10.0.165.44上的worker日志中看到以下内容:

  

17/11/22 01:04:14 INFO Worker:当前流碎片分配:shardId-000000000339,...,shardId-000000000280, shardId-000000000518

...这应该意味着 shardId-000000000518 已分配给此工作人员。但是,我从未在日志中看到此shardId的任何其他内容。如果工作者没有从这个shardId消费(但它应该),这可以解释为什么GetRecords.IteratorAgeMilliseconds永远不会减少。对于其他一些(非过时的shardIds ),我可以在日志中看到

  

17/11/22 01:31:28 INFO SequenceNumberValidator:验证序列号49578988151227751784190049362310810844771023726275728690,分片ID为shardId-00000000033

我确实通过查看IncomingRecords CloudWatch指标验证过时的分片是否有数据流入其中。

我该如何调试/解决此问题?为什么这些shardId永远不会被Spark工作者接收?

0 个答案:

没有答案