Настройка улья, понятная новичкам

задняя часть Apache Hive Большое количество данных

предисловие

Примечания по настройке

  1. Hive – широко используемый компонент больших данных. На его производительность не влияет проблема чрезмерного объема данных, но перекос данных, избыточность, чрезмерное количество заданий и операций ввода-вывода, необоснованное распределение MapReduce и т. д.

поэтому мы можем получить его отДизайн построения таблиц, оптимизация HiveSQL, параметры конфигурации компонентов и базовый MapReduceКорректировка этих аспектов заключается в том, чтобы максимально сократить потребление ресурсов и время выполнения задач, исходя из того, что бизнес-результаты остаются неизменными.

  1. Нижний уровень HiveSQL преобразует несколько заданий для параллельного и последовательного выполнения.Задания с большим количеством заданий, естественно, будут медленными, даже если объем данных вашей таблицы невелик.Поскольку задания MapReduce требуют много времени для инициализации, так что это займет много времени

  2. Когда Hive выполняет анализ больших данных, локальная агрегация и двухэтапная агрегация на этапе сопоставления могут решить распространенные проблемы перекоса данных, вызванные суммой, количеством и максимальным/минимальным UDAF.Конечно, если это объединение, ситуация будет сложнее

  3. Хороший дизайн построения таблицы также является оптимизацией.

  4. Установка разумного параллелизма задач может эффективно повысить производительность.

  5. Прямое понимание распределения данных, целенаправленная обработка также являются хорошим методом.

  6. Используйте count(distant) в случае большого количества данных, группировка по вызывает проблемы, но если группировка используется вместе с операциями агрегирования, проблема не будет очень большой.

  7. Объединение мелких файлов, как и сами методы настройки, генерируются в случае нехватки ресурсов, поэтомуВсе способы настройки не такие простые и грубые, как непосредственное добавление ресурсов, Если вы можете добавить машину напрямую, не думайте слишком много 😂

Во-первых, уровень дизайна таблицы

1.1 Таблица разделов и таблица сегментов

Мы все слышали о внутренних таблицах, внешних таблицах, секционированных таблицах, таблицах с сегментами, и нет никакой разницы в производительности между внутренними и внешними таблицами.Секционированные таблицы классифицируют и хранят данные в определенных измерениях, и один раздел соответствует одному каталогу, когда вы запрос с полем раздела, тогда Hive нужно только пройти через соответствующий каталог раздела (фактически каталог HDFS). Это уменьшает количество обрабатываемых данных, т.е.

select ··· where day = '昨天'

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

такЕсли таблица использует это поле для фильтрации в большинстве случаев, не забудьте изменить эту таблицу на секционированную..

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

select a.*,b.* from a join b on a.id = b.id

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

и это можетЛегко сэмплировать данные позже

Вот, кстати, появившаяся недавноDoris, это тоже OLAP-движок, у него будетcolocation join, в приведенном выше примере группировка на самом деле скрывает два условия,Во-первых, обе таблицы a и b должны быть таблицами сегментов, а количество сегментов между ними должно быть кратным.. в то время как Дорис требует ихКоличество ковшейравны, так что это гарантируетДанные одного и того же номера корзины в двух таблицах находятся на одном узле..

Кстати, эффективность выполнения Doris SQL будет намного выше, чем у Hive. А обычные OLAP-движки обычно имеют следующие преимущества: хранение столбцов + разбиение по диапазонам + сортировка + индексирование + сжатие + предварительное урегулирование + решение проблемы неравномерности данных.

1.2 Подходящий формат хранения

Формат хранения Hive по умолчанию — TextFile, например, студент (id, имя, пол, отдел... 100 полей)

select department,count(*) as total from student group by department

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

Поэтому при столкновении с широкой таблицей старайтесь использовать два формата хранения столбцов orc и parquet, потому что данные каждого столбца таблицы хранения столбцов хранятся вместе на физическом уровне. Это может обрабатывать только 1/100 объема данных

1.3 Подходящие форматы сжатия

