Использование потока kinesis в python

Я не могу найти достойный пример, который показывает, как я могу использовать поток AWS Kinesis через Python. Может ли кто-нибудь предоставить мне некоторые примеры, которые я мог бы изучить?

лучшие

2 ответов


хотя на этот вопрос уже был дан ответ, для будущих читателей может быть хорошей идеей рассмотреть возможность использования Kinesis Client Library (KCL) for Python вместо boto напрямую. Это упрощает потребление из потока когда у вас есть несколько экземпляров потребителя и / или изменение конфигурации осколков.

https://aws.amazon.com/blogs/aws/speak-to-kinesis-in-python/

более полного перебора из чего KCL обеспечивает

  • подключение к потоку
  • перечисляет Черепков
  • координирует ассоциации осколков с другими работниками (если таковые имеются)
  • создает экземпляр процессора записи для каждого осколка, которым он управляет
  • извлекает записи данных из потока
  • нажимает записи на соответствующий процессор записи
  • контрольные точки обработаны записи (он использует DynamoDB так ваш код не должен вручную сохранять значение контрольной точки)
  • балансирует ассоциации shard-worker при изменении количества экземпляров worker
  • Balances shard-рабочие ассоциации, когда осколки разделены или объединены

элементы, выделенные жирным шрифтом, - это те, которые я думаю, где KCL действительно предоставляет нетривиальное значение над boto. Но в зависимости от вашего usecase boto может быть намного проще.


вы должны использовать boto.кинесис:

from boto import kinesis

после того как вы создали поток:

Шаг 1: подключение к aws kinesis:

auth = {"aws_access_key_id":"id", "aws_secret_access_key":"key"}
connection = kinesis.connect_to_region('us-east-1',**auth)

Шаг 2: получить информацию о потоке (например, сколько осколков, если он активен ..)

tries = 0
while tries < 10:
    tries += 1
    time.sleep(1)
    try:
        response = connection.describe_stream('stream_name')   
        if response['StreamDescription']['StreamStatus'] == 'ACTIVE':
            break 
    except :
        logger.error('error while trying to describe kinesis stream : %s')
else:
    raise TimeoutError('Stream is still not active, aborting...')

Шаг 3: получите все идентификаторы осколков, и для каждого общего идентификатора получите итератор осколка:

shard_ids = []
stream_name = None 
if response and 'StreamDescription' in response:
    stream_name = response['StreamDescription']['StreamName']                   
    for shard_id in response['StreamDescription']['Shards']:
         shard_id = shard_id['ShardId']
         shard_iterator = connection.get_shard_iterator(stream_name, shard_id, shard_iterator_type)
         shard_ids.append({'shard_id' : shard_id ,'shard_iterator' : shard_iterator['ShardIterator'] })

Шаг 4: прочитайте данные для каждого осколка

limit-это предел записей, которые вы хотите получить. (вы можете получить до 10 МБ) shard_iterator является общим с предыдущего шага.

tries = 0
result = []
while tries < 100:
     tries += 1
     response = connection.get_records(shard_iterator = shard_iterator , limit = limit)
     shard_iterator = response['NextShardIterator']
     if len(response['Records'])> 0:
          for res in response['Records']: 
               result.append(res['Data'])                  
          return result , shard_iterator

в следующем вызове get_records, вы должны использовать shard_iterator, который вы получили с результатом предыдущих get_records.

Примечание: в одном вызове get_records (limit = None) вы можете получить пустые записи. если вы вызываете get_records с ограничением, вы получите записи, которые находятся в том же ключе раздела (когда вы вводите данные в поток, вы должны использовать ключ раздела :

connection.put_record(stream_name, data, partition_key)