Статья для понимания идей настройки Hive [карта ума, рекомендуемая коллекция]

Apache Hive

Это 8-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления

текст

在这里插入图片描述

1. Получить

  • Выборка выборки означает, что == запросы в Hive для определенных ситуаций могут быть рассчитаны без использования MapReduce ==

  • Например: выберите * у сотрудника; в этом случае Hive может просто прочитать файл в каталоге хранилища, соответствующем сотруднику, а затем вывести результат запроса в консоль

  • В файле hive-default.xml.template hive.fetch.task.conversion по умолчанию имеет значение more,

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

упражняться

  • Установите для hive.fetch.task.conversion значениеnone, а затем выполните запрос, программа MapReduce будет выполнена
set hive.fetch.task.conversion=none;
select * from employee;
select sex from employee;
select sex from employee limit 3;
  • Установите для hive.fetch.task.conversion значениеmore, а затем выполните оператор запроса. Следующие методы запроса не будут выполнять программу MapReduce.
set hive.fetch.task.conversion=more;
select * from employee;
select sex from employee;
select sex from employee limit 3;

2. Локальный режим

  • При тестировании клиента Hive режим задания Hadoop включен по умолчанию, и задача отправляется в кластер для выполнения, что приведет к очень медленному вычислению;

  • Hive может обрабатывать задачи на одном компьютере в локальном режиме. Для небольших наборов данных время выполнения может быть значительно сокращено.

упражняться

--开启本地模式,并执行查询语句
set hive.exec.mode.local.auto=true;//开启本地mr

--设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,
--默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;

--设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,
--默认为4
set hive.exec.mode.local.auto.input.files.max=5;

--执行查询的sql语句
select * from employee cluster by deptid;
--关闭本地运行模式
set hive.exec.mode.local.auto=false;
 select * from employee cluster by deptid;

3. Оптимизация таблицы

3.1 Маленькая таблица, соединение большой таблицы

  • Ключи относительно разбросаны, а таблица с небольшим объемом данных размещается слева от объединения, что может эффективно снизить вероятность ошибок переполнения памяти; кроме того, вы можете использовать объединение карт, чтобы сделать таблицу небольшого размера ( количество записей ниже 1000) расширенная оперативная память. Завершите уменьшение на стороне карты.
  • Фактический тест показал, что новая версия hive оптимизировала небольшие таблицы для объединения больших таблиц и большие таблицы для объединения небольших таблиц. Нет никакой очевидной разницы между маленьким столиком слева и справа.

3.2 Большая таблица соединяется с большой таблицей

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

3.3 map join

  • Если MapJoin не указан или не соответствует условиям MapJoin, синтаксический анализатор Hive преобразует операцию Join в Common Join, то есть объединение завершается на этапе сокращения. Вероятность искажения данных. Вы можете использовать MapJoin для загрузки всех небольших таблиц в память и объединения на стороне карты, чтобы избежать обработки редуктором.

  • 1. Включите настройки параметра MapJoin

--默认为true
set hive.auto.convert.join = true;
  • 2. Настройка порога для больших и малых таблиц (по умолчанию 25M, что считается маленькой таблицей)
set hive.mapjoin.smalltable.filesize=25000000;

3.4 group By

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

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

  • Включить настройки параметров агрегации на стороне карты

--是否在Map端进行聚合,默认为True
set hive.map.aggr = true;
--在Map端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval = 100000;
--有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata = true;

Если для параметра установлено значение true, сгенерированный план запроса будет иметь два задания MR.

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

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

Затем второе задание MR распространяется на функцию «Уменьшить по группе по ключу» в соответствии с результатами предварительной обработки данных (этот процесс может гарантировать, что одна и та же группа «По ключу» будет распределена на ту же функцию «Уменьшить»), и, наконец, завершает окончательную операцию агрегирования.

3.5 count(distinct)

  • Это не имеет значения, когда объем данных мал.Когда объем данных велик, поскольку операция подсчета отдельных должна быть завершена задачей сокращения, объем данных, которые должны быть обработаны этой задачей сокращения, слишком велик, что это затруднит выполнение всей работы. Как правило, используется подсчет отдельных. Сначала замените по группам, а затем подсчитайте
--每个reduce任务处理的数据量 默认256000000(256M)
set hive.exec.reducers.bytes.per.reducer=32123456;

select  count(distinct ip )  from log_text;

转换成

select count(ip) from (select ip from log_text group by ip) t;


虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。

3.6 Декартово произведение

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

4. Используйте обрезку разделов и обрезку столбцов

  • Отфильтруйте как можно больше данных как можно раньше, чтобы избежать большого объема данных, поступающих во внешний SQL.
  • Обрезка столбца
    • Получайте данные только для тех столбцов, которые вам нужны, сокращая ввод данных.
  • Обрезка раздела
    • Разделы — это, по сути, каталоги в улье, и вырезание разделов может легко и напрямую отфильтровать большую часть данных.
    • Попробуйте использовать фильтрацию разделов вместо выбора *

5. Параллельное исполнение

  • Параллельно выполняет этапы оператора SQL, которые не зависят друг от друга. Улучшить использование ресурсов кластера