Алгоритм сжатия должен определить, является ли текущая задача интенсивным вводом-выводом или интенсивным вычислением. Если это задача с интенсивным вводом-выводом и в этой области используется много ресурсов, можно рассмотреть сжатие. Конечно, в это время мы будем использовать ресурсы ЦП для обмена сетевыми ресурсами, поэтому мы также должны убедиться, что ресурсов ЦП в это время достаточно. Если это задача с интенсивными вычислениями, она больше не может нагружать ЦП.

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

header + body

Заголовок хранит информацию о метаданных, а тело представляет собой настоящие данные. В заголовке будет записан размер данных до и после сжатия, а также алгоритм сжатия... и другая связанная информация. Только так вы сможете узнать, какой алгоритм использовать. использовать при декомпрессии. Разделяемый и неразделяемый относится к информации метаданных этого заголовка.После того, как исходные реальные данные будут разделены, будет ли заголовок зарезервирован для каждого разделенного блока? Чтобы избежать проблемы с невозможностью распаковки позже

Формат сжатия Это отделимо Вы приносите свои собственные Степень сжатия скорость Поставляется ли Hadoop с
gzip нет да очень высоко Быстрее да
lzo да да относительно высокий скоро нет
snappy нет да относительно высокий скоро нет
bzip2 да нет Самый высокий медленный да

1.3.1 Использование сжатия

Выходные файлы задания сжимаются с помощью GZip по блокам:

## 默认值是false
set mapreduce.output.fileoutputformat.compress=true;   

## 默认值是Record
set mapreduce.output.fileoutputformat.compress.type=BLOCK 

## 默认值是org.apache.hadoop.io.compress.DefaultCodec
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.G
zipCodec

Вывод MAP также сжимает Gzip:

## 启用map端输出压缩
set mapred.map.output.compress=true
## 默认值是org.apache.hadoop.io.compress.DefaultCodec
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec

Сжать как выходные данные Hive, так и промежуточные:

set hive.exec.compress.output=true  ## 默认值是false,不压缩
set hive.exec.compress.intermediate=true   ## 默认值是false,为true时MR设置的压缩才启用

2. Синтаксис HQL и уровень параметров операции

2.1 Просмотр плана выполнения улья

Чтобы понять конкретный процесс преобразования, вы можете ввести следующую команду в операторе SQL, чтобы просмотреть конкретный план выполнения.

## 查看执行计划,添加extended关键字可以查看更加详细的执行计划
explain [extended] query

2.2 Сокращение столбцов и сокращение разделов

На самом деле это нужно для чтения только необходимых столбцов при запросе, а отсечение разделов — для чтения только необходимых разделов. Так что постарайтесь не выбирать * , а также указывать раздел

Когда Hive считывает данные, он может считывать только столбцы, необходимые в запросе, и игнорировать другие столбцы. Это снижает накладные расходы на чтение: накладные расходы на хранение промежуточных таблиц и накладные расходы на консолидацию данных.

set hive.optimize.cp = true; ## 列裁剪,取数只取查询中需要用到的列,默认是true

Обрезка разделов предназначена для чтения только необходимых разделов.

set hive.optimize.pruner=true;   ## 默认是true

Логический оптимизатор ColumnPruner соответствует фазе парсинга HiveQL.

2.3 Предикат Pushdown

Многие люди не понимают эту концепцию, позвольте мне помочь вам понять, например

image.png

В этом сценарии очевидно, что мы должны фильтровать, где для каждого узла уменьшить объем данных, передаваемых узлом клиенту, потому что для передачи требуются сетевые ресурсы. Например, 4 узла рассчитывают 1W студентов, и только 1 студент старше 25 лет получается после прохождения клиента где, то 9999 результатов передаются впустую.Если так подумать, то большая ли это потеря?

Итак, что такое предикат pushdown, воплощение в примере означает, чтоЭто поведение фильтрации отправляется на вычислительный узел для работы.. Например, сопроцессор HBase, режим работы также является предикатом pushdown.

Выполняйте логику предиката where в операторе SQL как можно раньше, чтобы уменьшить объем данных, обрабатываемых ниже по течению. Соответствующая логика оптимизирует PredicatePushDown.

set hive.optimize.ppd=true;   ## 默认是true

Пример:

select a.*, b.* from a join b on a.id = b.id where b.age > 20;

