Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Изучаем Spark. Молниеносный анализ данных

Покупка
Артикул: 635288.03.99
Доступ онлайн
519 ₽
В корзину
Объем обрабатываемых данных во всех областях человеческой деятельности продолжает расти быстрыми темпами. Существуют ли эффективные приемы работы с ним? В этой книге рассказывается об Apache Spark, открытой системе кластерных вычислений, которая позволяет быстро создавать высокопроизводительные программы анализа данных. C помощью Spark вы сможете манипулировать огромными объемами данных посредством простого API на Python, Java и Scala. Написанная разработчиками Spark, эта книга поможет исследователям данных и программистам быстро включиться в работу. Она рассказывает, как организовать параллельное выполнение заданий всего несколькими строчками кода, и охватывает примеры от простых пакетных приложений до программ, осуществляющих обработку потоковых данных и использующих алгоритмы машинного обучения.
Карау, Х. Изучаем Spark. Молниеносный анализ данных : практическое руководство / Х. Карау, Э. Конвински, П. Венделл, З. Матей ; пер. с англ. - 2-е изд. - Москва : ДМК Пресс, 2023. - 305 с. - ISBN 978-5-89818-320-2. - Текст : электронный. - URL: https://znanium.com/catalog/product/2102607 (дата обращения: 01.07.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Изучаем Spark

МОЛНИЕНОСНЫЙ  АНАЛИЗ  ДАННЫХ

Холден Карау, Энди Конвински, 
Патрик Венделл и Матей Захария
Learning Spark

LIGHTNING-FAST DATA ANALYSIS

Holden Karau, Andy Konwinski,
Patrick Wendell & Matei Zaharia
Изучаем Spark

МОЛНИЕНОСНЫЙ АНАЛИЗ ДАННЫХ

Холден Карау, Энди Конвински, 
Патрик Венделл и Матей Захария

Москва, 2023

2-е издание, электронное
УДК 004.65:004.43 Spark
ББК 32.972.34
К21

К21
Карау, Холден.
Изучаем Spark. Молниеносный анализ данных / Х. Карау, Э. Конвински, 
П. Венделл и др. ; пер. с англ. — 2-е изд., эл. — 1 файл pdf : 305 с. — Москва : 
ДМК Пресс, 2023. — Систем. требования: Adobe Reader XI либо Adobe 
Digital Editions 4.5 ; экран 10". — Текст : электронный.
ISBN 978-5-89818-320-2

Объем обрабатываемых данных во всех областях человеческой деятельности 
продолжает расти быстрыми темпами. Существуют ли эффективные приемы работы 
с ним? В этой книге рассказывается об Apache Spark, открытой системе кластерных 
вычислений, которая позволяет быстро создавать высокопроизводительные 
программы анализа данных. C помощью Spark вы сможете манипулировать огромными 
объемами данных посредством простого API на Python, Java и Scala.
Написанная разработчиками Spark, эта книга поможет исследователям данных 
и программистам быстро включиться в работу. Она рассказывает, как организовать 
параллельное выполнение заданий всего несколькими строчками кода, и охватывает 
примеры от простых пакетных приложений до программ, осуществляющих обработку 
потоковых данных и использующих алгоритмы машинного обучения.

УДК 004.65:004.43 Spark 
ББК 32.972.34

Электронное издание на основе печатного издания: Изучаем Spark. Молниеносный анализ 
данных / Х. Карау, Э. Конвински, П. Венделл и др. ; пер. с англ. — Москва : ДМК Пресс, 2015. — 
304 с. — ISBN 978-5-97060-323-9. — Текст : непосредственный.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было 
форме и какими бы то ни было средствами без  письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических 
ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность 
приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные 
с использованием книги

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами 
защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.


ISBN 978-5-89818-320-2
© 2015 Databricks
© Оформление, издание, ДМК Пресс, 2015
Содержание

Предисловие ...........................................................10

Вступление ............................................................ 11

