Глава 16. Большие данные: Hadoop, Spark, NoSQL и IoT
зывает переопределенный метод status каждый раз с поступлением нового сообщения статуса. В данном случае мы проверяем уведомления о подписке или отписке от канала.
Клиент PubNub вызывает переопределенный метод message (строки 36–45) при поступлении нового сообщения из канала. Строки 37 и 38 получают из сообщения название компании и цену, которые выводятся приложением, чтобы пользователь видел принимаемые сообщения. Строка 30 использует метод at коллекции DataFrame для нахождения строки соответствующей компании и ее столбца 'price', а затем присваивает этому элементу новую цену. После того как счетчик order_count достигнет MAX_ORDERS, строка 45 вызывает метод unsubscribe_all клиента PubNub, для того чтобы отписаться от канала.
Функция Update
В этом примере для визуализации цен применяются средства анимации, представленные в разделе «Введение в data science» главы 6. Функция update определяет прорисовку одного кадра анимации; она многократно вызывается объектом FuncAnimation, который будет определен ниже. Мы используем функцию barplot библиотеки Seaborn для визуализации данных от коллекции DataFrame companies_df, используя значения столбца 'company' по оси x и значения столбца 'price' по оси y.
47 def update(frame_number):
48 """Настраивает содержимое гистограммы для каждого кадра анимации."""
49 plt.cla() # Стереть старую гистограмму
50 axes = sns.barplot(
51 data=companies_df, x='company', y='price', palette='cool')
52 axes.set(xlabel='Company', ylabel='Price')
53 plt.tight_layout()
54
Настройка объекта Figure
В основной части сценария сначала назначается стиль оформления диаграммы, после чего создается объект Figure, на котором будет выводиться гистограмма:
55 if __name__ == '__main__':
56 sns.set_style('whitegrid') # Белый фон с серыми линиями сетки
57 figure = plt.figure('Stock Prices') # Объект Figure для анимации
58
16.8. «Интернет вещей» 859
Настройка объекта FuncAnimation и отображение окна
Теперь настроим объект FuncAnimation, вызывающий функцию update, а затем и метод show библиотеки Matplotlib для отображения Figure. Обычно метод блокирует продолжение сценария до того, как вы закроете Figure. В данном случае передается ключевой аргумент block=False, чтобы сценарий продолжил выполнение, а мы могли настроить клиента PubNub и подписаться на канал.
59 # Настроить и запустить анимацию с вызовом функции update
60 stock_animation = animation.FuncAnimation(
61 figure, update, repeat=False, interval=33)
62 plt.show(block=False) # display window
63
Настройка клиента PubNub
Затем мы настраиваем ключ подписки PubNub, используемый клиентом PubNub в сочетании с именем канала для подписки на канал. Ключ задается как атрибут объекта PNConfiguration (модуль pubnub.pnconfiguration), передаваемый в строке 69 новому объекту клиента PubNub (модуль pubnub.pubnub). Строки 70–72 создают объект SensorSubscriberCallback и передают его методу add_listener клиента PubNub, чтобы зарегистрировать его для получения сообщений от канала. Аргумент командной строки используется для определения количества обрабатываемых сообщений.
64 # Настроить ключ потока pubnub-market-orders
65 config = PNConfiguration()
66 config.subscribe_key = 'sub-c-4377ab04-f100-11e3-bffd-02ee2ddab7fe'
67
68 # Создать клиента PubNub и зарегистрировать SubscribeCallback
69 pubnub = PubNub(config)
70 pubnub.add_listener(
71 SensorSubscriberCallback(df=companies_df,
72 limit=int(sys.argv[1] if len(sys.argv) > 1 else 1000))
73
Подписка на канал
Следующая команда завершает процесс подписки, указывая, что мы хотим получать сообщения от канала с именем 'pubnub-market-orders'. Метод execute запускает поток:
74 # Подписаться на канал pubnub-sensor-network и начать потоковую передачу
75 pubnub.subscribe().channels('pubnub-market-orders').execute()
76
860 Глава 16. Большие данные: Hadoop, Spark, NoSQL и IoT
Сохранение объекта Figure на экране
Второй вызов метода show библиотеки Matplotlib гарантирует, что объект Figure останется на экране, пока не будет закрыто окно.
77 plt.show() # Диаграмма остается на экране, пока не будет закрыто окно
16.9. Итоги
В этой главе мы представили концепцию больших данных, рассказали, как развивается эта отрасль, и описали программную и аппаратную инфраструктуру для работы с большими данными. Были представлены традиционные реляционные базы данных и язык SQL, а модуль sqlite3 использовался для создания и работы с базой данных books в SQLite. Также была продемонстрирована загрузка результатов запросов SQL в коллекции Pandas DataFrame.
Рассмотрены четыре основные разновидности баз данных NoSQL — базы данных «ключ-значение», документные, столбцовые и графовые базы данных, а также базы данных NewSQL. Объекты твитов JSON сохранялись в виде документов в кластере MongoDB Atlas на базе облака, а затем обобщались в интерактивной визуализации, отображаемой на карте Folium.
Далее была представлена технология Hadoop и ее применение в области больших данных. Мы настроили многоузловой кластер Hadoop с использованием сервиса Microsoft Azure HDInsight, после чего создали и выполнили задачу Hadoop MapReduce с применением потоковой передачи Hadoop.
Затем мы перешли к технологии Spark и ее применению для создания высокопроизводительных приложений больших данных, работающих в реальном времени. Мы использовали возможности программирования Spark в функциональном стиле «фильтрация/отображение/свертка» — сначала в стеке Jupyter Docker, работающем локально на вашем компьютере, а затем с многоузловым кластером Spark c использованием Microsoft Azure HDInsight. Затем был представлен механизм Spark Streaming для обработки данных мини-пакетами: в примере Spark SQL использовался для запросов на выборку данных, хранящихся в коллекции Spark DataFrame.
Глава завершается кратким введением в «интернет вещей» (IoT) и модель публикации/подписки. Средства Freeboard.io использовались для создания визуализации живого потока данных от сервиса. Мы смоделировали термо16.9.
Итоги 861
стат с подключением к интернету, который публикует сообщения на бесплатном сервисе dweet.io с использованием модуля Python Dweepy, а затем воспользовались Freeboard.io для визуализации данных смоделированного устройства. Наконец, мы подписались на поток PubNub при помощи модуля Python.
Спасибо всем читателям. Хочется верить, что книга вам понравилась, а материал показался интересным и содержательным. Надеемся, что благодаря прочитанному вы обретете необходимую уверенность для успешного применения технологий, рассмотренных в книге, и решения задач, с которыми столкнетесь в своей карьере.
Пол Дейтел, Харви Дейтел
Python: Искусственный интеллект,
большие данные и облачные вычисления
Перевел с английского Е. Матвеев
Заведующая редакцией Ю. Сергиенко
Ведущий редактор К. Тульцева
Литературные редакторы М. Петруненко, М. Рогожин
Художественный редактор В. Мостипан
Корректоры Н. Викторова, М. Молчанова
Верстка Л. Егорова
Изготовлено в России. Изготовитель: ООО «Прогресс книга».
Место нахождения и фактический адрес: 194044, Россия, г. Санкт-Петербург,
Б. Сампсониевский пр., д. 29А, пом. 52. Тел.: +78127037373.
Дата изготовления: 03.2020. Наименование: книжная продукция. Срок годности: не ограничен.
Налоговая льгота — общероссийский классификатор продукции ОК 034-2014, 58.11.12 — Книги печатные профессиональные, технические и научные.
Импортер в Беларусь: ООО «ПИТЕР М», 220020, РБ, г. Минск, ул. Тимирязева, д. 121/3, к. 214, тел./факс: 208 80 01.
Подписано в печать 19.03.20. Формат 70×100/16. Бумага офсетная. Усл. п. л. 69,660. Тираж 1000. Заказ 0000.