// 这条就预先把 b 表的满足 age>20 的条件先筛选出来为一个c表再进行聚合
// 这是一种手动谓词下推
select a.*, c.* from a join (select * from b where age > 20) c on a.id = c.id;

2.4 Объединение небольших файлов

2.4.1 Объединение ввода карты

При выполнении программы MapReduce общая ситуация такова, что для обработки блока данных файла требуется mapTask. Но если источником данных является большое количество мелких файлов, то будет запущено большое количество задач mapTask, на что будет потрачено много ресурсов. Небольшие входные файлы можно объединять, чтобы уменьшить количество задач mapTask.

Если вы хотите объединиться, установите

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

конечно можно и не сливать

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

Пожалуйста, рассмотрите свой собственный сценарий, Hive по умолчанию — TextInputFormat.

2.4.2 Объединение выходных данных Map/Reduce

Большое количество мелких файлов будет оказывать давление на HDFS и влиять на эффективность обработки. Эффект можно удалить, объединив файлы результатов Map и Reduce.

## 是否合并Map输出文件, 默认值为true
set hive.merge.mapfiles=true;

## 是否合并Reduce端输出文件,默认值为false
set hive.merge.mapredfiles=true;

## 合并文件的大小,默认值为256M
set hive.merge.size.per.task=256000000;

## 每个Map 最大分割大小
set mapred.max.split.size=256000000; 

## 一个节点上split的最少值
set mapred.min.split.size.per.node=1;  // 服务器节点

## 一个机架上split的最少值
set mapred.min.split.size.per.rack=1;   // 服务器机架

когдаset mapred.min.split.size.per.node=1После этого, если на текущем узле 300 маленьких файлов по 1М и заданный размер слайса 256М, оставшиеся 44М будут переданы на другой узел для слияния, но если в узле 500 маленьких файлов по 1М, то останется 244М , в это времяset mapred.min.split.size.per.node=2Это будет разумнее.

2.5 рационально настроить параллелизм maptask

Источником данных, рассчитанным на основе текущего этапа Mapper, могут быть исходные данные или результат вывода предыдущей Map. Ситуацию нужно обсудить отдельно, первое — это сырые данные, которые относительно легко контролировать.

Когда входной файл очень большой, имеется много MapTasks, и каждый вычислительный узел выделяет и выполняет много MapTasks.В это время вы можете рассмотреть возможность уменьшения количества MapTasks. Увеличьте объем данных, обрабатываемых каждой задачей MapTask. Более того, MapTask слишком много, и количество окончательно сгенерированных файлов результатов также слишком велико. Когда входные файлы большие, логика задачи сложная, а выполнение MapTask очень медленное, вы можете рассмотреть возможность увеличения количества MapTask, чтобы уменьшить объем данных, обрабатываемых каждым MapTask, тем самым повышая эффективность выполнения задачи.

Мы знаем, что количество задач MapTask в задании MapReduce определяется входным разделением InputSplit. Разделение ввода определяется функцией FileInputFormat.getSplit(). Входной фрагмент соответствует MapTask, а входной сегмент определяется тремя параметрами:

параметр По умолчанию значение
dfs.blocksize 128M Размер блока данных HDFS по умолчанию
mapreduce.input.fileinputformat.split.minsize 1 Минимальный размер сегмента (MR)
mapreduce.input.fileinputformat.split.maxsize 256M Максимальный размер сегмента (MR)

Если вы не знаете об этой части, я объясню это позже в другой статье.для необработанных данныхСлучайВведите размер фрагментарассчитывается так:

long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))

А скорректированный размер splitSize предпочтительно должен быть целым числом, кратным blockSize, иначе будет большое количество только что упомянутых передач другим узлам для слияния.

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

2.5.1 Разумно контролировать количество MapTask

1. Если вы хотите увеличить количество MapTasks, вы можете установить для mapred.map.tasks большее значение.

2. Если вы хотите уменьшить количество MapTasks, вы можете установить для maperd.min.split.size большее значение.

3. Если на вход поступает большое количество небольших файлов и вы хотите уменьшить количество картографов, вы можете объединить небольшие файлы, установив hive.input.format