Глава 1. Введение в анализ данных с помощью Spark .....18
Что такое Apache Spark? ...................................................................................18
Унифицированный стек ....................................................................................19
Spark Core .........................................................................................................20
Spark SQL .........................................................................................................20
Spark Streaming ...............................................................................................21
MLlib ...................................................................................................................21
GraphX ...............................................................................................................22
Диспетчеры кластеров ..................................................................................22
Кто и с какой целью использует Spark? ......................................................22
Исследование данных ...................................................................................23
Обработка данных .........................................................................................24
Краткая история развития Spark ...................................................................24
Версии Spark .........................................................................................................26
Механизмы хранения данных для Spark ....................................................26

Глава 2. Загрузка и настройка Spark ............................27
Загрузка Spark ......................................................................................................27
Введение в командные оболочки Spark для Python и Scala .................29
Введение в основные понятия Spark ............................................................33
Автономные приложения .................................................................................35
Инициализация SparkContext ...................................................................36
Сборка автономных приложений .............................................................38
В заключение ........................................................................................................41

Глава 3. Программирование операций с RDD .................42
Основы RDD ........................................................................................................42
Создание RDD .....................................................................................................45
Операции с RDD .................................................................................................46
Преобразования ..............................................................................................46
Действия ............................................................................................................47
Отложенные вычисления ............................................................................49
Передача функций в Spark ...............................................................................50
Python ................................................................................................................50
Scala .....................................................................................................................51
Java ......................................................................................................................52
 Содержание

Часто используемые преобразования и действия ...................................54
Простые наборы RDD ..................................................................................54
Преобразование типов RDD  .....................................................................63
Сохранение (кэширование).............................................................................65
В заключение ........................................................................................................68

Глава 4. Работа с парами ключ/значение ......................69
Вступление ............................................................................................................69
Создание наборов пар ........................................................................................70
Преобразования наборов пар ..........................................................................71
Агрегирование .................................................................................................73
Группировка данных .....................................................................................80
Соединения ......................................................................................................81
Сортировка .......................................................................................................82
Действия над наборами пар ключ/значение .............................................83
Управление распределением данных ...........................................................84
Определение объекта управления распределением RDD ...............88
Операции, получающие выгоды от наличия информации 
о распределении ..............................................................................................89
Операции, на которые влияет порядок распределения ....................90
Пример: PageRank ..........................................................................................91
Собственные объекты управления распределением .........................93
В заключение ........................................................................................................96

Глава 5. Загрузка и сохранение данных ........................97
Вступление ............................................................................................................97
Форматы файлов .................................................................................................98
Текстовые файлы ............................................................................................99
JSON ................................................................................................................ 101
Значения, разделенные запятыми, и значения, разделенные 
табуляциями ................................................................................................. 104
SequenceFiles ................................................................................................. 108
Объектные файлы ....................................................................................... 111
Форматы Hadoop для ввода и вывода  ................................................ 112
Сжатие файлов ............................................................................................. 117
Файловые системы .......................................................................................... 118
Локальная/«обычная» файловая система .......................................... 118
Amazon S3 ...................................................................................................... 119
HDFS ............................................................................................................... 119
Структурированные данные и Spark SQL ............................................... 120
Apache Hive ................................................................................................... 121
JSON ................................................................................................................ 122
Базы данных ....................................................................................................... 123
Содержание  7

Java Database Connectivity ....................................................................... 123
Cassandra ........................................................................................................ 124
HBase ............................................................................................................... 127
Elasticsearch ................................................................................................... 127
В заключение ..................................................................................................... 129

Глава 6. Дополнительные возможности Spark ..............130
Введение .............................................................................................................. 130
Аккумуляторы ................................................................................................... 131
Аккумуляторы и отказоустойчивость ................................................. 135
Собственные аккумуляторы ................................................................... 136
Широковещательные переменные ............................................................. 136
Оптимизация широковещательных рассылок .................................. 139
Работа с разделами по отдельности ........................................................... 140
Взаимодействие с внешними программами ........................................... 143
Числовые операции над наборами RDD ................................................. 147
В заключение ..................................................................................................... 149

