2016-07-25 21 views
1

Ich habe von Code folgende StückAWS kinesis kehrt Aufzeichnungen nicht

def getSample(accessKey: String, secretKey: String, streamName: String, size: Int, endpoint: String, region: String): Unit = { 
     var client=getKinesisClient(accessKey, secretKey, endpoint, region) 
     val decoder = Charset.forName("UTF-8").newDecoder() 
     var shards = getShards(accessKey, secretKey, streamName, endpoint, region) 
     val numberOfShards = shards.iterator() 
     var isStop = false 
     var sampleRecords = new StringBuilder 
     while (numberOfShards.hasNext() && !isStop) { 
      val shard = numberOfShards.next() 
      var shardIterator: String = null 
      val getShardIteratorRequest = new GetShardIteratorRequest() 
      getShardIteratorRequest.setStreamName(streamName) 
      getShardIteratorRequest.setShardId(shard.getShardId()) 
      getShardIteratorRequest.setShardIteratorType("TRIM_HORIZON") 
      val getShardIteratorResult = client.getShardIterator(getShardIteratorRequest) 
      shardIterator = getShardIteratorResult.getShardIterator 
      var getRecordsRequest = new GetRecordsRequest 
      getRecordsRequest.setShardIterator(shardIterator) 
      var records: List[Record] = client.getRecords(getRecordsRequest).getRecords() 
      println(records.size()) 
      var itr = records.iterator() 
      var SampleData = new ArrayList[String]() 
      while (itr.hasNext()) { 
       val record = itr.next() 
       val data = decoder.decode(record.getData).toString 
       println(data) 
      } 
     } 
    } 

Dies druckt, dass Rekordzählimpuls zu holen ist 0. Gleiche i mit aws hat cli

aws kinesis put-records --records "Data=hello world - hemant,PartitionKey=20150421" --stream-name simpleStream 

es gibt 0 Datensätze fehlgeschlagen Dann lief ich Befehl folgende

aws kinesis get-shard-iterator --stream-name simpleStream --shard-id 0 --shard-iterator-type TRIM_HORIZON 

und

aws kinesis get-records --shard-iterator xxxxxxxxx 

Es gibt auch leere Array zurück.

Kann mir bitte jemand helfen? Danke

Antwort

2

GetRecords gibt nicht immer Datensätze zurück, auch wenn es Datensätze im Shard gibt. Dies wird in FAQ beschrieben.

https://aws.amazon.com/kinesis/streams/faqs/

Q: Warum nennt GetRecords leer Ergebnis zurück, während es Daten in meinem Amazon Kinesis Stream ist?

Sie benötigen Datensätze von TRIM_HORIZON Position, das ist die älteste Position im Shard. Wenn Sie get-records mehrmals hintereinander (10 oder 20 oder mehr) aufrufen und den Iteratorpunkt ausführen, werden Sie auf Datensätze stoßen.

Folgendes Forum ist auch nützlich :: https://forums.aws.amazon.com/thread.jspa?messageID=509980