MapReduce предоставляет следующие параметры для управления количеством задач карты:

输入文件总大小:total_size  

HDFS 设置的数据块大小:dfs_block_size   

default_mapper_num = total_size / dfs_block_size

Буквально кажется, что количество MapTasks можно задать напрямую, но, к сожалению, это не так, настройка этого параметра вступит в силу только тогда, когда оно больше, чем default_mapper_num.

set mapred.map.tasks=10; ## 默认值是2

А что, если нам нужно уменьшить количество MapTask, но размер файла фиксирован?

Вы можете установить размер файлов, обрабатываемых каждой задачей через mapred.min.split.size, этот размер может быть только Это вступит в силу только тогда, когда dfs_block_size

split_size = max(mapred.min.split.size, dfs_block_size)

split_num = total_size / split_size

map_num = Math.min(split_num, Math.max(default_mapper_num,
mapred.map.tasks))

2.6 Разумная настройка параллелизма ReduceTask

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

Если количество ReduceTasks слишком мало, такой ReduceTask должен обрабатывать большой объем данных, и могут быть данные Из-за перекоса выполнение всего запроса занимает много времени. То, как Hive определяет количество ReducerTasks, становится ключевым вопросом. К сожалению, механизм оценки Hive очень слабый, без указания количества ReducerTasks Hive будет угадывать количество ReducerTasks.

// 每个 reduceTask 处理的最大数据大小
参数1:hive.exec.reducers.bytes.per.reducer (默认256M)

// reduceTask 的个数上限
参数2:hive.exec.reducers.max (默认为1009)

参数3:mapreduce.job.reduces (默认值为-1,表示没有设置,那么就按照以上两个参数
进行设置)

Если вы установите mapreduce.job.reduces , в сценарии без порядка, ReducerTask — это установленное вами число, в противном случае

reduceTask_num = Math.min(参数2,总输入数据大小 / 参数1)

Исходя из опыта, параметр 2 можно установить равным M*(0,95*N) (N — количество NodeManager в кластере). Вообще говоря, количество NodeManage и DataNode одинаково. 0,95 — для обеспечения определенной отказоустойчивости, и может быть время простоя узла.

2.7 Оптимизация соединения

2.7.1 Общие принципы

1. Выполните операцию соединения после предварительной фильтрации, чтобы свести к минимуму объем данных, участвующих в соединении.

Мы должны максимально сократить объем данных на каждом этапе, максимально использовать поля раздела для таблицы разделов и выбирать только те столбцы, которые необходимо использовать позже, чтобы свести к минимуму объем данных, участвующих в соединении.

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

Когда маленькая таблица присоединяется к большой таблице, следует следовать принципу присоединения большой таблицы к маленькой таблице, потому что фаза редукции операции присоединения расположена с левой стороны от присоединения. Содержимое таблицы будет загружено в память, а таблица с меньшим количеством записей будет размещена слева, что может эффективно снизить вероятность переполнения памяти. Порядок выполнения в объединении Задания генерируются слева направо, и следует следить за тем, чтобы размер таблиц в последовательных запросах увеличивался последовательно слева направо.

3. Если условия Join on одинаковые, то лучше поставить его в ту же работу, а порядок таблицы соединений от меньшего к большему.:

select a.*,b.*, c.* from a join b on a.id = b.id 
       join c on a.id = c.i

4. Если несколько таблиц объединены, если условия нескольких ссылок одинаковы, они будут преобразованы в задание.

В улье при объединении 3 и более таблиц, если в условии включения используются одни и те же поля, они объединяются в одну. MapReduce Job, используя эту функцию, может сэкономить время выполнения, поместив одно и то же объединение в одно задание.

Старайтесь избегать SQL, содержащего сложную логику.Если вы столкнетесь с ней, вы можете использовать промежуточную таблицу для завершения сложной логики.

Если речь идет о соединении большой таблицы с большой таблицей, у нас также есть следующие две меры.

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

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

2.7.2 MapJoin

MapJoin напрямую распределяет относительно небольшие таблицы по обеим сторонам соединения в память каждого процесса сопоставления и выполняет операцию соединения в процессе сопоставления, поэтому шаг сокращения не требуется, что повышает скорость. Только операции соединения могут включать MapJoin.