Глава 7. Выполнение в кластере ................................150
Введение .............................................................................................................. 150
Архитектура среды Spark времени выполнения ................................... 151
Драйвер ........................................................................................................... 151
Исполнители................................................................................................. 153
Диспетчер кластера .................................................................................... 153
Запуск программы ...................................................................................... 154
Итоги ............................................................................................................... 154
Развертывание приложений с помощью spark-submit ........................ 155
Упаковка программного кода и зависимостей ....................................... 158
Сборка приложения на Java с помощью Maven ............................... 159
Сборка приложения на Scala с помощью sbt ..................................... 161
Конфликты зависимостей ........................................................................ 163
Планирование приложений и в приложениях Spark .......................... 163
Диспетчеры кластеров .................................................................................... 164
Диспетчер кластера Spark Standalone .................................................. 165
Hadoop YARN ............................................................................................... 169
Apache Mesos................................................................................................. 171
Amazon EC2 ................................................................................................... 173
Выбор диспетчера кластера .......................................................................... 176
В заключение ..................................................................................................... 177

Глава 8. Настройка и отладка Spark ............................178
Настройка Spark с помощью SparkConf ................................................... 178
Компоненты выполнения: задания, задачи и стадии .......................... 181
 Содержание

Поиск информации ......................................................................................... 189
Веб-интерфейс Spark ................................................................................. 189
Журналы драйверов и исполнителей ................................................... 193
Ключевые факторы, влияющие на производительность ................... 195
Степень параллелизма .............................................................................. 195
Формат сериализации ............................................................................... 196
Управление памятью .................................................................................. 198
Аппаратное обеспечение ........................................................................... 199
В заключение ..................................................................................................... 201

Глава 9. Spark SQL ..................................................202
Включение Spark SQL в приложения ....................................................... 203
Использование Spark SQL в приложениях ............................................ 205
Инициализация Spark SQL ..................................................................... 205
Пример простого запроса ......................................................................... 207
Наборы данных SchemaRDD .................................................................. 208
Кэширование ................................................................................................ 210
Загрузка и сохранение данных .................................................................... 211
Apache Hive ................................................................................................... 212
Parquet ............................................................................................................. 213
JSON ................................................................................................................ 214
Из RDD........................................................................................................... 216
Сервер JDBC/ODBC ................................................................................. 217
Работа с программой Beeline ................................................................... 219
Долгоживущие таблицы и запросы ...................................................... 220
Функции, определяемые пользователем ................................................. 221
Spark SQL UDF ........................................................................................... 221
Hive UDF ....................................................................................................... 222
Производительность Spark SQL ................................................................. 223
Параметры настройки производительности ..................................... 223
В заключение ..................................................................................................... 225

Глава 10. Spark Streaming .........................................226
Простой пример ................................................................................................ 227
Архитектура и абстракция ............................................................................ 230
Преобразования ................................................................................................ 234
Преобразования без сохранения состояния ...................................... 234
Преобразования с сохранением состояния ........................................ 238
Операции вывода ............................................................................................. 244
Источники исходных данных ...................................................................... 245
Основные источники ................................................................................. 246
Дополнительные источники ................................................................... 247
Множество источников и размеры кластера ..................................... 252
Содержание  9

Круглосуточная работа  ................................................................................. 252
Копирование в контрольных точках .................................................... 253
Повышение отказоустойчивости драйвера ........................................ 254
Отказоустойчивость рабочих узлов ..................................................... 255
Отказоустойчивость приемников ......................................................... 256
Гарантированная обработка..................................................................... 257
Веб-интерфейс Spark Streaming .................................................................. 257
Проблемы производительности .................................................................. 258
Интервал пакетирования и протяженность окна ............................ 258
Степень параллелизма  ............................................................................. 259
Сборка мусора и использование памяти ............................................ 259
В заключение ..................................................................................................... 260

Глава 11. Машинное обучение с MLlib ........................261
Обзор .................................................................................................................... 261
Системные требования .................................................................................. 263
Основы машинного обучения ...................................................................... 263
Пример: классификация спама .............................................................. 265
Типы данных ...................................................................................................... 269
Векторы .......................................................................................................... 269
Алгоритмы .......................................................................................................... 271
Извлечение признаков .............................................................................. 271
Статистики .................................................................................................... 275
Классификация и регрессия .................................................................... 276
Кластеризация ............................................................................................. 282
Коллаборативная фильтрация и рекомендации .............................. 283
Понижение размерности .......................................................................... 285
Оценка модели ............................................................................................. 287
Советы и вопросы производительности .................................................. 288
Выбор признаков ......................................................................................... 288
Настройка алгоритмов .............................................................................. 289
Кэширование наборов RDD для повторного использования ..... 289
Разреженные векторы ............................................................................... 290
Степень параллелизма .............................................................................. 290
Высокоуровневый API машинного обучения ........................................ 290
В заключение ..................................................................................................... 292

