从AWS Kinesis数据流获取记录时遇到空记录问题
解决Kinesis写入记录后
get-records返回空的问题 我来帮你捋捋这个问题——你已经通过put-record成功把记录写入Kinesis数据流(从返回的ShardId和SequenceNumber能确认写入成功),但调用get-records却拿不到数据,常见的原因和解决办法如下:
1. 分片迭代器类型或目标分片错误
这是最容易踩的坑:
- 如果你获取分片迭代器时用了
LATEST类型,它会从当前时刻之后写入的记录开始读取,自然拿不到你之前写入的testdata; - 另外要确保你获取迭代器时指定的
shard-id和put-record返回的ShardId完全一致(也就是shardId-000000000001),不能选错分片。
解决办法:获取正确的分片迭代器
用TRIM_HORIZON类型获取指向数据流起始位置的迭代器,这样能读到该分片中所有未被修剪的记录:
aws kinesis get-shard-iterator --stream-name Live_DataStream --shard-id shardId-000000000001 --shard-iterator-type TRIM_HORIZON
然后用返回的ShardIterator值调用get-records:
aws kinesis get-records --shard-iterator <返回的迭代器字符串>
如果你只想从刚才写入的那条记录开始读,可以用AT_SEQUENCE_NUMBER类型并指定返回的SequenceNumber:
aws kinesis get-shard-iterator --stream-name Live_DataStream --shard-id shardId-000000000001 --shard-iterator-type AT_SEQUENCE_NUMBER --starting-sequence-number 49583432609061722809096316034912211811585750778783989778
2. 分片迭代器已过期
Kinesis的分片迭代器有效期只有5分钟,如果你拿到迭代器后间隔太久才调用get-records,迭代器会失效,此时需要重新获取新的迭代器。
3. 尝试使用后续迭代器
如果第一次调用get-records返回空,但结果里包含NextShardIterator,可以尝试用这个后续迭代器再次调用get-records——有时候初始迭代器指向的位置暂时没有数据,但后续迭代器会前进到有数据的位置。
按照上面的步骤操作,应该就能成功读取到你写入的testdata了。
内容的提问来源于stack exchange,提问作者Preetilatha Ramalingam
相关产品推荐
相关产品推荐