## 是否根据输入小表的大小,自动将reduce端的common join 转化为map join,将小表刷入内存中。
## 对应逻辑优化器是MapJoinProcessor
## 这个参数其实就是一个开关
set hive.auto.convert.join = true;

## 刷入内存表的大小(字节)
## 也就是小表的大小最大为25M,最大一般我们可以调整到2G
set hive.mapjoin.smalltable.filesize = 25000000;

## hive会基于表的size自动的将普通join转换成mapjoin
set hive.auto.convert.join.noconditionaltask=true;

## 多大的表可以自动触发放到内层LocalTask中,默认大小10M
## 这个是一个单机模式的大小判断,因为我们会有些任务是单机模式效率更高的
set hive.auto.convert.join.noconditionaltask.size=10000000;

Вы также можете вручную открыть mapjoin самостоятельно, используя определенный синтаксис.

/*+mapjoin(smalltable)*/

SELECT  /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value FROM
    smallTable  JOIN bigTable  ON smallTable.key = bigTable.key;
    
    

2.7.3 Sort-Merge-Bucket(SMB) Map Join

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

1. Сделайте один и тот же хеш для двух участников соединения, и данные в каждом сегменте должны быть отсортированы.

2. Количество сегментов этих двух таблиц должно быть кратным.

## 当用户执行bucket map join的时候,发现不能执行时,禁止查询
set hive.enforce.sortmergebucketmapjoin=false; 

## 如果join的表通过sort merge join的条件,join是否会自动转换为sort merge join
set hive.auto.convert.sortmerge.join=true;

## 当两个分桶表 join 时,如果 join on的是分桶字段,小表的分桶数是大表的倍数时,可以启用
mapjoin 来提高效率。
# bucket map join优化,默认值是 false
set hive.optimize.bucketmapjoin=false; 

## bucket map join 优化,默认值是 false
set hive.optimize.bucketmapjoin.sortedmerge=false; 

2.8 Оптимизация перекоса данных при объединении

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

# key 对应的记录条数超过这个值则会进行处理
set hive.skewjoin.key = 100000;  

# 功能开关
set hive.optimize.skewjoin = false;  

Если этот параметр включен, Hive будет подсчитывать пары искаженных ключей, которые превышают пороговое значение hive.skewjoin.key (по умолчанию 100000) во время процесса присоединения. Соответствующая строка записывается во временный файл, а затем запускается другое задание по соединению карты для получения результата.

Количество картографов для второго задания также можно контролировать параметром hive.skewjoin.mapjoin.map.tasks, значение по умолчанию 10000.

set hive.skewjoin.mapjoin.map.tasks=10000;

2.9 Оптимизация CBO

CBO, оптимизатор затрат, план выполнения с наименьшими затратами является лучшим планом выполнения. В традиционных базах данных оптимальный план выполнения, составленный оптимизатором затрат, рассчитывается на основе статистической информации. То же самое касается оптимизатора затрат Hive. Взаимосвязь порядка столов при объединении:Все предыдущие таблицы загружаются в память. Сканирование диска следующей таблицы

Начиная с Hive 0.14.0, был добавлен «Оптимизатор на основе затрат» для оптимизации плана выполнения HQL. Используйте "hive.cbo.enable" для включения. После Hive 1.1.0 эта функция включена по умолчанию, она может автоматически оптимизировать HQL Выбирается порядок нескольких соединений в системе и выбирается соответствующий алгоритм соединения.

Например, когда вы выполняете такое условие соединения с одной и той же таблицей и соединением с таблицей

select a.*, b.*, c.* from a join b on a.id = b.id join c on a.id = c.id;

Если вы хотите использовать эту функцию, вы можете открыть следующие параметры

set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

2.10 Как сделать декартово произведение

Декартовы произведения не допускаются в операторах HQL, когда для Hive установлен строгий режим (hive.mapred.mode=strict).

2.11 Группировка по оптимизации

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

2.11.1 Частичная агрегация на стороне карты