Предметный указатель ............................................293
Предисловие

За очень короткое время после появления Apache Spark – фреймворк 
следующего поколения для быстрой обработки больших объемов 
данных – получил повсеместное распространение. Spark превосходит 
фреймворк Hadoop MapReduce, который дал импульс революции 
в обработке больших объемов данных, по множеству ключевых 
параметров: он намного быстрее, намного проще в использовании 
благодаря богатому API и может применяться для создания не только 
приложений пакетной обработки данных разной мощности, но 
и интерактивных приложений, приложений потоковой обработки 
данных, машинного обучения и обработки графов.
Я был тесно вовлечен в разработку Spark на всех этапах этого процесса, 
от чертежной доски до образования самого активного из современных 
открытых проектов и одного из самых активных проектов 
Apache! Мне было особенно приятно, что Матей Захария (Matei 
Zaharia), создатель Spark, объединился с другими давнишними разработчиками 
Spark – Патриком Венделлом (Patrick Wendell), Энди 
Конвински (Andy Konwinski) и Холденом Карау (Holden Karau), – 
чтобы написать эту книгу.
В связи с быстрым ростом популярности Spark на передний план 
вышла проблема нехватки хороших справочных руководств. Авторы 
книги проделали длинный путь для ее решения, написав 11 глав 
и представив десятки подробных примеров, чтобы помочь специалистам 
в области анализа данных, студентам и программистам поближе 
узнать Spark. Она доступна читателям, не имеющим опыта работы 
с «большими данными», что делает ее отличной отправной точкой 
для начала изучения предметной области в целом. Я надеюсь, что 
много лет спустя читатели со светлым чувством будут вспоминать эту 
книгу как проводника в новый захватывающий мир.

– Ион Стоика (Ion Stoica), 
директор Databricks и содиректор AMPlab, 
Калифорнийский университет Беркли
Вступление

По мере вхождения в обиход анализа данных специалисты-практики 
во многих областях искали все более простые инструменты для решения 
этой задачи. Apache Spark быстро завоевал популярность как инструмент, 
расширяющий и обобщающий модель MapReduce. Фрейм-
ворк Spark имеет три основных преимущества. Во-первых, простота 
в использовании – с его помощью можно создавать приложения на 
ноутбуке, используя высокоуровневый API, который позволяет сконцентрироваться 
на предметной стороне вычислений. Во-вторых, высокая 
скорость работы, что дает возможность создавать интерактивные 
приложения и использовать сложные алгоритмы. И в-третьих, 
обобщенность, позволяющая объединять разнотипные вычисления 
(например, выполнять SQL-запросы, обрабатывать текст и реализовывать 
алгоритмы машинного обучения (machine learning)), для чего 
прежде необходимо было применять разрозненные инструменты. Все 
это делает Spark отличной отправной точкой на пути изучения аспектов 
обработки «больших данных» (Big Data).
Цель этого вводного руководства – помочь вам быстро настроить 
Spark и приступить к работе с ним. Здесь вы узнаете, как загрузить и запустить 
Spark на своем ноутбуке, как работать с ним в интерактивном 
режиме, чтобы поближе познакомиться с API. Затем мы рассмотрим 
особенности доступных операций и распределенных вычислений. В заключение 
мы совершим экскурс по высокоуровневым библиотекам, 
входящим в состав Spark, включая библиотеки для машинного обучения, 
потоковой обработки данных (stream processing) и SQL. Мы надеемся, 
что с этой книгой вы быстро сможете приступить к решению задач, 
связанных с анализом данных, как на одной, так и на сотнях машин. 

Кому адресована эта книга

Данная книга адресована специалистам в области анализа данных 
(или исследователям) и инженерам-программистам. Мы выбрали 
эти две группы, потому что они смогут извлечь наибольшую выгоду 
от привлечения фреймворка Spark для решения своих задач. Богатая 
коллекция библиотек (таких как MLlib), входящих в состав Spark, 
поможет специалистам в области анализа данных решать статистические 
задачи, непосильные единственному компьютеру. Программис-
 Вступление