--开启并行执行
set hive.exec.parallel=true;
--同一个sql允许最大并行度,默认为8。
set hive.exec.parallel.thread.number=16;

6. Строгий режим

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

  • При установке значения свойства hive.mapred.mode по умолчанию используется нестрогий режим.nonstrict. Чтобы включить строгий режим, вам нужно изменить значение hive.mapred.mode.strict, включение строгого режима может запретить 3 типа запросов.

--设置非严格模式(默认)
set hive.mapred.mode=nonstrict;

--设置严格模式
set hive.mapred.mode=strict;
  • (1) Для многораздельных таблиц, если оператор where не содержит условия фильтрации поля раздела для ограничения области действия, его выполнение не допускается.
--设置严格模式下 执行sql语句报错; 非严格模式下是可以的
select * from order_partition;

异常信息:Error: Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "order_partition" Table "order_partition" 
  • (2) Для запросов, использующих оператор order by, необходимо использовать оператор limit
--设置严格模式下 执行sql语句报错; 非严格模式下是可以的
select * from order_partition where month='2019-03' order by order_price; 

异常信息:Error: Error while compiling statement: FAILED: SemanticException 1:61 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'order_price'
  • (3) Запросы, ограничивающие декартово произведение

    • В строгом режиме избегайте запросов с декартовыми произведениями

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

  • Повторное использование JVM — это содержимое параметров настройки Hadoop, которое оказывает большое влияние на производительность Hive, особенно для сценариев, где трудно избежать небольших файлов или сценариев с большим количеством задач, большинство из которых имеют короткое время выполнения.

  • Повторное использование JVM позволяет повторно использовать экземпляр JVM N раз в одном и том же задании. Сокращение времени запуска и уничтожения процессов.

-- 设置jvm重用个数
set mapred.job.reuse.jvm.num.tasks=5;

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

  • Hadoop принимает механизм спекулятивного выполнения (Speculative Execution),

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

--开启推测执行机制
set hive.mapred.reduce.tasks.speculative.execution=true;

9. Сжатие

  • Сжатие промежуточных данных таблицы Hive
#设置为true为激活中间数据压缩功能,默认是false,没有开启
set hive.exec.compress.intermediate=true;
#设置中间数据的压缩算法
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;
  • Сжатие конечного результата таблицы Hive
set hive.exec.compress.output=true;
set mapred.output.compression.codec= 
org.apache.hadoop.io.compress.SnappyCodec;

Для получения дополнительной информации о сжатии данных Hive см.

10. Перекос данных

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

  1. Как правило, задание порождает одну или несколько задач карты из входного каталога.

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

  1. Чем больше карт, тем лучше?

ответ отрицательный.

Если в задаче много маленьких файлов (намного меньше, чем размер блока 128 м), каждый маленький файл также будет рассматриваться как блок и завершаться задачей карты,

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

Кроме того, количество карт, которые можно выполнять одновременно, ограничено.

  1. Гарантируется ли, что каждая карта обрабатывает блоки файлов размером около 128 м, поэтому вы можете расслабиться и отдохнуть?

Ответ не обязательно.

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

Для вышеуказанных задач 2 и 3 нам нужно выбрать два пути их решения: уменьшить количество карт и увеличить количество карт;

Слияние небольших файлов

  • Объединяйте небольшие файлы перед выполнением карты, уменьшая количество карт:

  • CombineHiveInputFormat имеет функцию объединения небольших файлов (системный формат по умолчанию)

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

Сложные файлы увеличивают количество карт

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

  • Способ увеличить карту

    • Согласно формуле ==computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize))==
    • ==Настройте максимальное значение maxSize==. Количество карт можно увеличить, сделав максимальное значение maxSize меньше размера блока.
MapReduce.input.fileinputformat.split.minsize=1 默认值为1

MapReduce.input.fileinputformat.split.maxsize=Long.MAXValue 默认值Long.MAXValue因此,默认情况下,切片大小=blocksize 

maxsize(切片最大值): 参数如果调到比blocksize小,则会让切片变小,而且就等于配置的这个参数的值。

minsize(切片最小值): 参数调的比blockSize大,则可以让切片变得比blocksize还大。
  • Например
--设置maxsize大小为10M,也就是说一个block的大小为10M
set MapReduce.input.fileinputformat.split.maxsize=10485760;

Разумно установите количество сокращений

  • 1. Отрегулируйте количество методов уменьшения 1

① Объем данных по умолчанию, обрабатываемых каждым сокращением, составляет 256 МБ.

set hive.exec.reducers.bytes.per.reducer=256000000;

② Максимальное количество редукторов на задачу, по умолчанию 1009.

set hive.exec.reducers.max=1009;

③ Формула для расчета количества редукторов

N=min(参数2,总输入数据量/参数1)
  • 2. Отрегулируйте количество методов уменьшения 2
--设置每一个job中reduce个数
set MapReduce.job.reduces=3;
  • 3. Количество уменьшить не чем больше, тем лучше
    • Чрезмерный запуск и инициализация сокращения также требует времени и ресурсов;
    • В то же время слишком большое сокращение приведет к созданию большого количества файлов, что может привести к проблемам с небольшими файлами.