На самом деле не все операции агрегации нужно выполнять в части Reduce, и многие операции агрегации можно сначала выполнить на стороне Map. Агрегируйте, а затем получите окончательный результат на стороне сокращения.

## 开启 Map 端聚合参数设置
set hive.map.aggr=true;

## 设置 map 端预聚合的行数阈值,超过该值就会拆分job,默认值100000
set hive.groupby.mapaggr.checkinterval=100000  

2.11.2 Балансировка нагрузки при искажении данных

Когда данные искажены, когда оператор HQL использует группу, если для этой переменной установлено значение true, Hive автоматически выполнит балансировку нагрузки. остаток средств. Стратегия состоит в том, чтобы разделить задачи MapReduce на две: первая выполняет предварительную агрегацию, а вторая выполняет окончательную агрегацию.

# 自动优化,有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata=false;

Если для параметра установлено значение true, результирующий план запроса содержит две задачи MapReduce.

1. В первой задаче MapReduce результаты вывода карты будут случайным образом распределяться по редюсерам, и каждый редьюсер будет выполнять частичную агрегацию. операции, и вывести результат, чтобы результат обработки был таким жеgroup by keyМожно распределить по разным сокращениям, чтобы достичь Цель балансировки нагрузки;

2. Затем вторая задача MapReduce распределяется между каждым сокращением по группам по ключам в соответствии с результатами предварительной обработки данных. После завершения последней операции агрегации.

Кажется, что это очень сложно, но понять эту двухступенчатую агрегацию легко, собственно нарисовав картинку.

image.png

После этой операции, даже если и будет перекос данных, он не будет слишком серьезным.

2.12 Порядок по оптимизации

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

1. Выполнить заказ по конечному результату,Старайтесь не сортировать большие наборы данных посередине. Если итоговый результат меньше, можно При сортировке по уменьшению выполнять сортировку по конечному набору результатов.

2. Если вы хотите получить первые N фрагментов данных после сортировки, вы можете использовать «распределить по» и «сортировать по», чтобы отсортировать первые N данных при каждом сокращении. Затем наборы результатов каждого Reduce объединяются и глобально сортируются в один Reduce, и берутся первые N элементов, потому что те, кто участвует в глобальной сортировке Количество данных, упорядоченных по, не превышает числа Reduces * N, поэтому эффективность выполнения будет значительно повышена.

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

1、order by:全局排序,缺陷是只能使用一个reduce
2、sort by:单机排序,单个reduce结果有序
3、cluster by:对同一字段分桶并排序,不能和sort by连用
4、distribute by + sort by:分桶,保证同一字段值只存在一个结果文件当中,结合sort by保证每个reduceTask结果有序

2.13 Оптимизация подсчета различных

Когда вы хотите подсчитать количество дедупликаций столбца, если объем данных велик, подсчет (отличный) будет очень медленным, причина аналогична порядку, Логика подсчета (отличных) будет обрабатываться очень немногими редюсерами. Затем мы можем использовать группу, чтобы переписать

Перед оптимизацией обычно используется только одна операция reduceTask для подсчета (отличных) операций.

-- 优化前(只有一个reduce,先去重再count负担比较大):
select count(distinct id) from student;

// 优化后
select count(1) from (select id from student group by id) tmp;  

Но этот способ записи запустит два задания MR (простое отличное запустит только одно), поэтомуУбедитесь, что объем данных настолько велик, что накладные расходы на запуск задания намного меньше, чем время расчета, и этот метод рассматривается только. когдаНабор данных мал или перекос ключа очевиден, group by также может выполняться медленнее, чем отдельные.

2.14 in/exists

В более ранних версиях Hive синтаксис in/exists не поддерживался, но он поддерживается начиная с hive-0.8x. но Этот синтаксис устарел. Хотя Hive-2.3.6 также поддерживает операции in/exists после тестирования, рекомендуется использовать один из Эффективная альтернатива: левое полусоединение, которое здесь не будет раскрываться

2.15 Используйте методы векторизации (просто знайте, что такие есть)

При вычислении чего-то вроде сканирования, фильтрации, агрегации метод векторизации устанавливает размер приращения пакета равным 1024 строкам. Одиночный выстрел для достижения более высокой эффективности, чем одиночный выстрел

