使用AWS Cli访问DynamoDB中的AWS Kinesis表

时间:2017-02-18 03:44:27

标签: amazon-web-services amazon-dynamodb amazon-kinesis

我是AWS Kinesis的新手。尝试学习如何使用AWS DynamoDB构建分布式应用程序。有人可以告诉我如何使用AWS Cli访问AWS Kinesis中我的流使用的DynamoDB中的表吗?我可以查询表格吗?

1 个答案:

答案 0 :(得分:1)

当然。 Kinesis-stream使用Amazon Dynamodb表进行消费者抵消管理。

  • 您的表格与您的消费者名称(通过KCL定义)具有相同的名称。您可以通过控制台(https://console.aws.amazon.com/dynamodb/home

  • 查看所有consumer_offset_tables
  • 使用者可能在多个实例中运行,但只有一个实例(THE leaseOwner)可以从一个分区(或Krdis称之为Shard)中消耗。如果此消费者失败,则同一消费者的另一个实例将接管并继续从checkpoint进行处理。

  • checkpoint是最后处理的事件
  • 消费者实例正在处理的分片称为leaseKey,它对于表是唯一的。

  • Dynamodb中基于键值的文档的数据结构如下所示,

其中

"S" - Char array

"N" - Number

{
  "leaseOwner": {
    "S": "SmartConsumerStream_Consumer-192.168.1.83"
  },
  "checkpoint": {
    "S": "49570630332110756564477900867375857710984404992079691778"
  },
  "checkpointSubSequenceNumber": {
    "N": "0"
  },
  "leaseCounter": {
    "N": "16"
  },
  "leaseKey": {
    "S": "shardId-000000000000"
  },
  "ownerSwitchesSinceCheckpoint": {
    "N": "0"
  }
}
  • 您可以使用Dynamodb API获取给定partitionKeyleaseKey的当前偏移量。您只能按leaseKey进行查询,因为这是表中的索引键。它由Kinesis-stream本身创建。

  • 您可以使用stream-driver我在here写的,这样可以非常轻松地为您提供消费者偏移的界面。

  • 以下是kinesis-stream tests,也可能会有所帮助。

总之,使用JAVA api

获取消费者偏移量

- 将aws凭据放在~/.aws/credentials

public Map<String, String> getConsumerPosition() {
    DynamoDB dynamoDB = new DynamoDB(getOffsetConnection()); //
    Table consumerOffsetTable = dynamoDB.getTable("your_consumer_id");

    Map<String, Object> leaseOwner = consumerOffsetTable.getItem("leaseKey", "shardId-000000000000").asMap();

    return new HashMap<String, String>(){{
        put(leaseOwner.get("leaseKey").toString(), leaseOwner.get("checkpoint").toString());
    }};
}

public AmazonDynamoDB getOffsetConnection() {
    AmazonDynamoDBClient dynamoDB = new AmazonDynamoDBClient(getAuthProfileCredentials(), getHttpConfiguration());

    return dynamoDB;
}

private ProfileCredentialsProvider getAuthProfileCredentials() {
    return new ProfileCredentialsProvider("your-aws-auth-profile_in_~/.aws/credentials");
}


private ClientConfiguration getHttpConfiguration() {

    ClientConfiguration clientConfiguration = new ClientConfiguration();

    return clientConfiguration;
}

希望它有所帮助,请告诉我是否可以通过其他方式提供帮助。