ты, в свою очередь, узнают, как писать распределенные программы 
на основе Spark и как управлять промышленными приложениями. 
Программисты и исследователи по-разному будут воспринимать эту 
книгу, но и те, и другие смогут задействовать Spark для решения больших 
распределенных задач в своих областях.
Исследователи основное внимание уделяют ответам на вопросы 
и разработке моделей на основе данных. Они часто имеют математическую 
подготовку, и некоторые из них знакомы с такими инструментами, 
как Python, R и SQL. Мы постарались включить в книгу 
примеры программного кода на Python и, где это необходимо, на 
SQL, а также обзор библиотек и особенностей поддержки машинного 
обучения в Spark. Если вы – исследователь, специалист в области 
анализа данных, мы надеемся, что после прочтения нашей книги вы 
сможете использовать те же математические подходы для решения 
задач, только намного быстрее и в более широком масштабе.
Вторая целевая группа данной книги – инженеры-программисты, 
имеющие некоторый опыт программирования на Java, Python или 
других языках. Если вы – программист, мы надеемся, что благодаря 
этой книге вы научитесь настраивать кластеры Spark, пользоваться 
командной оболочкой Spark и писать Spark-приложения для организации 
параллельных вычислений. Знакомые с фреймворком Hadoop 
уже знают, как взаимодействовать с HDFS и управлять кластерами, 
но, как бы то ни было, мы все равно опишем основные понятия распределенных 
вычислений.
Кем бы вы ни были, исследователем или программистом, чтобы извлечь 
максимум из этой книги, необходимо иметь знакомство с любым 
из языков программирования: Python, Java, Scala или им подобным. 
Мы полагаем, что у вас уже реализовано решение хранилища 
для ваших данных, поэтому мы охватим лишь наиболее общие подходы 
к загрузке и сохранению данных, но не будем обсуждать вопросы 
их реализации. Если у вас пока нет опыта использования ни одного 
из перечисленных языков, не волнуйтесь: существуют великолепные 
книги, которые помогут в овладении ими. Некоторые из таких книг 
мы упомянем в разделе «Книги поддержки» ниже.

Как организована эта книга

Главы в этой книге следуют в порядке изучения материала. В начале 
каждой главы мы будем сообщать, какие ее разделы, по нашему мнению, 
больше подходят для исследователей, а какие – для программис-
Вступление  13

тов. При этом мы надеемся, что все разделы будут доступны читателям 
с любым уровнем подготовки.
Первые две главы описывают порядок установки на ноутбук фрейм-
ворка Spark в базовой конфигурации и демонстрируют, чего можно 
достичь с его помощью. После установки и знакомства с некоторыми 
возможностями мы погрузимся в командную оболочку Spark – инструмент, 
очень удобный для разработки и прототипирования. В последующих 
главах подробно обсуждаются программный интерфейс 
Spark, порядок выполнения приложений в кластерах и высокоуровневые 
библиотеки, доступные в Spark (такие как Spark SQL и MLlib).

Книги поддержки

Исследователям, не имеющим опыта использования Python, отличным 
введением в этот язык программирования могут послужить книги «
Learning Python»1 и «Head First Python» (обе выпущены издательством 
O’Reilly). Имеющим некоторый опыт программирования 
на Python, но желающим изучить его глубже можно порекомендовать 
книгу «Dive into Python» (Apress).
Инженерам-программистам, а также всем, кто прочтет эту книгу, 
для расширения познаний в области обработки данных мы рекомендуем 
книги «Machine Learning for Hackers» и «Doing Data Science» 
(обе выпущены издательством O’Reilly).
Эта книга написана языком, доступным для начинающих. В дальнейшем 
мы предполагаем написать более подробную книгу для тех, 
кто пожелает глубже вникнуть во внутреннее устройство Spark.

Типографские соглашения

В этой книге приняты следующие типографские соглашения:

Курсив
Используется для обозначения новых терминов, адресов электронной 
почты, имен файлов и расширений имен файлов. 

Моноширинный шрифт
Применяется для оформления листингов программ и программных 
элементов внутри обычного текста, таких как имена перемен-