set hive.vectorized.execution.enabled=true ;
set hive.vectorized.execution.reduce.enabled=true;

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

2.16 Несколько режимов

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

1. В нормальных условиях один SQL может записывать до 128 каналов вывода.Если превышено более 128 каналов, будет сообщено о синтаксической ошибке.

2. В многораздельной вставке: для многораздельной таблицы один и тот же целевой раздел не может появляться несколько раз. Для несекционированных таблиц таблица не может появляться более одного раза.

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

Так же есть Multi-Group by, кому интересно о них можно узнать

2.17 Сжатие

2.17.1 сжатие вывода карты

set mapreduce.map.output.compress=true;
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2.17.2 Промежуточное сжатие данных

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

set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;

2.17.3 Сжатие данных результатов

Окончательные данные результата также могут быть сжаты, и может быть выбрано время чтения и записи диска, которое может уменьшить размер данных и самих данных; Примечание. Обычно используемые алгоритмы сжатия gzip и snappy не поддерживают параллельную обработку.Если источником данных является большой файл сжатых файлов gzip/snappy, наличие преобразователя для обработки этого файла серьезно повлияет на эффективность запроса. Поэтому, если данные результата необходимо использовать в качестве источника данных для других задач запроса, вы можете выбрать алгоритм LZO, который поддерживает разделение, которое может не только сжимать файл результата, но и обрабатывать его параллельно, что может значительно улучшить производительность. скорость выполнения работы.

set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.G
zipCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

2.17.4 Алгоритмы сжатия, поддерживаемые кластером Hadoop

org.apache.hadoop.io.compress.DefaultCodec
org.apache.hadoop.io.compress.GzipCodec
org.apache.hadoop.io.compress.BZip2Codec
org.apache.hadoop.io.compress.DeflateCodec
org.apache.hadoop.io.compress.SnappyCodec
org.apache.hadoop.io.compress.Lz4Codec
com.hadoop.compression.lzo.LzoCodec
com.hadoop.compression.lzo.LzopCodec

3. Уровень архитектуры улья

3.1 Включить локальное сканирование

Некоторые операторы SQL в Hive необходимо преобразовывать в операции MapReduce, а некоторые операторы SQL не нужно преобразовывать в операции MapReduce. Однако следует отметить, что теоретически все операторы SQL необходимо преобразовать в операции MapReduce.

Просто Hive сделает некоторые оптимизации в процессе преобразования операторов SQL, так что некоторые простые операции больше не нужно преобразовывать в MapReduce, например Такие как:

1、只是 select * 的时候
2、where 条件针对分区字段进行筛选过滤时
3、带有 limit 分支语句时

Hive считывает данные из HDFS двумя способами: включив чтение MapReduce и прямую выборку. Прямая выборка данных выполняется намного быстрее, чем чтение данных в MapReduce, но только несколько операций могут использовать прямую выборку. в состоянии пройтиhive.fetch.task.conversionПараметры для настройки, при каких обстоятельствах используется метод прямого захвата

minimal:只有 select * 、在分区字段上 where 过滤、有 limit 这三种场景下才启用直接抓取方式。
more:在 select、where 筛选、limit 时,都启用直接抓取方式

set hive.fetch.task.conversion = minimal/more;

3.2 Оптимизация локального выполнения

Когда Hive запрашивает кластер, он по умолчанию запускается на нескольких компьютерах в кластере, что требует согласованного запуска нескольких компьютеров.Этот метод очень хорош. Это решает проблему запроса большого количества данных.

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

Есть три параметра, участвующих в запуске локального режима

## 打开hive自动判断是否启动本地模式的开关
set hive.exec.mode.local.auto=true;

## map任务数最大值,不启用本地模式的task最大个数
set hive.exec.mode.local.auto.input.files.max=4;

## map输入文件最大大小,不启动本地模式的最大输入文件大小
set hive.exec.mode.local.auto.inputbytes.max=134217728;

На самом деле задач меньше 4 и данных меньше 128М, тогда могу помочь запустить в локальном режиме

3.3 Повторное использование JVM

