Статьи

Начало работы с Python Kinesis Consumer Library (KCL)

Мы мчимся вперед с Kinesis. С потоковыми событиями в руках, мы должны подключить наших исследователей данных. Одна из проблем, KCL и KPL, сильно сосредоточены на Java, но наши специалисты по данным (и остальная часть нашей организации) любят Python. знак равно

Мы используем блокнот IPython для обмена кодами / примерами Python. Итак, в этом блоге я собираюсь познакомить вас с потреблением событий от Kinesis с использованием записной книжки Python и IPython. Если вы уже знакомы с записной книжкой IPython, вы можете взять ее отсюда:

https://github.com/boneill42/kcl-python-notebook/

Если вы не знакомы с iPython Notebook, сначала перейдите  сюда,  чтобы получить краткий обзор. Короче говоря, IPython Notebook — это отличное маленькое веб-приложение, которое позволяет вам играть с командами python через браузер, создавая «рецепт», похожий на wiki / gist, которым можно поделиться с другими. После того, как вы знакомы, читайте дальше.

Чтобы начать работу с KCL-python, давайте клонируем репозиторий amazon-kinesis-client-python github:

git clone [email protected]:awslabs/amazon-kinesis-client-python.git

Затем создайте новый  virtualenv  (и если вы не используете virtualenv, воспользуйтесь программой!):

 virtualenv venv/kcl 
 source venv/kcl/bin/activate

Затем получите настройки IPython Notebook. Установите ноутбук ipython, выполнив следующие команды из каталога, содержащего клонированное хранилище:

pip install "ipython[notebook]"
ipython notebook

Это должно открыть новую вкладку в вашем браузере. Запустите новую записную книжку, нажав «New-> Python 2». Блокнот содержит одну или несколько ячеек. У каждой ячейки есть тип. Для этого упражнения мы будем использовать ячейки «Код». Мы воспользуемся «волшебными» функциями, доступными в IPython Notebook. Мы будем использовать   команду run, которая выполнит команду. В частности, необходимо выполнить настройку Python для KCL. 

Библиотека amazon-kinesis-client-python фактически работает поверх Java-процесса и использует MultiLangDaemon  для межпроцессного взаимодействия. Таким образом, для установки KCL вам необходимо скачать банки. Вы можете сделать это в записной книжке, введя и выполнив следующее в первой ячейке:

run setup.py download_jars

Далее вам нужно установить эти банки с:

run setup.py install  

Эта команда установила несколько библиотек для python (в частности — она ​​установила  boto , которая является библиотекой aws для python). Поскольку ноутбук не перезагружается динамически, вам нужно перезапустить IPython Notebook и заново открыть ноутбук. (хммм … Есть ли способ перезагрузить virtualenv, используемый ноутбуком, без перезагрузки?)

После перезагрузки вы готовы начать излучение событий в поток кинезиса. Сейчас мы будем использовать пример приложения в репозитории KCL. Создайте новую ячейку и запустите:

run samples/sample_kinesis_wordputter.py --stream words -w cat -w dog -w bird -w lobster

Из этого вы должны увидеть:

Connecting to stream: words in us-east-1
Put word: cat into stream: words
Put word: dog into stream: words
Put word: bird into stream: words
Put word: lobster into stream: words

Уу ууу! Мы излучаем события в Kinesis! Теперь нам нужно их потреблять. знак равно

Для этого вам нужно отредактировать  файл sample.propertie s. Этот файл загружается KCL для настройки потребителя. Самое главное, посмотрите на   свойство executetableName в этом файле. Это устанавливает имя кода Python, который KCL будет выполнять при получении записей. В нашем примере это  sample_kclpy_app.py.  

Посмотрите на этот пример кода Python. Вы заметите, что вам нужно реализовать четыре важных метода:   initprocess_recordscheckpoint и  shutdown . Назначение этих методов почти самоочевидно, но документация в образце довольно хорошая. Прочитайте там.

Также в  файле sample.properties обратите внимание на  AWSCredentialsProvider . Поскольку он использует Java под крышками, вам нужно установить имя класса Java поставщика учетных данных. Если оставить его без изменений, он будет использовать:  DefaultAWSCredentialsProviderChain .

Стоит посмотреть на эту документацию, но, вероятно, самый простой способ заставить аутентификацию работать — это создать   файл ~ / .aws / credentials, который содержит следующее:

[default]
aws_access_key_id=XXX
aws_secret_access_key=XXX

После настройки учетных данных вы можете запустить потребителя, выполнив следующую команду в другой ячейке записной книжки:

run samples/amazon_kclpy_helper.py --print_command --java /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin/java --properties samples/sample.properties  

Обратите внимание, что для   параметра —java требуется расположение исполняемого файла java. Теперь, запустив это в записной книжке, вы получите командную строку, которую вы можете выполнить и выполнить, чтобы использовать поток. Идите вперед и вырезать и вставить это в командной строке и выполнить его. На данный момент вы в рабочем состоянии.

To get started with your own application, simply replace the sample_kclpy_app.py code with your own, and update the properties file, and you should be off and running.

Now, I find this bit hokey.  There is no native python consumer (yet!).  And fact you actually need to run *java*, which will turn around and call python.  Honestly, with this approach, you aren’t getting much from the python library over what you would get from the Java library.  (except for some pipe manipulation in MultiLangDaemon)  Sure, it is a micro-services approach… but maybe it would be better to simply run a little python web service (behind a load balancer?).   Then, we’d be able to scale the consumers better without re-sharding the Kinesis stream.  (One shard/KCL worker could fan-out work to many python consumers across many boxes)  You would need to be careful about checkpointing, but it might be a bit more flexible.  (and would completely decouple the «data science» components from Kinesis)  Definitely food for thought. =)

As always, let me know if you run into trouble.