1 Лутц М. Изучаем Python. 4-е изд. М.: Символ-Плюс, 2010. ISBN: 978-5-
93286-159-2. – Прим. перев.
 Вступление

ных и функций, типов данных, переменных окружения, инструкций 
и ключевых слов.

Моноширинный жирный
Обозначает команды или другой текст, который должен вводиться 
пользователем.

Моноширинный курсив
Обозначает текст, который должен замещаться фактическими 
значениями, вводимыми пользователем или определяемыми из контекста.

 
Так обозначаются советы, предложения и примечания общего характера.

 
Так обозначаются предупреждения и предостережения.

Использование программного кода 
примеров

Все примеры программного кода, что приводятся в этой книге, доступны 
в репозитории GitHub. Их можно получить по адресу: https://
github.com/databricks/learning-spark. Примеры кода написаны на языках 
Java, Scala и Python.

 Примеры на языке Java написаны для выполнения под управлением 
Java 6 и выше. В Java 8 появилась поддержка лямбда-выражений, облегчающих 
создание встраиваемых (inline) функций, благодаря чему код, 
использующий фреймворк Spark, получается намного более простым. 
Мы решили не использовать этот синтаксис в основных примерах, поскольку 
версия Java 8 пока не получила широкого распространения. 
Если вам интересно будет попробовать синтаксис Java 8, прочитайте 
статью в блоге Databricks1. Некоторые из примеров мы переписали на 
Java 8 и сохранили в репозитории GitHub.

Данная книга призвана оказать вам помощь в решении ваших задач. 
Вы можете свободно использовать примеры программного кода 
из этой книги в своих приложениях и в документации. Вам не нужно 
обращаться в издательство за разрешением, если вы не собираетесь 
воспроизводить существенные части программного кода. Например, 
если вы разрабатываете программу и используете в ней несколько 
отрывков программного кода из книги, вам не нужно обращаться за 

1 http://bit.ly/1ywZBs4.
Вступление  15

разрешением. Однако в случае продажи или распространения компакт-
дисков с примерами из этой книги вам необходимо получить 
разрешение от издательства O’Reilly. Если вы отвечаете на вопросы, 
цитируя данную книгу или примеры из нее, получение разрешения не 
требуется. Но при включении существенных объемов программного 
кода примеров из этой книги в вашу документацию необходимо получить 
разрешение издательства.
Мы приветствуем, но не требуем добавлять ссылку на первоисточник 
при цитировании. Под ссылкой на первоисточник мы подразумеваем 
указание авторов, издательства и ISBN. Например: «Learning 
Spark by Holden Karau, Andy Konwinski, Patrick Wendell, and Matei 
Zaharia (O’Reilly). Copyright 2015 Databricks, 978-1-449-35862-4».
За получением разрешения на использование значительных объемов 
программного кода примеров из этой книги обращайтесь по 
адресу permissions@oreilly.com.

Safari® Books Online

Safari Books Online (http://www.safaribooksonline.com) – это виртуальная 
библиотека, содержащая авторитетную информацию1 в виде книг 
и видеоматериалов, созданных ведущими специалистами в области 
технологий и бизнеса. 
Профессионалы в области технологии, разработчики программного 
обеспечения, веб-дизайнеры, а также бизнесмены и творческие 
работники используют Safari Books Online как основной источник 
информации для проведения исследований, решения проблем, обучения 
и подготовки к сертификационным испытаниям.
Библиотека Safari Books Online предлагает широкий выбор продуктов 
и тарифов2 для организаций3, правительственных4 и учебных5 
учреждений, а также физических лиц. 
Подписчики имеют доступ к поисковой базе данных, содержащей 
информацию о тысячах книг, видеоматериалов и рукописей от таких 
издателей, как O’Reilly Media, Prentice Hall Professional, Addison-
Wesly Professional, Microsoft Press, Sams, Que, Peachpit Press, Focal 
Press, Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, 

1 https://www.safaribooksonline.com/explore/.
2 https://www.safaribooksonline.com/pricing/.
3 https://www.safaribooksonline.com/enterprise/.
4 https://www.safaribooksonline.com/government/.
5 https://www.safaribooksonline.com/academic-public-library/.
Доступ онлайн
519 ₽
В корзину