Оператор Hive в конечном итоге будет преобразован в серию задач MapReduce, каждая задача MapReduce состоит из серии MapTask. и ReduceTask, по умолчанию MapTask или ReduceTask в MapReduce запустит Процесс JVM, после выполнения задачи процесс JVM завершится. Таким образом, если задача занимает короткое время, ее нужно запускать несколько раз. В случае с JVM время запуска JVM станет относительно большим потреблением, в настоящее время это можно решить путем повторного использования JVM.

set mapred.job.reuse.jvm.num.tasks=5;

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

3.4 Параллельное исполнение

Некоторые операторы запросов Hive преобразует в один или несколько этапов, в том числе: этап MapReduce, этап выборки, этап слияния, предельная стадия и т. д. По умолчанию одновременно выполняется только один этап. Однако, если некоторые этапы не являются взаимозависимыми, их можно выполнять параллельно. из. Многоэтапный параллелизм потребляет больше системных ресурсов.

Оператор Hive SQL может быть преобразован в несколько заданий MapReduce, каждое задание представляет собой этап, и эти задания выполняются последовательно. ОК, это также можно увидеть в журнале работы cli. Но иногда эти задачи не зависят друг от друга, если ресурсы кластера Если исходник позволяет, несколько этапов, не зависящих друг от друга, могут выполняться одновременно, что экономит время и повышает скорость выполнения, но если Если ресурсов кластера недостаточно, включение параллелизма приведет к тому, что каждое задание будет вытеснять ресурсы друг друга, что приведет к снижению общей производительности выполнения. включить Распараллеливание:

## 可以开启并发执行。
set hive.exec.parallel=true;

## 同一个sql允许最大并行度,默认为8。
set hive.exec.parallel.thread.number=16;

3.5 Спекулятивное исполнение

В среде распределенного кластера из-за программных ошибок (в том числе ошибок в самом Hadoop), несбалансированной нагрузки или неравномерного распределения ресурсов и т. д. Из-за этого скорость выполнения нескольких задач одного и того же задания будет непостоянной, а скорость выполнения некоторых задач может быть значительно ниже, чем у других задач. (Например, задача задания выполнена только на 50%, а все остальные задачи уже выполнены), то эти задачи замедлят выполнение задания. Общий ход выполнения. Во избежание такой ситуации в Hadoop используется механизм спекулятивного выполнения (Speculative Execution), который По определенным правилам выводится задача «сдерживания»,и запустить задачу резервного копирования для такой задачи, имея эту задачу одновременно с исходной задачей Обработайте те же данные и, наконец, выберите результат расчета первого успешного запуска для завершения задачи в качестве окончательного результата..

# 启动mapper阶段的推测执行机制
set mapreduce.map.speculative=true;

# 启动reducer阶段的推测执行机制
set mapreduce.reduce.speculative=true;

Эти функции можно отключить, если пользователь очень чувствителен к отклонениям во время выполнения. Если пользователю необходимо ввести большое количество данных Если выполняется длинная MapTask или ReduceTask, потери, вызванные запуском спекулятивного выполнения, огромны.

3.6 Строгий режим улья

Так называемый строгий режим означает, что пользователям не разрешено выполнять рискованные операторы HiveQL. Но в Улье это Чтобы повысить эффективность выполнения операторов SQL, можно установить строгий режим, чтобы в полной мере использовать некоторые функции Hive.

## 设置Hive的严格模式
set hive.mapred.mode=strict;

set hive.exec.dynamic.partition.mode=nostrict;

Примечание. При установленном строгом режиме действуют следующие ограничения:

1、对于分区表,必须添加 where 对于分区字段的条件过滤
    select * from student_ptn where age > 25
    
2、order by 语句必须包含 limit 输出限制
    select * from student order by age limit 100;

3、限制执行笛卡尔积的查询
    select a.*, b.* from a, b;

4、在hive的动态分区模式下,如果为严格模式,则必须需要一个分区列式静态分区

3.6 Перекос данных

Перекос данных может относиться к содержимому, упомянутому в предыдущей статье Spark.Эта статья расскажет вам обо всех аспектах настройки Spark Core.

Finally

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

qrcode_for_gh_dc11428dec8d_344.jpg