Tez vs Spark: что выбрать для Apache Hive

Автор Категория , ,
Tez vs Spark: что выбрать для Apache Hive

Вчера мы упоминали, что использование Spark или Tez в качестве движка исполнения SQL-запросов в Apache Hive вместо классического Hadoop MapReduce намного ускоряет аналитику больших данных. Сегодня рассмотрим подробнее, чем отличаются эти механизмы и какой из них выбирать в разных случаях использования.

Что такое Apache Tez и как он работает с Hive в экосистеме Hadoop

Начнем с определения: Apache Tez – это расширяемая open-source платформа создания высокопроизводительных приложений пакетной и интерактивной обработки данных, координируемая YARN в Apache Hadoop. Tez развивает парадигму MapReduce, увеличивая ее скорость и сохраняя способность масштабироваться до огромных размеров [1]. Можно сказать, что в Tez задачи MapReduce объединяются в одно задание, которое рассматривается как узел в DAG, обеспечивая параллелизм и сериализацию [2].

Начиная с версии 0.13, Apache Hive использует именно Tez в качестве движка исполнения SQL-подобных запросов на языке HiveQL, транслируя их в высокооптимизированные DAG-задания, которые обеспечивают эффективный баланс между производительностью, пропускной способностью и масштабируемостью. Таким образом, популярностью Tez частично вызвана распространенностью Apache Hive в качестве востребованного инструмента SQL-on-Hadoop.

Tez моделирует обработку данных как направленный ациклический граф (DAG, Directed Acyclic Graph), где вершины представляют логику приложения, а ребра – движение данных. Богатый Java API позволяет пользователям определять сложную логику запросов, сочетая их с планами выполнения, созданными декларативными приложениями более высокого уровня, такими как Apache Hive.

Таким образом, Tez моделирует пользовательскую логику в каждой вершине DAG-графа как композицию модулей ввода, процессора и вывода. Ввод и вывод определяют формат данных, как и где они читаются или записываются. Процессор содержит логику преобразования данных. Tez не требователен к форматам данных, но необходима совместимость форматов ввода, процессора и вывода.

Распределенная обработка данных носит динамический характер, не позволяя заранее определить оптимальные методы перемещения данных. Tez поддерживает подключаемые модули управления вершинами для сбора информации о времени выполнения SQL-запроса и динамического изменения DAG-графа, чтобы оптимизировать производительность и эффективно использовать ресурсы.

Tez получает ресурсы из Hadoop-менеджера ресурсов YARN и повторно использует каждый компонент в конвейере, избегая дублирования операций без необходимости. Напомним, YARN управляет ресурсами в кластере Hadoop в зависимости от его емкости и нагрузки. Tez следует традиционной модели Hadoop разделения задания на отдельные задачи, каждая из которых запускается как процессы через YARN от имени пользователя. Эта модель сопряжена с внутренними затратами на запуск и инициализацию процессов, обработку отставших задач и выделение каждого контейнера через YARN [1].

Tez предоставляет собственный пользовательский интерфейс, который взаимодействует с YARN Application Timeline Server, чтобы отразить текущий и исторический вид приложений в веб-GUI.

Для корректной работы Apache Hive с Tez нужно задать следующие конфигурации [3]:

  • tez.am.resource.memory.mb– должно быть равно yarn.scheduler.minimum-allocation-mb;
  • hive.tez.container.size– равно или в 2 раза больше значения yarn.scheduler.minimum-allocation-mb, но не более, чем yarn.scheduler.maximum-allocation-mb.

Если RAM 256 Гб и 16 ядер CPU, размер контейнера не должен превышать 16 Гб. Также требуется задать еще ряд конфигураций [3]:

  • runtime.io.sort.mb– обычно 40% от hive.tez.container.size, как правило не более 2 Гб;
  • auto.convert.join.noconditionaltask– true;
  • auto.convert.join.noconditionaltask.size– около 30% от hive.tez.container.size;
  • runtime.unordered.output.buffer.size-mb– до 10% от hive.tez.container.size;
  • grouping.min-size=16777216, минимум около 16 Мб;
  • grouping.max-size=1073741824, максимум около 1 ГБ.

Чем похожи Tez и Spark

Фреймворки Spark и Tez имеют следующие одинаковые характеристики:

  • open-source статус и свобода использования под лицензией Apache0;
  • оба движка стали проектами верхнего уровня Apache Software Foundation с 2014 года;
  • входят в экосистему Hadoop;
  • оба работают с SQL-on-Hadoop инструментом Apache Hive в качестве механизма исполнения HQL-запросов к данным, которые хранятся в HDFS;
  • оба расширяют парадигму классического MapReduce в DAG-граф, чтобы распараллелить выполнение заданий и ускорить обработку данных.

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

5 главных отличий

Ключевыми отличиями Spark от Tez являются следующие [2]:

  • совместимость с YARN – Tez основан на этом менеджере ресурсов и отлично вписывается в его архитектуру. Spark может работать как в среде кластера Hadoop под управлением YARN, так и без компонентов ядра Hadoop. В случае с YARN Spark может столкнуться с проблемами управления ресурсами, в частности, на практике Spark не может работать одновременно с другими приложениями YARN, по крайней мере, пока.
  • потребление ресурсов – в отличие от Apache Spark, контейнеры Tez могут отключиться по завершении и освободить ресурсы кластера. А контейнеры Spark продолжают работать и потреблять ресурсы, даже не обрабатывая никаких данных.
  • универсальность – благодаря широкому набору возможностей и гибкому API, Spark позволяет разработчикам решать практически любые задачи пакетной и потоковой обработки больших данных, включая графовую аналитику и машинное обучение. А Tez является узко специализированным инструментом для точечных приложений.
  • популярность – Apache Spark известен и востребован намного больше, что объясняется его универсальностью.
  • поддержка – изначально один из самых крупных коммерческих дистрибьютеров Hadoop, компания Cloudera поддерживала Spark, а ее конкурент, корпорация Hortonworks отдавала предпочтение движку Tez. Однако, в 2018 году Cloudera поглотила Hortonworks. Возможно, в том числе и поэтому Spark более распространен.

Что касается быстроты обработки данных, то различные бечмаркинговые тесты показывают разные результаты, в которых побеждает то Spark, то Tez, в зависимости от аффилированности исследователей. Однако, в любом случае оба DAG-движка намного быстрее классического Hadoop MapReduce, который также доступен для исполнения SQL-запросов в Apache Hive [2]. Таким образом, универсального ответа на вопрос «Spark vs Tez» нет, а выбор зависит от особенностей конкретной ситуации. На практике разработчики распределенных приложений чаще выбирают Apache Spark по причине его универсальности и огромного набора функциональных возможностей. О том, зачем использовать внешнюю базу данных для хранилища метаданных Apache Hive и как ее подключить вместо Derby, читайте в нашей новой статье.

Больше подробностей про администрирование и эксплуатацию Apache Hive, а также фреймворка Spark для аналитики больших данных вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://www.cloudera.com/products/open-source/apache-hadoop/apache-tez.html
  2. https://www.xplenty.com/blog/apache-spark-vs-tez-comparison/
  3. https://docs.arenadata.io/adh/v2.1.2/administration/hive/memory.html