Академический Документы
Профессиональный Документы
Культура Документы
Apache Spark (от англ. spark — искра, вспышка) — фреймворк с открытым исходным
кодом для реализации распределённой обработки неструктурированных и
слабоструктурированных данных, входящий в экосистему проектов Hadoop. В отличие от
классического обработчика из ядра Hadoop, реализующего двухуровневую концепцию
MapReduce с хранением промежуточных данных на накопителях, Spark работает в
парадигме резидентных вычислений (англ. in-memory computing) — обрабатывает данные
в оперативной памяти, благодаря чему позволяет получать значительный выигрыш в
скорости работы для некоторых классов задач[7], в частности, возможность многократного
доступа к загруженным в память пользовательским данным делает библиотеку
привлекательной для алгоритмов машинного обучения[8].
История появления и развития Hadoop
2002
Дуг Каттинг и Майк Кафарелла работают над проектом Apache Nutch, целью которого
является создание веб-поисковой системы, способной просматривать и индексировать
веб-сайты.
После долгих исследований Майк Кафарелла и Даг Каттинг подсчитали, что для
системы, поддерживающей индекс в один миллиард страниц, потребуется около
$500000 на оборудование с ежемесячными текущими расходами в $30 000.
Этот проект оказался слишком дорогим и поэтому был признан невыполнимым для
индексирования миллиардов веб-страниц. Поэтому они искали приемлемое решение,
которое позволило бы снизить стоимость.
2003
Компания Google выпускает статью о распределенной файловой системе Google
(GFS), в котором описывалась архитектура GFS, представляющая идею хранения
больших массивов данных в распределенной среде. Эта статья решала проблему
хранения больших файлов, создаваемых в процессе индексации и сканирования
веб-страниц. Но это лишь половина решения проблемы.
2004
Разработчики Nutch приступили к написанию открытой реализации Nutch Distributed
File System (NDFS).
Компания Google выпускает статью о MapReduce. В статье было решение для
обработки больших массивов данных.
Разработчики Nutch внедрили MapReduce в середине 2004 года.
2006
Сообщество Apache осознало, что реализация MapReduce и NDFS может быть
использована и для других задач. В феврале 2006 года они вышли из Nutch и
сформировали независимый подпроект Lucene под названием "Hadoop".
2011 – 2012
27 декабря 2011 года Apache выпустил Hadoop версии 1.0, включающей поддержку
Security, Hbase и др.
23 мая 2012 года была выпущена версия Hadoop 2.0.0-alpha. Этот релиз содержит
YARN.
2017 – …
13 декабря 2017 года был доступен релиз 3.0.0
Hadoop 1 vs Hadoop 2
2. Демоны:
Hadoop 1 Hadoop 2
Namenode Namenode
Datanode Datanode
3. Работа:
В Hadoop 1 есть HDFS, которая используется для хранения данных, и Map Reduce,
который работает как управление ресурсами, так и обработка данных. Из-за такой
нагрузки на Map Reduce, это влияет на производительность.
В Hadoop 2 снова есть HDFS, которая используется для хранения данных, а поверх
HDFS есть YARN, который работает как управление ресурсами. Он в основном
распределяет ресурсы и поддерживает все процессы.
4. Ограничения:
Hadoop 1 представляет собой архитектуру Master-Slave. Она состоит из одного
ведущего узла и нескольких ведомых. Предположим, если ведущий узел вышел из
строя, то независимо от того, насколько хороши ваши ведомые узлы, ваш кластер
будет разрушен. Опять же, для создания такого кластера необходимо копировать
системные файлы, файлы образов и т.д. на другую систему, что занимает слишком
много времени и не может быть приемлемо для организаций в наше время.
Hadoop 2 vs Hadoop 3
Hadoop 2 Hadoop 3
Источники информации:
https://www.bigdataschool.ru/wiki/hadoop
https://data-flair.training/blogs/hadoop-history/
https://www.geeksforgeeks.org/difference-between-hadoop-1-and-hadoop-2/
https://www.geeksforgeeks.org/difference-between-hadoop-2-x-vs-hadoop-3-x/?ref=rp
Комментарии лектора: HDFS + Hive + Spark (но он как дополнение, не как основа) +
Yarn
Основные стадии развития: MapReduce у Гугла, хадуп версия 1, 2, 3 (лектор говорит,
что изменений не много)
Hadoop RDBMS
Плюсы
Плюсы
Простота использования
Это одно из самых больших преимуществ реляционной базы данных; РСУБД имеет
удобный для пользователя формат таблиц, данные в которых организованы в
соответствии с естественной структурой. Это также облегчает доступ к данным и
манипулирование ими, а также позволяет легко находить совпадающие записи.
Сетевой доступ
Программа в РСУБД разработана специально для перехвата запросов, передаваемых
по сети, облегчая взаимодействие клиента с базой данных. Пользователям не нужно
входить в систему для доступа к базе данных или ее использования, что обеспечивает
им большее удобство.
Язык
РСУБД поддерживает SQL, стандартный и знакомый язык; он имеет простой синтаксис
и использует английские фразы и ключевые слова, что делает его легким для изучения
и понимания. RDBMS также имеет возможность вставлять ключевые слова,
возможности и функции, не связанные с базой данных SQL.
Производительность
RDBMS по своей сути не является быстродействующей базой данных, но при
проектировании базы данных в нее встроено несколько оптимизаций, которые
фактически повышают производительность. В конечном итоге это приводит к высокой
производительности всех наборов данных и приложений.
Обслуживание
Обслуживать RDBMS проще, так как команда технической поддержки или
администраторы баз данных могут контролировать, тестировать, обслуживать и
выполнять резервное копирование баз данных, которые они имеют в своей основной
системе. Эти функции автоматизированы с помощью встроенных средств
автоматизации в операционной системе РСУБД.
Привилегии и безопасность данных
Доступ к базе данных контролируется и подлежит аутентификации администратором
базы данных, который имеет право предоставлять или отклонять доступ
пользователей. Это повышает безопасность базы данных.
Минусы
Стоимость
Создание и поддержка базы данных - довольно дорогое удовольствие, и,
следовательно, это один из самых больших недостатков РСУБД.
Специальное программное обеспечение, необходимое для создания и настройки
реляционной базы данных, стоит довольно дорого. Обновление всей информации для
обеспечения работоспособности программы также может оказаться сложной задачей,
особенно если ваша организация большая и имеет сложную базу данных.
В таких случаях может потребоваться помощь опытных программистов извне, чтобы
построить РСУБД на основе SQL. Вам также понадобится опытный администратор
РСУБД для управления и контроля над базой данных.
Недостаточная скорость
По сравнению с другими типами баз данных, RDBMS извлекает результаты довольно
медленно, и поэтому производительность значительно ниже.
Память
Поскольку СУБД хранит данные в таблицах, имеющих строки и столбцы, она занимает
большой объем физической памяти. Это означает дополнительные затраты на
увеличение объема памяти и является существенным недостатком.
Источники информации:
https://www.bigdataschool.ru/blog/acid-transactions-in-hive.html
https://www.geeksforgeeks.org/hadoop-pros-and-cons/
https://www.educba.com/hadoop-vs-rdbms/
https://webandcrafts.com/blog/advantages-disadvantages-rdbms/
Репликация DataNode
Файлы в hdfs, как и в обычных файловых системах бьются на блоки, это позволяет
шардировать один большой файл, если он не помещается на 1 диск, а также сократить
время репликации, реплицируя только часть файла при изменении, а не весь.
При этом неймнода старается выбирать data nodы из разных стоек для репликации
блока, чтобы повысить отказоустойчивость. При этом когда необходимо прочитать
очередной блок, она выбирает для чтения ноду которая ближе всего к тому, кто
запрашивает данные.
Ребалансинг кластера
По сути сервис снапшотов. Чтобы понять зачем он нужен стоит упомянуть как
работает namenode
Неймнода обеспечивает персистентность храня логи на диске + inmemory структуру
для быстрой обработки запросов, иногда надо делать лог компакшн и снапшот этой
инмемори структуры (иначе на следующем рестарте восстанавливать её из лога
длиной в несколько лет может занять продолжительное время).
Это требует дополнительных ресурсов которых и так не хватает. Соответственно
заведём вторичную неймноду которой будем транслировать наш лог, а она просто
будет делать из него снапшоты. Тогда при рестарте основной неймноды мы можем
просто стянуть у неё снапшот и докинуть не снапшотнутые изменения из своего лога,
что уменьшит даунтайм всего кластера.
При этом никогда не стоит использовать вторичную ноду для обработки
каких-либо запросов, так как это ломает линеаризуемость системы
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html
#Secondary_NameNode
Идея: давайте добавим вторую ноду которая будет выполнять функции вторичной пока
жива первичная, а как только первичная умрёт, возьмет на себя её функции.
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilit
yWithQJM.html
https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.1.2/bk_system-admin-guide/conten
t/ch_hadoop-ha-1.html
HDFS Federation
Комментарии лектора: Цикл коммита файла на HDFS, когда у нас блоки, блоки
реплицированные. Когда выпадает одна из датанод, как хадуп понимает, что она
выпала (NameNode перестала получать от упавшей ноды хартбиты). Что происходит
когда неймнода восстанавливает реплику и как она ее восстанавливает.
Как NameNode понимает, что DataNode выключилась. При выключении DataNode она
перестает отправлять актуальную информацию о своем состоянии в NameNode.
Соответственно NameNode из-за отсутствия хартбитов понимает, что у нас пропали
какие-то реплики.
Что делает NameNode при отключении DataNode. Так как вся метадата хранится на
NameNode и мы можем легко понять с каких нод надо переместить информацию.
Далее информация о блоках добавляется в очередь с приоритетами (чтобы реплики,
которых осталось мало реплицировались в первую очередь), а после NameNode
отправляет команды нодам, что нужно отреплицировать такой-то блок данных на
такую-то другую ноду.
Комментарии лектора: Сказать про то как файлы хранятся в HDFS, про метаданные
на NameNode, то что NameNode является узким местом. То что в 3 версии хадупа есть
HDFS Federation. Маленькие файлы создают неоправданно большую нагрузку + если
файл меньше блока, то занимает много неэффективного места.
Теперь перейдем к проблемам. Для NameNode основная проблема будет в том, что
хранить мы будем очень много метадаты, так как архитектура Хадупа нацелена
именно на много данных из одного файла, а не на много данных из разных файлов.
Например, обычно одна структура для блока данных содержит 150 байт, значит, если
мы храним 1 файл на 16гб и блоки у нас по 256мб, то метаданных будет (16гб / 256мб)
* 150б = 9.6кб. А если мы храним те же 16гб, но в 1000 файлов по ~16мб, то
метаданных будет 1000 * 150б = 150кб (по одной структуре для каждого файла).
Фактически храним на NameNode в 15 раз больше метаданных при том, что
исходный общий размер файлов одинаковый. При расчетах стоит сказать еще про
репликацию, что метаданных на самом деле будет в обоих случаях больше в 3 раза,
так как храним еще и копии.
Также могут быть проблемы с сетью. Так как много маленьких файлов могут быть
раскиданы по разным логическим блокам, то собрать их вместе, либо отправить
нужные бинарники к данным будет занимать гораздо больше RPC вызовов.
Помимо сети мы также будем тратить много ресурсов на создание мапперов. Так как
каждый маппер вычитывает данные отдельно из своего файла, а их у нас фактически
много, то мы должны будем создать сильно больше мапперов, для того, чтобы
отправить их считывать данные и отправлять задачи в редьюсеры.
Доп информация, про нее вроде не рассказывали на лекциях. Для того, чтобы
бороться с маленькими файлами используют либо HAR, который как-то архивирует
данные, чтобы потом маппер отправил их в Хадуп как отдельный блок. В
системе Хадупа иерархия заархивированных файлов будет отображаться
также, как и без нее.
Логи и NameNode.
NameNode хранит изменения в файловой системе в виде журнала изменений,
добавляемого к родному файлу. Когда NameNode запускается, сервис считывает
состояние HDFS из файла образа, fsimage, а затем применяет изменения из файла
журнала. После чего он записывает новое состояние HDFS в fsimage и начинает
обычную работу с пустым файлом правок. Поскольку NameNode объединяет fsimage и
редактирует файлы только во время запуска, файл журнала изменений может со
временем стать очень большим. Другим побочным эффектом большего файла
журнала изменений является то, что следующий перезапуск NameNode занимает
больше времени.
(Эта часть может быть не совсем корректной, про нее дефолтно лучше не
говорить). Но может быть такое, что по какой-то причине логи хранились в RAM и
пропали после перезагрузки. Вероятно в таком случае нам нужно сделать при старте
дополнительный запрос к SecondaryNameNode, чтобы запросить у нее те логи,
которые она успела достать до перезагрузки NameNode. В таком случае часть логов
все же может пропасть, так как логи отправляются на SecondaryNameNode пачками.
Но так как DataNode периодически отправляют актуальную информацию о себе, то
NameNode должна будет либо автоматически разрешить конфликты, либо отправить
какое-то предупреждение, что в системе проблема.
7) Является ли Hadoop отказоустойчивой системой? Благодаря
чему это достигается? Какие инциденты самые
неблагоприятные для Hadoop и почему?
Комментарии лектора: Рассказать все плюсы и минусы хадупа, чем он хорош и плох
в плане отказоустойчивости, доступности информации. Если потеряли 2/3 машин из
кластера, то 100% начали терять данные {хз мб про то, что обычно репликация с
фактором 3}. Рассказать, что NameNode является узким местом {так как она одна}.
Хадуп чувствителен к нагрузкам на нодах, если не балансировать распределение
данных между датанодами, то может так случиться, что постоянно ждут, когда
освободятся ресурсы на одной ноде
Дополненный ответ:
Hadoop переживает переживает отказы Data Node-ов. Это достигается хранением
резервных копий блоков или Erasure Coding. MapReduce переживает отказы узлов за
счет перезапуска задач. Однако может быть так, что отказ одного Reducer-а требует
перезапуска ВСЕХ Mapper-ов. Самый худший отказ это отказ NameNode, так как она
одна и отвечает за хранение всех метаданных про блоки. Есть разные способы как
пережить ее отказ, но все они не очень хорошие:
1. Регулярные Backup-ы - спасает только от полной потери данных
2. Secondary NameNode - позволяет разгрузить NameNode, а также может
заменить упавшую NameNode. Однако Secondary NameNode требует процесс
инициализации что бы стать основной.
3. Федерация - позволяет иметь разные NameNode для разных подпутей.
Комментарии лектора: Реплики блоков в хадупе хранятся сначала в одной стойке два
{вроде часть с его первого занятия} и один в другом датацентре, если есть
возможность. Рассказать про эту схему, зачем это делается и как лучше настраивать
Дополненный ответ:
Rack awareness в hadoop - это знания о расположении DataNode-ов по серверным
стойкам.
Replica Placement Policy - политика расположения реплик данных по DataNode-ам.
По умолчанию:
1. Для маленьких кластеров: 2 реплики на одной машине на разных дисках и еще
1 одна реплика на другой машине.
2. Для больших кластеров: 2 реплики на одной стойке в разных машинах и еще
одна на другой стойке.
Rack awareness вместе с Replica Placement Policy позволяют получать
отказоустойчивость и доступность минимизируя при этом передачу данных по сети.
Передавать данные между стойками дороже чем передавать внутри стойки, однако
сервера внутри одной стойки подвержены коррелированным отказам. По этому
стандартная политика располагает одну копию в той же стойке, на случай отказа
машины, и одну копию в другой стойке, на случай отказа стойки.
9) Что такое YARN? Как он выделяет ресурсы? Что такое
очереди?
Комментарии лектора: Yarn - ресурс менеджер. Рассказать про контейнеры ярна, про
то как он мониторит выделение ресурсов, как происходит распределение по очередям,
способы выделения ресурсов
2. По степени утилизации CPU (fair CPU-bound). При такой стратегии YARN смотрим на
общее потребление CPU кластера, и может добавлять задачи до тех пор, пока
улитизация не достигнет 100 процентов, либо мы не упремся в предел по RAM.
(например, если задача использует 10% CPU кластера при 12 контейнерах, мы
условно, считаем, что занято ceil(0.1 * 12) = 2 контейнера)
В целом, стратегия, основанная на RAM более безопасная, так как меньше шансов,
что произойдет какой-то segFault или что еще. Но в зависимости от специфики задачи
может использоваться как одна стратегия, так и другая.
Бонус: есть yarn distributed console для просмотра и записи логов ярна.
Метаданные.
"Киллер фича" Parquet в том, что у него очень содержательный header, в котором
много метаинфы. Есть три типа метаданных: о файле, о колонке и о странице
(подробнее). Parquet явно отделяет метаданные от данных для возможности разбивать
колонки на разные файлы или иметь один файл с метаданными, ссылающимися на
разные файлы данных. Метаданные пишутся после данных для single pass записей.
При чтении сначала берутся метаданные нужных колонок, которые потом
последовательно считываются.
Parquet vs Orc: Orc примерно так же устроен, только нет деления на chunk (=> хуже со
сложными форматами данных работает).
Плюсы/Минусы.
Плюсы:
- По сути это просто файлы => легко работать (перемещать, бэкапить, реплицировать)
- Колончатая структура для эффективности работы с данными
- Эффективное хранение с точки зрения занимаемого места (не говорите, если не
сможете объяснить почему :) )
Использование формата Parquet позволяет лучше сжимать данные, поскольку они
более однородны. Экономия места очень заметна в масштабах кластера Hadoop.
Минусы:
- Колончатая структура требует аккуратности с типами данных и со схемами
- Нет транзакций, тк по сути это не БД, а просто файлы
Input делится на блоки, желательно (и так чаще делают) чтобы блок лежал на той же
ноде где и mapper
Mapper (контейнер) выполняет работу над своим блокам и выдает пару (key, value).
Бередает вывод combiner_у.
Combiner берет и объединяет вывод mapper_а по ключу, чтобы уменьшить нагрузку на
перессылку данных ноде, где крутится reducer.
Partitioner решает на какой reducer лучше отправить вывод после combiner_а.
Shuffle отправляет данные на нужную ноду. Также можно сгруппировать данные по
ключам и например, отправлять данные с ключами A-K первому редьюсеру, остальные
другому.
Sort сортирует по ключам, чтобы reducer быстрее обработал
Reducer (контейнер) склеивает вывод после этапа map.
Количество reducer_ов можно задавать самим, либо hadoop сам посчитать сколько
нужно. Также можно настроить, что не надо ждать когда этап map завершиться
полностью, а уже отсылать данные reducer_у.
Дополнительно после завершения задачи map нода может сохранить на диск данные
обработки. Используется для того что если ноды упала, не надо ждать делать еще раз
этап mapm а можно просто считать с диска. Обычно сохранение на диск делается
параллельно с отправкой reducer_у( если делается конечно).
Комментарии лектора: Почти такой же как предыдущий вопрос, здесь больше упор на
мапредьюс задачи. Более глубокое устройство мапредьюс. Зачем надо
переопределять Partition, какие есть способы для Shuffle
Partitioner - модуль внутри той же ноды, что и Map, который определяет, на какой
именно Reducer надо отправить пару (Key, Value) в зависимости от Key.
Sort - происходит на ноде Reducer’а для того, чтобы все пары с одинаковым Key
лежали последовательно. Это позволяет быстро и удобно объединять (суммировать в
случае задачи WordCount) Value из пар с одинаковым Key.
Также может случиться ситуация, когда на один Reducer придёт очень много данных и
он взорвётся. Это значит, “все ждут одну задачу”, с точки зрения данных это
называется dataSkew (перекос в распределении данных на редьюсеры). Например, в
задаче WordCount, если в изначальных данных будут разбросаны слова с таким
итоговым распределением: {(“hello”, 10), (“world”, 100), (“и”, 1000000000)}. Для решения
такой проблемы, если мы знаем примерное структуру входных данных, можно
посолить ключ “и”, и сделать из него, например, “и” + rand(10), на этапе Partitioner. А
затем, либо вручную, либо запустить ещё раз MapReduce, и объединить все пары с
ключем “и” в один снова.
До MapReduce:
- До MapReduce существовал web-crawler Apache Nutch, который хорошо
справлялся с задачей на одной машине, однако не мог решать задачи
параллельно;
- Часто приходилось масштабироваться вертикально, на больших серверах -
экспоненциальный рост стоимости.
Плюсы MapReduce:
1) Высокая масштабируемость: можно гибко масштабироваться горизонтально на
множестве серверов с виртуальным разделением ресурсов;
a) В контексте Hadoop: в связке с YARN организует контейнеризацию
доступных ресурсов как пары vCPU + RAM, в дальнейшем контейнеры
динамически раскидываются между Job’ами;
2) Снижение стоимости обработки больших данных и входного порога: в
MapReduce кластере может использоваться commodity аппаратного
обеспечения, нет специфических требований к используемому железу
a) В контексте Hadoop: сам Hadoop - open-source решение в Apache - его
код выложен как opensource проект, при необходимости его можно
доработать/взять за основу своего решения;
3) Отделение управления ресурсами от выполнения задач (причина, почему
MapReduce упростил написание кода): MapReduce может служить абстракцией,
в которой описываются этапы вычислений без явного указания разделения
ресурсов на каждом этапе - не нужно беспокоиться за выделение памяти,
синхронизацию, concurrency;
a) В контексте Hadoop: не нужно переопределять все этапы MapReduce
всегда, можно пользоваться стандартными реализациями,
представленными Java-классами;
4) Отказоустойчивость: MapReduce может продолжать выполнение даже в случае
падения executor’ов.
a) В контексте Hadoop: при падении executor’ов Hadoop может как
повторно провести вычисления, так и воспользоваться оставшимися на
mapper’ах результатами(если они не завершились)/загрузить
промежуточные данные с HDFS.
Минусы MapReduce:
1) Решает ограниченный спектр задач: не все задачи хорошо распараллеливаются
или связаны с графами. Порядок операций в парадигме фиксируется, это
отнюдь не везде нужно;
2) Когда нужно большое количество взаимодействий между executor’ами: кажется,
Hadoop плохо подходит для задач, в которых, например, нужны частые
коммуникации между mapper’ов/reducer’ов друг с другом;
3) Плохо подходит для real-time обработки данных: вычисления медленные, есть
передача больших объёмов данных по сети:
a) В контексте Hadoop: медленный этап shuffle, много записей в HDFS,
накладные расходы на репликацию;
4) Тяжело справляется со сложными JOIN: JOIN с множественными комплексными
условиями спокойно способны свести сложность к квадратичной, что в
контексте множества записей на диск и передачи по сети усугубляет ситуацию;
5) Нет поддержки ACID и транзакций: обеспечение атомарности транзакций
затруднено сложной распределённой архитектурой, не подходит для
OLTP-решений.
Минусы Hadoop-реализации:
1) Накладные расходы: По умолчанию Hadoop довольно часто делает записи в
HDFS, присутствует overhead на этапе shuffle за счёт передачи данных по сети;
2) Name Node - узкое место: т. к. NN хранит данные о расположении блоков
файлов и принимает запросы, её отказ способен положить систему;
3) Неэффективная работа с множеством маленьких файлов: Hadoop начинает
тормозить, когда его заваливают мелкими файлами.
Что это?
Распределенный кэш в Hadoop это механизм, который используется для копирования
небольших файлов или архивов необходимых для вычислений на рабочие узлы.
Файлы в кэше read-only
Кроме того, YARN NodeManager поддерживает счетчик ссылок для количества задач,
использующих каждый файл в кэше. Перед запуском задачи этот счетчик
увеличивается, а после завершения уменьшается. При достижении 0 файл можно
удалять, потому что он больше не потребуется.
Плюсы
1. Позволяет распространять сложные типы файлов, такие как jar и различные
архивы
2. Обеспечивает консистентность, никакой процесс не может изменять файл в
кеше, пока этот файл используется
3. Кэш отказоустойчивый, потому что файлы хранятся на многих узлах
Минусы
1. Данные нельзя изменять
2. Предназначен для небольших файлов
15) Как работает HashJoin/ReduceSideJoin? В чем отличие
Map-Side Join и Hash Join? Когда какая стратегия Join’а
применяется?
В hadoop существует 3 основных вида джойнов:
1. Map Side Join используется, когда одна из входных таблиц маленькая и
помещается в память.
a. Каждый mapper загружает маленькую таблицу в память и строит по ней
HashTable
b. Обходит свою часть большой таблицы и для каждого значения ищет пару
в хеш-таблице
c. Записывает полученные пары в ответ
Этот алгоритм работает быстро, но его можно использовать только если одна из
таблиц маленькая.
2. Reduce Side Join = Hash Join = Shuffle Join - стандартный алгоритм,
используемый для джойнов, он тяжелый, медленный, но работает всегда.
a. Маппер добавляет к паре (key; value) идентификатор таблицы, чтобы
получилась тройка (key, table_id, value) и передает эти данные на shuffle
b. Shuffle группирует данные только по ключу и передает на reducer-ы
c. Reducer сортирует данные по table_id; затем сплитит их по table_id,
чтобы отделить данные из разных таблиц друг от друга; делает cross join
данных из разных таблиц и записывает ответ.
3. Merge Join = Sort Join - используется, если обе таблицы отсортированы по
ключу. Применяется алгоритм 2-х указателей.
Для более формальной постановки будем считать, что данные нам даны как в дз по
БФС. То есть построчно записаны пары чисел, которые задают концы ребер. В конце
хотим получить пары чисел - номер вершины и id компоненты, в которой она
находится.
Если кратко описывать решение, то будем каждый раз брать минимальный номер
компоненты среди соседей. Так мы для каждой компоненты фактически сделаем ее
номер равным минимальной вершине из этой компоненты. Потратим на это не больше
Н итераций.
Подготовительная фаза
Основная фаза
Восстановление ответа
Комментарии лектора: Надо рассказать о том, что TEZ это про направленный
ацикличный граф вычислений и можно в отличии от мапредьюса не обязательно все
материализовывать в HDFS результат мапредьюс стадий + можно передавать данные
внутри ноды {мб это про то, что делаем отложенные операции, а не записываем сразу
на диск, но мне казалось, что такое спарк в первых версиях делал}. Собственно
рассказать про фичи TEZ и почему он появился
Комментарии лектора: Вопрос про то, что в Hive нет апдейтов, нет удалений, потому
что хадуп в принципе аппенд онли {не оч понял, в HDFS точно можно удалять файлы,
но мб где-то в лекциях про это говорится}. Он еще что-то сказал, что директивы update
и delete под собой скрывают директивы полного удаления и перезаписи {тут надо
посмотреть лекции, я не оч понял, что имеется в виду}. Можно упомянуть некоторые
оконные функции, которых нет в Hive из-за сложности их реализации и из-за
отсутствия индексов
22) Хорошая ли идея подключить Hive к BI инструменту?
Почему? Какие альтернативы?
Почему она плохая, во-первых потому, что Hive не поддерживает часть стандартных
sql операций, в результате чего, если подключаться через jdbc - есть шанс того, что BI
сгенерирует запрос, который hive не сможет обработать.
Достоинства:
● Партиционирование помогает оптимизировать некоторые типы запросов
к СУБД. В особенности это касается запросов с WHERE. Например, если
таблица партиционирована по значению колонки country, и приходит
запрос с “WHERE country == “RU” ”, то для ответа на запрос понадобится
прочитать содержимое только одной директории, в которой лежит
меньше данных, чем во всей таблице;
● Также партиционирование может помочь для запросов с GROUP BY, где
группировка происходит по тем же колонкам, по которым происходило
партиционирование, так как данные по сути уже сгруппированы, и запрос
можно распараллелить, выполняя его одновременно для каждой из
директорий со сгруппированными данными;
● Можно эффективнее распределять данные по дискам, так как
директории, получившиеся в результате partitioning’а могут храниться в
разных местах.
Недостатки:
● Чем больше партиций, тем больше образуется файлов и директорий, и
тем труднее хранить и поддерживать связанные с ними метаданные;
● Некоторые запросы будут наоборот выполняться менее эффективно
(например, SELECT с WHERE по НЕ партиционированным колонкам), так
как придётся обходить множество директорий вместо одной, а также
задач в MapReduce процессах будет больше.
Лекция: тута
Минусы:
● Лектор еще упомянул, что в CH отсутствуют UDF, но вроде бы в клике что-то
подобное уже есть, вот ссыль на доки: тык (возможно недавно выкатили).
● Словари подгружаются на лету, но грузятся в оперативную память и могут
сильно её отъедать.
● Синтаксис SQL сильно ограничен в плане поддержки UPDATE/DELETE.
● Среди оптимизаций есть
Вывод: CH нужен если есть много данных и нужно что-то быстро просмотреть,
проанализировать и нарисовать. В то же время плохо работает с запросами
JOIN/UPDATE/DELETE, в случаях если данные нужно часто обновлять или джойнить,
может быть лучшим решением заюзать что-то другое.
Не авторский комментарий:
JOIN: после вот этого коммита товарища Скворцова
https://github.com/ClickHouse/ClickHouse/pull/38191, плохость джоинов кликхауса ушла в
прошлое
UPDATE/DELETE: При использовании движков семейства CollapsingMergeTree и
VersionedCollapsingMergeTree можно выполнять update и delete по цене INSERT
Главная проблема кликхауса это отсутствие транзакций, то есть нельзя конкурентно
делать update/delete as is что действительно создаёт некоторую головную боль.
На текущий момент нет вообще ни единой причины использовать не ClickHouse если у
вас нет денег на лицензию Vertica и вам не нужны транзакции (если нужны стоит
посмотреть в сторону CockroachDB)
Лекция тут
Spark (Apache Spark) - опенсорсная система для аналитики (analytics engine) больших
данных. Представляет из себя только саму систему для надежного хранения и
исполнения запросов, для работы ему требуется распределенное файловое
хранилище и система менеджмента кластера. Поддерживается богатый выбор
приложений для этих задач и собственный Spark Cluster. Является очень популярным
решением для компаний среднего размера. Внутри поддерживает исполнение
ациклических графов задач и стриминговый режим. Написан на Scala
Краткая история:
Этап Операции
Также MapReduce требует строго линейное исполнение, что не всегда удобно - частый
пример ML и итеративное улучшение.
2012 - проект попадает в Apache (Apache Spark), изначально надстройка над HDFS
Структура (с лекции):
Spark Driver - мастер сервер, раздает задачи на исполнение к Spark Executors, следит
за выделенными ресурсами и созданными экзекъюторами, обрабатывает запросы
клиентов и преобразует их в другой формат, является возможной точкой отказа, но в
новых версиях есть интеграция с Zookeeper (на лекциях об этом не было) и проблема
надежности вроде бы решается. Масштабирование все еще ограничено одним
мастером.
Execution Node - основной узел для исполнения, в ранних версиях - Data Node, в
актуальной называется Worker Node. Запускает один или более Spark Executor.
Data Node - слой хранения данных, в ранней версии Hadoop, в любой более-менее
актуальной - отдельный слой, например, локальная БД в тестах или Amazon S3 в
современных облачных приложениях. Обычно Data Node использует дешевые сервера
с большим диском и малым CPU, а Execution Node - больше CPU и RAM
Сохранить на HDD
Сохранить в destination
Для старой архитектуры HDD - сохранить в локальный диск, в новой - HDD это
отправка на Data Node слой. Сохранение в RAM и HDD пытается положить данные в
RAM, если не получается - HDD.
API:
Краткое сравнение:
Критерий Spark MapReduce
“Many organizations run Spark on clusters of thousands of nodes. The largest cluster
we know has 8000 of them. In terms of data size, Spark has been shown to work
well up to petabytes. It has been used to sort 100 TB of data 3X faster than Hadoop
MapReduce on 1/10th of the machines, winning the 2014 Daytona GraySort
Benchmark, as well as to sort 1 PB. Several production workloads use Spark to do
ETL and data analysis on PBs of data.” (источник)
Можно посмотреть, когда Hadoop эффективнее Spark, но это, вроде, не спрашивают
(Блог IBM). Если кратко, то для конкретно своей модели задач Hadoop в целом не
сильно хуже Spark, но требует более дешевых устройств (disk-heavy и лучшее
fault-tolerance)
Немного истории: в Spark 1 было только RDD. В Spark 2 появился сначала DataSet, а
потом уже DataFrame.
Переход к DataSet.
Разработчики Spark осознали, что в конкретный момент основная целевая аудитория -
не разработчики, а аналитики. => добавляется аналитический движок. Появился
DataSet: фактически то же самое, что RDD, только жестко типизированное.
Переход к DataFrame.
Из-за добавления DataSet в Spark появились проблемы с SQLApi и PythonApi (есть
еще ScalaApi). В итоге появляется DataFrame, который фактически = (RDD +
метаинформация об этом RDD). Отличие от DataSet в том, что DataSet говорил строго
о физическом представлении данных (типизация). В DataFrame уже есть
таблички+схемы (схемы можно взять: из Hive Meta Store/указать руками/из
схематизированного файла типа Parquet).
31) Какие операции поддерживает RDD? Какие типы операций
есть и в чем между ними ключевая разница?
Примеры transformation:
Примеры action:
В чем разница?
Представим, что в нашем датафрейме количество партиций равно n (partition.size=n)
Тогда для Coalesce в качестве аргумента мы можем указать число партиций, не
превышающее n.
А в Repartition мы можем запихнуть любое число m.
С их помощью мы регулируем
- степень параллельности выполнения наших задач
- скорость выполнения
- что данные могут храниться на одной машине, и не нужно будет шафлить
данные
Пример 4. Ваш код тормозит на этапе Map-операции, хотя она совсем простая (+1
к интовому полю). Мы хотим операцию ускорить, поменять количество потоков.
Все слишком неоднозначно, нужно смотреть на размахивания руками. В виде
конспекта сложно запечатлеть, поэтому оставлю ссылку:
https://youtu.be/u6MMCo_xgqk?t=1779 (можно посмотреть на х2 пару минут)
Итог такой: все сильно зависит от ситуации, Repartition может даже сделать хуже
Комментарии лектора: Для того чтобы работать с данными на хадупе на hdfs как с
таблицами, а не как с сырыми файлами
В Spark кроме RDD также поддерживаются такие абстракции как Dataset (жёстко
типизирован) и Dataframe (по сути RDD, вокруг которого написана метаинформация).
То есть, рядом с Dataframe рядом лежит схема о том, что данные табличные, данные в
колонках. Таким образом, с Dataframe можно работать как с обычными таблицами.\