Hive Поскольку компонент хранилища данных широко используется в области больших данных, особое внимание следует уделять эффективности при проектировании и выполнении запросов. 。Влияние Hive Эффективность почти от не дачисло по сумме слишком велика, и да Перекос данные, число Избыточность данных, слишком много заданий или операций ввода-вывода, MapReduce Необоснованное распределение и так далее. В улей Тюнинг включает в себя оба Hive Что касается конструкции стола, HiveHQL Оптимизация самой постановки также включает в себя Hive Параметры конфигурации и базовый двигатель MapReduce корректировки 。
В этой статье я предлагаю вам сосредоточиться в основном на следующих четырех аспектах.
Структура каталогов
Чтобы не учиться вслепую, нам нужно сначала знать Hive настраиватьотличныйизважность:существуют при условии, что результаты деятельности останутся неизменными.,Уменьшите использование ресурсов,уменьшать Задачаизосуществлятьвремя。
Прежде чем начать, вам необходимо иметь общее представление о следующих «Заметках».
Ладно, давайте официально поговорим о деталях процесса тюнинга.
HiveizTable создание и настройка уровня дизайна,В основном говорят оизКак разумно организовать информацию,Удобен для последующих и эффективных расчетов. Например, создайте тип таблицы,Хранение файлов Формат,Сжимать лиждатьждать。
Давайте сначала рассмотрим, какие бывают настольные типы ульев?
1. Таблица разделов 2. Стол-ковш
Таблица разделов Он предназначен для классификации и хранения данных в одном или нескольких измерениях, причем один раздел соответствует одному каталогу. Если в условии фильтра есть поле раздела, то Hive Необходимо просматривать только файлы в соответствующем каталоге раздела. Нет необходимости просматривать глобальные данные, что значительно снижает объем обрабатываемых данных и тем самым повышает эффективность запросов. 。
тытакже Можетк Поймите так:когдаодининдивидуальный Hive В большинстве случаев таблица запросов будет фильтроваться на основе определенного индивидуального поля, поэтому очень удобно создавать Таблицу. разделов, это поле является полем раздела。
Например:
select1: select .... where country = "china"
select2: select .... where country = "china"
select3: select .... where country = "china"
select4: select .... where country = "china"
Это похоже на категоризацию: каждое значение поля города образует отдельный раздел. Фактически, каждый раздел соответствует Каталог в HDFS . При создании таблицы путем включения partitioned by осознавать, использовать partition Измерение не является столбцом фактических данных, конкретный флаг раздела задается при вставке содержимого. Если вы хотите запросить содержимое определенного раздела, вы можете использовать where Предложения, похожие на where tablename.partition_column = a
осознать 。
Далее попробуйте следующее:
CREATE TABLE page_view
(
viewTime INT
, userid BIGINT
, page_url STRING
, referrer_url STRING
, ip STRING COMMENT 'IP Address of the User'
)
PARTITIONED BY
(
date STRING
, country STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '1' STORED AS TEXTFILE
;
load data local inpath '/home/bigdata/pv_2018-07-08_us.txt' into table page_view partition(date='2018-07-08', country='US');
SELECT
page_views.*
FROM
page_views
WHERE
page_views.date >= '2008-03-01'
AND page_views.date <= '2008-03-31'
AND page_views.referrer_url like '%xyz.com'
;
Подведем краткий итог:
1. Когда вы поймете, что часто используется индивидуальное поле, постройте таблицу. разделов, используйте это индивидуальное поле, когда Делать поле раздела 2. При запросе используйте поля разделов для фильтрации, чтобы избежать полного сканирования таблицы. Вам нужно только просканировать данные одного раздела этой таблицы.
Концепции группирования и секционирования очень похожи. Они разделяют данные на несколько разных категорий. Разница в том, что правила разные!
1. Раздел: на основе значений полей: раздел содержит только все записи с этим значением. Данные, не являющиеся текущим разделом, не должны находиться в текущем разделе. Текущий раздел будет содержать только данные с текущим значением раздела. 2. Бактинг: Правило по умолчанию: Хэш. В сегменте будет несколько разных значений. Если сегмент содержит определенное значение, все записи этого значения должны находиться в этом сегменте.
Hive Бакет, сегментирование, относится к разделению данных в соответствии со значением указанного столбца. key руководить hash,hash назначенномучислоглазизведросередина,так Делатьизглазизи Таблица Как и в случае с разделами, при фильтрации нет необходимости глобально просматривать все данные, достаточно лишь просмотреть все существующие сегменты. Таким образом, также может быть достигнута эффективная выборка. 。
Основные сценарии применения таблиц сегментов:
1. Выборка 2. присоединиться
В следующем примере столбец userid используется в качестве основы для сегментов; всего задано 32 сегмента.
CREATE TABLE page_view
(
viewTime INT
, userid BIGINT
, page_url STRING
, referrer_url STRING
, ip STRING COMMENT 'IP Address of the User'
)
COMMENT 'This is the page view table' PARTITIONED BY
(
dt STRING
, country STRING
)
CLUSTERED BY
(
userid
)
SORTED BY
(
viewTime
)
INTO
32 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY '1' COLLECTION ITEMS TERMINATED BY '2' MAP KEYS TERMINATED BY '3' STORED AS SEQUENCEFILE
;
Синтаксис группирования также очень прост:
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS CLUSTERED BY(userid) значит в соответствии с userid Приходите и разделите ведра SORTED BY(viewTime) в соответствии с viewtime Приходите руководить сортировкой внутри бочки INTO 32 BUCKETS Сколько ведер разделено на
Обычно выборка осуществляется на основе всех данных, поэтому эффективность низкая, поскольку требуется доступ ко всем данным. И если в отдельной таблице действительно есть определенный столбец, сделанный Понятно сегмент, вы можете выбрать сегмент с указанным порядковым номером среди всех сегментов, что снижает количество посещений. 。
Как показано в следующем примере, выбираются все данные третьего сегмента среди 32 сегментов в page_view:
SELECT *
FROM
page_view TABLESAMPLE(BUCKET 3 OUT OF 32)
;
Как показано в следующем примере, отбирается половина данных в третьем сегменте из 32 сегментов в page_view:
SELECT *
FROM
page_view TABLESAMPLE(BUCKET 3 OUT OF 64)
;
Давайте суммируем три распространенных метода выборки:
Выборка ведра:
select * from student tablesample(bucket 3 out of 32);
Случайная выборка: rand() письмочисло
select * from student order by rand() limit 100; // Низкая эффективность
select * from student distribute by rand() sort by rand() limit 100; // Рекомендуется использовать это
число Выборка блока данных: функция tablesample() число
select * from student tablesample(10 percent); # процент
select * from student tablesample(5 rows); # ХОРОШОчисло
select * from student tablesample(5 M); # размер
существовать HiveSQL из create table
утверждение, вы можете использовать stored as ...
Укажите формат хранения таблицы. Апач Hive поддерживать Apache Hadoop середина использует несколько знакомых форматов файлов, таких как TextFile
、SequenceFile
、RCFile
、Avro
、ORC
、ParquetFile
ждать 。
Формат хранения обычно необходимо выбирать в соответствии с направлением бизнеса.,существоватьнасиз Практическая работасередина,Большинствочисло Все таблицы используютTextFile
иParquet
двадобрыйхранилище Формат Изодин。TextFile
да Самый простойизхранилище Формат,Это обычная текстовая запись,Также даHiveиз формата по умолчанию. Хотя это относительно дорого,Эффективность запросов также низкая,но это большеиздаделатьдлятрамплин Приходитьделатьиспользовать。RCFile
、ORC
、Parquet
ждать Форматиз Таблицы нельзя импортировать напрямую из файлов.числов соответствии с,должно бытьTextFile
Приходить Делатьсерединаизменять。Parquet
иORC
Вседа Apache подиз Открытый исходный код Список Режимхранилище Формат。Хранилище столбцов больше подходит для пакетных запросов OLAP, чем традиционное хранилище строк.,а такжеподдерживатьлучшеизсжатиеикодирование。
При создании таблиц, особенно широких, старайтесь использовать ORC
、ParquetFile
этотнекоторый Список Режимхранилище Формат,Поскольку хранилище столбцов из таблицы,Каждыйодин Списокизчислов соответствии ссуществоватьфизиканачальстводахранилищесуществоватьодинростиз,Когда Hive запрашивает, он будет просматривать только необходимые столбцы.,Обрабатываются большие объемы информации.
Gzip
、Bzip2
ждатьсжатие Способодинростделатьиспользовать(Система будетсдинамический контроль,При запросесдинамическая декомпрессия), Рекомендуется использовать кратныйизсжатиеалгоритм。NONE
、RECORD
、BLOCK
。RECORDсжатие Низкая ставка,одинобщий советделатьиспользоватьBLOCK
сжатие 。Parquet
илиORC
,Не только уменьшает емкость хранилища,Также оптимизация Понятный запрос,сжатие,Таблица ассоциации ожидания производительности.Hive В конечном итоге выражение преобразуется в MapReduce Программа приходит интересиз, и MapReduce из-за проблем с производительностью и сетевого ввода-вывода и диск IO, чтобы решить проблему с производительностью, самое главное уменьшатьчислов соответствии сколичество,верночислов соответствии сруководитьсжатиедаиндивидуальныйхороший способ。сжатие Хотядауменьшать Понятночислов соответствии сколичество,нодасжатие Этот процесс потребляет ЦП, участвуй Hadoop середина, часто узкое место в производительности не существует CPU,CPU Давление невелико, поэтому сжатие используется полностью, а пространство относительно простаивает. CPU。
Часто используемые методы сжатия вернее, чем
Как выбрать метод сжатия
1. Степень сжатия 2. Скорость сжатия и декомпрессии 3、данетподдерживатьsplit
поддерживатьразделениеиз Файлы могутки ХОРОШОиз Сколькоиндивидуальный mapper Программа обрабатывает большие файлы данных. Большинство файлов не являются делимыми, поскольку эти файлы можно читать только начиная с заголовка.
Сжимать ли
1. Вычислительно интенсивный,Нетсжатие,неттогда впередодиншаг Увеличивать ПонятноCPUизгруз 2. Использование интенсивной сети, рекомендуется сжатие для уменьшения передачи данных по сети.
Каждый отдельный метод сжатия должен быть верным из класса.
Сжатие использует:
Job Выходной файл соответствии с Block к GZip из Способруководитьсжатие:
## Значение по умолчаниюдаfalse
set mapreduce.output.fileoutputformat.compress=true;
## Значение по умолчаниюда Запись
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.GzipCod
верно Hive Вывод результатовисерединамежду Всеруководитьсжатие:
## Значение по умолчаниюдаfalse,Нетсжатие
set hive.exec.compress.output=true
## Значение по умолчаниюдаfalse,Если это правда, MR устанавливается в состояние «исжатие». давать возможность
set hive.exec.compress.intermediate=true
Чтобы написать эффективный SQL для Понятно, нам нужно знать синтаксис изосуществования HQL и ввести некоторые управляющие параметры для настройки. HQL изосуществлять。
Hive из SQL заявлениесуществоватьосуществлять Необходимо раньше Воля SQL Заявление преобразуется в MapReduce Задача, поэтому вам нужно Понятно, чтобы понять специфику процесса конвертации, вы можете ксуществовать SQL Заявление середина введите следующую команду Проверить бетон и зосуществлять план 。
## План Проверятьосуществлять, добавьте расширенное ключевое слово, чтобы сделать Проверять более подробным и зосуществлять план
explain [extended] query
Обрезка столбцов означает чтение только необходимых столбцов при запросе.,Очистка разделов означает чтение только необходимых разделов.. Когда имеется много столбцов или большой объем данных, если select * или Без указания разделов эффективность полного сканирования столбцов и таблиц будет очень низкой.
Hive существоватьчитатьчислов соответствии сиз времени,МожеткЧитайте только столбцы из, необходимые для запроса середина, и игнорируйте другие столбцы из.。так Делать Можетксохранятьчитать Получите накладные расходы:серединамеждуповерхностьхранилищенакладные расходыичислов соответствии с整合накладные расходы。
## Обрезка столбца, получение только числового запроса, который середина должен использовать столбец из, значение по умолчанию — даtrue
set hive.optimize.cp = true;
Воля SQL заявлениесерединаиз where Логика предикатов максимально развита, а данные обрабатываются в максимально возможной степени. верноинглогический оптимизаторда PredicatePushDown
。
## По умолчанию даtrue
set hive.optimize.ppd=true;
Пример программы:
## оптимизация До
SELECT a.*,
b.*
FROM
a
JOIN b ON a.id = b.id
WHERE
b.age > 20;
## оптимизацияпосле
SELECT a.*,
c.*
FROM
a
JOIN (
SELECT
*
FROM
b
WHERE
age > 20
) c ON a.id = c.id;
Обрезка столбцов означает чтение только необходимых столбцов при запросе.,Очистка разделов означает чтение только необходимых разделов. . Когда имеется много столбцов или большой объем данных, если select * или Без указания разделов эффективность полного сканирования столбцов и таблиц будет очень низкой. 。
существовать Запросизв В процессе выберите только необходимый раздел, вы можете прочитать элемент числа раздела, меньше можно прочитать объем данных из числа. 。
Hive связан с обрезкой разделов:
## По умолчанию даtrue
set hive.optimize.pruner=true;
существовать HiveQL Стадия анализа ColumnPruner логический оптимизатор 。
SELECT
*
FROM
student
WHERE
department = "AAAA";
Map Объединение входных данных
существоватьосуществлять MapReduce При программировании обычно файл необходимо разделить на фрагменты. mapTask справиться. Но, если верить источнику, большое количество маленьких файлов приведет к запуску большого количества маленьких файлов. mapTask Проблема, на это будет потрачено много ресурсов. к Воля ввод из маленьких файлов руководить слиянием, от и меньше mapTask Количество задач 。
## После ввода и объединения файлов на стороне карты, соответствии сblockизразмерразделение(по умолчанию)
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
## Ввод карты, без слияния
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
Объединение вывода карты/сокращения
Большое количество мелких файлов приведет к HDFS приносить Приходитьдавление,Влияние Эффективность обработки。кпроходитьслить Map и Reduce из файлов результатов для устранения тестирования 。
## да Объединять ли выходные файлы карты, Значение по умолчанию — true
set hive.merge.mapfiles=true;
## да Если объединять выходные файлы на стороне сокращения, значение по умолчанию — false
set hive.merge.mapredfiles=true;
## Объединить файлыизразмер,по умолчаниюценитьдля256000000
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; // серверная стойка
hive.merge.size.per.task
и mapred.min.split.size.per.node
Объединяем усилия:
1、по умолчанию Состояние Первыйпоставь этоиндивидуальныйузелначальствоизвсечислов соответствии сруководитьслить,еслислитьиз Чтоиндивидуальныйдокументизразмер Превосходить Понятно256MСразувключатькроме тогоодининдивидуальныйдокументпродолжатьслить 2. Текущее начальное число меньше 256M, поэтому оно будет объединено в один логический срез.
Картачислослишком большая:когдавходитьдокумент Очень большой,MapTask Особенно много, каждый вычислительный узел выделен изучаиз MapTask Их много, в это время можно подумать поменьше MapTask расчет , увеличивая каждый MapTask Обработка данных. если MapTask Слишком много, окончательный сгенерированный файл результатов будет слишком большим. 。
причина: 1. Выходной файл этапа «Карта» слишком мал, в результате чего образуется большое количество маленьких файлов. 2. Инициализация и создание Map очень затратны.
Mapчисло слишком маленькое:когдавходитьдокумент Всеочень большой,Задача сложная логика,MapTask изучение идет очень медленно, можно рассмотреть Увеличить MapTask номер, чтобы сделать каждый MapTask Уменьшить объем обработки данных и повысить эффективность. 。
причина: 1. Параллельная обработка файлов или запросов мала, а время выполнения задания слишком велико. 2. При большом количестве заданий кластер легко заблокировать.
существовать MapReduce из «Кейса программирования середина» мы узнали, что индивидуальный MapReduce Job из MapTask Число делится на ввод InputSplit Решите из. А входной фрагмент да имеет вид FileInputFormat.getSplit()
Решатьиз。одининдивидуальный Входные фрагментыверноотвечатьодининдивидуальный MapTask, а входное шардирование определяется тремя параметрами:
Входные фрагментыразмеризвычислитьдаэтот Что?вычислитьвне Приходитьиз:
long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
По умолчанию,Входные фрагментыразмери HDFS Размер блока данных по умолчанию для кластера одинаков, то есть один блок данных используется по умолчанию, а другой включен. MapTask руководитьиметь дело с,так Делатьизвыгодадаизбегать Понятносерверный узелмеждуизчислов соответствии спередача инфекции,улучшать job Эффективность обработки 。
Две классические элементы управления MapTask изиндивидуальныйчислоплан:уменьшать MapTask число или Увеличивать MapTask число:
1. Уменьшить MapTask числодапроходить Объединение небольших По данным источника 2、Увеличивать MapTask числокпроходитьконтрольначальствоодининдивидуальный job из reduceTask индивидуальныйчисло Важное внимание:Нетрекомендоватьпоставь этоиндивидуальныйценитьруководитьслучайныйнастраивать!рекомендоватьиз Способ:делатьиспользовать По умолчанию изрезатькусокразмер Прямо сейчас Может。если Необходимо настроить,Лучшее да, нарезанное кубиками из N раз числа
Метод расчета
Общий размер входного файла: total_size HDFS настраиватьизчислов соответствии скусокразмер:dfs_block_size default_mapper_num = total_size / dfs_block_size
MapReduce середина предоставляет Понятное число следующих параметров для управления map Задачаиндивидуальный номер, от буквального начализма, выглядит так, что можно задать напрямую MapTask похоже на индивидуальное числооиз, но, к сожалению, это невозможно, это значение индивидуального параметра только больше, чем существующее default_mapper_num
Оно вступит в силу только тогда, когда 。
## Значение по умолчанию да2
set mapred.map.tasks=10;
Итак, если нам нужно уменьшить MapTask числоколичество,нодадокументразмердазафиксированныйиз,Так что же нам делать?
кпроходить mapred.min.split.size
настраивать Каждыйиндивидуальный Задачаиметь дело сиздокументизразмер,этотиндивидуальныйразмертолькосуществоватьбольшой В dfs_block_size
времявступит в силу
split_size = max(mapred.min.split.size, dfs_block_size) split_num = total_size / split_size compute_map_num = Math.min(split_num, Math.max(default_mapper_num, mapred.map.tasks))
Таким образом, вы можете MapTask числоколичество Понятно 。
Подводя итоги контроля mapper индивидуальныйчислоизметод:
1、еслидумать Увеличивать MapTask индивидуальныйчисло,Можеткнастраивать mapred.map.tasks это большая ценность отдельного человека 2. Если вы хотите уменьшить MapTask индивидуальныйчисло,Можеткнастраивать maperd.min.split.size это большая ценность отдельного человека 3. Если на входе большое количество маленьких файлов и вы хотите уменьшить mapper индивидуальныйчисло,кпроходитьнастраивать hive.input.format Объединение небольших файлов
Если вы хотите настроить mapper индивидуальныйчисло,существовать Корректирование До,необходимо определитьсяиметь дело сиздокументбольшой概размеркидокументизжитьсуществоватьформа(дабольшойколичество Маленькийдокумент,Также да один отдельный большой файл),Затем Снованастраиватьподходящийизженьшеньчисло。Нет Может быть слепымглазруководить Насилиенастраивать,В противном случае это будет контрпродуктивно.
MapTask число Количества и входные файлыиз split число тесно связано,существовать Hadoop Исходный кодorg.apache.hadoop.mapreduce.lib.input.FileInputFormat
Класс середина можно увидеть split Разделение конкретной логики. Может напрямую относиться к числу mapred.map.tasks
(значение по умолчанию 2), чтобы установить MapTask числоизожидаемого значения, но оно может не вступить в силу 。
если число DownloadTask слишком велико,одининдивидуальный ReduceTask Будет создан файл результатов, а также множество небольших файлов. Затем эти файлы результатов будут использоваться в качестве следующего файла. Job из входных данных возникнет проблема, заключающаяся в том, что небольшие файлы необходимо объединить, и при этом будет запущена и инициализирована задача уменьшения. Нужно потреблять ресурсы 。
если ReduceTask Количество чисел слишком мало, такой индивидуальный ReduceTask Необходимо обработать большой объем данных, что может легко замедлить время работы. ООМ, Перекос может произойти Проблема с данными приводит к тому, что весь индивидуальный запрос занимает много времени. По умолчанию Улей Распределение reducer индивидуальное число определяется следующими параметрами:
Число1: hive.exec.reducers.bytes.per.reducer (по умолчанию 256M) Справочное число2:hive.exec.reducers.max (по умолчанию 1009) См. число3: mapreduce.job.reduces. (Значение по умолчанию — -1, что означает отсутствие настроек, тогда в соответствии скначальстводваиндивидуальныйженьшеньчисло руководитьнастраивать)
Формула расчета Редуц Таск:
N = Math.min(Справочное число2,общий вводчислов соответствии сразмер / номер 1)
кпроходить Изменятьначальствоописыватьдваиндивидуальныйженьшеньчислоизценить Приходитьконтроль ReduceTask расчет。такжекпроходить
set mapred.map.tasks=10;
set mapreduce.job.reduces=10;
Часто приходится вручную указывать ReduceTask индивидуальныйчисло。принимая во внимание Mapper Объем данных выходного числа фазы обычно будет значительно больше, чем входное уменьшение, поэтому даже если он не установлен ReduceTask индивидуальныйчисло,перезагрузить Справочное число2 Это также необходимо 。
Основываясь на опыте, вы можете Справочное число2 установлен на M * (0.95 * N) (N — кластер NodeManager индивидуальное число). Вообще говоря, NodeManager и DataNode изиндивидуальныйчислодаодин Образециз。
Общий принцип оптимизации соединения:
1、отличный Первый После фильтрации СноваруководитьJoinдействовать,максимум Ограничить иуменьшать участиеjoinизчислов соответствии сколичество 2. При объединении маленькой таблицы с большой лучше всего запустить функцию Mapjoin, которая автоматически включает функцию Mapjoin. маленькие количество часов не может превышать 25M и может быть изменено 3、Join Если условия oniz одинаковы, лучше всего поставить одну и ту же индивидуальную работу, а объединяющую таблицу отсортировать в порядке от меньшего к большему: выберите a., b., c.* from a join b on a.id = b.id join c on a.id = c.i 4. Если несколько столов Делатьобъединяются, если условия индивидуальной ссылки одинаковы и будут конвертированы в индивидуальную работу.
отличный Первыйфильтрчислов соответствии с
выхлопколичествоуменьшать Каждыйиндивидуальныйэтапизчислов соответствии сколичество,верно ВТаблица разделов можно максимально использовать поле начального раздела, и при этом выбирать только тот столбец, который необходимо использовать в дальнейшем, максимум Ограничить иуменьшать участие Join рассчитано кколичество。
Принцип соединения маленького стола с большим столом
маленькие часы join большие Принципу следует следовать при просмотре соединения маленького стола с большим столом,Причина да join действоватьиз reduce сцена, расположенная в join левый Содержимое таблицы будет загружено в память. Если запись воля мала, таблица будет помещена в существующий, что может эффективно снизить вероятность переполнения памяти. присоединиться Порядок выполнения генерируется слева направо Job,отвечать Должен Гарантированная непрерывность Запроссерединаизповерхностьизразмеротслева направодапо очереди Увеличиватьиз。
Используйте тот же ключ подключения
существовать hive середина,когдаверно 3 индивидуальныйили Дажемногооткрытьповерхностьруководить join час,если on условия используют одни и те же поля, они будут объединены в одно MapReduce Работа, использующая эту функцию, может быть такой же, как и к Воля. join on положить в job чтобы сэкономить время выполнения 。
Попробуйте действовать атомарно
Старайтесь избегать SQL, содержащего сложную логику. Для выполнения сложной логики можно использовать прерывистые таблицы.
Большой стол Присоединиться к большому столу
1. Фильтрация пустого ключа. Иногда время соединения истекает из-за того, что для некоторых ключей слишком много данных, и данные для одного и того же ключа будут отправлены в одно и то же место назначения. редьюсерначальство, из-за чего не хватает памяти. На данный момент нам следует тщательно проанализировать эти исключения из ключа, во многих случаях эти ключи должны быть из числа в соответствии с числом исключений, нам необходимо постоянное выполнение SQL-оператора серединаруководить фильтрацию. 2. Преобразование пустого ключа: иногда, хотя определенный индивидуальный ключ пуст и содержит много данных, но соответствующие данные не являются аномальными данными, они должны содержать существующие соединения. из результата середина, в это время мы можем назначить индивидуальное случайное значение пустому полю таблицы k aсерединаключ, чтобы данные числа были случайным образом и равномерно распределены по разным изредукторам. начальство 。
Используйте эту меру оптимизации всякий раз, когда можете! большие часы join маленькие часы маленькие часы Соответствуют потребностям: маленькие Когда часовчисло меньше контрольного условия 。
MapJoin да Воля join Меньшие столы с обеих сторон раздаются непосредственно каждому человеку. map процессиз Внутрижитьсередина,существовать map процесссерединаруководить join действовать,так Сразу Нетиспользоватьруководить reduce шагов, тем самым увеличивая скорость. только join Операция необходима для включения MapJoin 。
## да Нет согласно данным маленький часыизразмер,сдвигаться Воляreduceконецизcommon join Преобразовать в карту join,Волямаленькие часы刷入Внутрижитьсередина。
## верноотвечатьлогический оптимизатордаMapJoinProcessor
set hive.auto.convert.join = true;
## 刷入Внутрижитьповерхностьизразмер(байт)
set hive.mapjoin.smalltable.filesize = 25000000;
## hive преобразует обычное соединение в соединение по карте в зависимости от размера таблицы из Воля
set hive.auto.convert.join.noconditionaltask=true;
## Насколько велика таблица, которую можно автоматически активировать и разместить на внутреннем слое? LocalTask середина,по умолчаниюразмер10M
set hive.auto.convert.join.noconditionaltask.size=10000000;
Hive Можно Круководить несколько таблиц Join。Join особенно операции Join большие Цена по тем временам очень высокая. Карта Присоединиться Особенно подходит для больших маленьких часы join из Состояние。существоватьHive Присоединяйтесь к сцене середина, обычно всегда есть одна картинка, правда маленькая, со стола, и одна картинка, правда, большая, со стола, маленькая. часы Вызов build table,большие часы Вызов probe table。Hive существоватьаналитическая зона join из SQL оператор, последняя отдельная таблица будет по умолчанию probe стол, Воля перед столом как build table И попробуйте прочитать их в память. если таблица записана в обратном порядке, проверить table существовать Передний,причина OOM из Риск высок Понятно. существует Пространственное моделированиечислено Согласно складу середина, таблица фактов да probe таблица,таблица размеров build стол. Этот вид Join Способсуществовать map непосредственно завершено join процесс, устранен уменьшить, очень эффективно. и MapJoin Также поддерживается соединение без ожидания значения 。
когда Hive осуществлять Join При этом вам нужно выбрать, какая таблица передается в потоковом режиме (stream), а какая таблица кэшируется (cache). Улей ВоляJOIN Оператор серединаизласт индивидуальной таблицы используется для потоковой передачи, поэтому нам необходимо убедиться, что эта отдельная таблица потоковой передачи существует между ними. если существовать по-другому из key начальство join Больше из таблиц, то верно для каждого человека join набор,Толькосуществовать ON Укажите большую таблицу в правой части условия. 。
Вы также можете вручную включить Mapjoin:
-- Режим SQL, существует оператор SQL серединадобавить тег MapJoin (mapjoin hint)
-- Волямаленькие часы放到Внутрижитьсередина,опустить shffleдействовать
// Существуют, когда функция MapJoin не включена,
SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;
/*+mapjoin(smalltable)*/
Sort-Merge-Bucket(SMB) Map Join
Это еще один улей Присоединяйтесь к оптимизациитехнология,делатьиспользоватьэтотиндивидуальныйтехнологияизпомещениедавсеизповерхность Вседолжендаточкаведроповерхность(bucket)иточкаведросортироватьиз(sort)。точкаведроповерхностьизоптимизация!
Конкретная реализация:
1、Игла действительно участвует в объединении. Эти два Делать имеют одинаковый ихеш, и данные в каждом индивидуальном сегменте должны быть отсортированы из числа. 2. Эти две таблицы следует разделить на сегменты и удвоить. 3. Включите SMB join из переключателя!
Некоторые общие настройки параметров:
## когдапользовательосуществлятьbucket map При присоединении, если обнаруживается, что объект не найден, запрос запрещается;
set hive.enforce.sortmergebucketmapjoin=false;
## еслиjoinизповерхностьпроходитьsort merge Соединение из условия, будет ли соединение автоматически преобразовано в сортировку merge join;
set hive.auto.convert.sortmerge.join=true;
## когдадваиндивидуальныйточкаведроповерхность join час,если join ониздаведро поле, маленькое часыизточкаведрочислодабольшие часыизразчислочас,Можеткдавать возможность mapjoin для повышения эффективности. # bucket map joinоптимизация, значение по умолчанию да false
set hive.optimize.bucketmapjoin=false;
## bucket map join оптимизация, значение по умолчанию да false;
set hive.optimize.bucketmapjoin.sortedmerge=false;
существоватьписать Join При запросе оператора, если определяется да из-за join появляться Перекос данных, то сделайте пожалуйста настройку следующим образом:
# Соединение по ключу, конечно, если число записей превышает это индивидуальное значение, будет управляться разделением, значение устанавливается в соответствии с конкретным объемом данных числа.
set hive.skewjoin.key=100000;
# процесс ifdajoin наклонен и для него должно быть установлено значение true
set hive.optimize.skewjoin=false;
есливключать Понятно,существовать Join в процессе Hive Сможет ли Воля числопревысить порог hive.skewjoin.key (по умолчанию 100000) key верно, следует из строки временно записать в файл середина, а затем запустить другого человека job Делать map join Генерируйте результаты.
проходить hive.skewjoin.mapjoin.map.tasks
Число участия также может контролировать второго человека. job из mapper число сумма, по умолчанию 10000 。
set hive.skewjoin.mapjoin.map.tasks=10000;
При объединении из, таблица из порядка из отношения: предыдущая из таблиц будет загружена в память середина. Назад из-за стола руководить сканированием диска 。
select a., b., c.* from a join b on a.id = b.id join c on a.id = c.id ;
Hive с 0.14.0 Для начала был добавлен элемент Cost based Optimizer
Приходитьверно HQL осуществлятьпланруководитьоптимизация,этотиндивидуальный Функцияпроходить hive.cbo.enable
Приходитьвключать。существовать Hive 1.1.0 После этого это feature да включен по умолчанию и может сдвигатьсяоптимизация HQL в нескольких Join из заказа и выберите подходящее из Join алгоритм 。
CBO, оптимизация затрат, план изосуществления с наименьшими затратами - лучший план изосуществования。Традицияизчислов соответствии с Библиотека,расходыоптимизацияустройство Делать Лучший внешний видоптимизацияизосуществлятьпландав соответствии св соответствии с Статистика Приходитьвычислитьиз。Hive То же самое касается и устройства изстооптимизации.
Hive Существующие обеспечивают последний фронт исследования, оптимизация каждого отдельного запроса изосуществует логический и физический план исследования. Эти оптимизации работают, чтобы завершить работу нижнего слоя. В зависимости от стоимости запроса изучить дальнейшую изоптимизацию, от и потенциальное существованиеиз принимаются различные решения: как упорядочить соединения, узнать, какой тип соединений, степень параллелизма, ожидание, ожидание.
Чтобы использовать изоптимизацию на основе затрат (также известную как CBO), запросите следующие параметры:
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;
когда Hive установлен настрогий режим(hive.mapred.mode=strict)
час,Нетпозволятьсуществовать HQL В утверждении фигурирует декартово произведение, что на самом деле означает на самом деле объяснил Hive верно, картезианское произведение поддержки слабее. Потому что я не могу его найти Join key,Hive можно использовать только 1 индивидуальный reducer завершить декартово произведение 。
когда также можно использовать limit изспособ Приходитьуменьшатьопределенныйиндивидуальныйповерхностьженьшеньи join изчисло В зависимости от количества, но верно для необходимости декартовой семантики продукта из потребностей, часто индивидуальных, больших часыиодининдивидуальныймаленькие часыиз Join операции, результат все еще очень велик (так что его невозможно обработать на одной машине), в это время MapJoin Это лучшее решение. MapJoin, как следует из названия, будет существовать Map Конец завершен Join действовать。этотнуждаться Воля Join действоватьизодининдивидуальныйилимногоиндивидуальныйповерхностьполностьючитать入Внутрижить。
PS:MapJoin существующий подзапрос середина может оказаться неизвестным BUG。существоватьбольшие часыималенькие часы Делать декартово произведение, избегать декартова произведения из метода да, Давать Join добавить водининдивидуальный Join ключ, принцип очень простой: Волямаленькие часы Развернуть колонку join key,И Волямаленькие часыизполоскаглазкопироватьчислораз,join key Разные; часы Развернуть колонку join key Для случайного числа.
Суть в том, чтобы существовать в несколько раз больше, чем копировать, и, наконец, в несколько раз существует индивидуальное существование. reduce Приходить Делать,ибольшие часыизчислов соответствии сда Передниймаленькие расширение часов key из выходит случайным образом в пределах диапазона значений, сколько раз копировать Понятно n, насколько велик случайный диапазон по сравнению с этим человеком n, то соответствующий из, больший данные часовизчисло случайным образом делятся на Понятно n делиться. И окончательная обработка, использованная из reduce числоколичествотакжеда и Перекоса не будет данных 。
По умолчанию Карта этаптакой жеодининдивидуальный Key изчислов соответствии свстречаточка发到одининдивидуальный Reduce начальство,когдаодининдивидуальный Key изчисло выдаст Перекос, если данные слишком велики данных。руководить group by действоватьчас Можеткотк Вниздваиндивидуальныйаспектруководитьоптимизация:
1. Частичная агрегация на стороне карты
Факт, что начальство не дает всех возможностей действовать в совокупности, нуждается в существовании. Reduce частьруководить,множество агрегатовдействовать Все Можетк Первыйсуществовать Map конецруководитьчастьполимеризация,Затемсуществовать Reduce Получите окончательный результат 。
## Включить настройки параметров агрегирования на стороне карты
set hive.map.aggr=true;
## Установите порог предварительного агрегирования на стороне карты. Если это значение будет превышено, задание будет разделено. Значение по умолчанию — 100000.
set hive.groupby.mapaggr.checkinterval=100000
2. иметь Перекос данные руководят балансировкой нагрузки
когда HQL Использование оператора group by Когда число времени наклонено, если для этой переменной установлено значение правда, тогда Hive Будет активировать руководить балансировкой нагрузки. Стратегия просто да MapReduce Задача拆точка成дваиндивидуальный:Нет.одининдивидуальный Первый Делатьпредварительная агрегация,второйиндивидуальный Снова Делатьокончательное резюме 。
# сдвигатьсяоптимизация,иметь Перекос данныеиз, когда руководить балансировкой нагрузки (по умолчанию даfalse)
set hive.groupby.skewindata=false;
когда Параметрыустановлен на true При формировании плана запроса есть два отдельных MapReduce Задача 。
1、существовать Нет.одининдивидуальный MapReduce Задачасередина,map Результаты вывода будут случайным образом распределены по reduce середина,Каждыйиндивидуальный reduce Делатьчастьполимеризациядействовать,и выведите результат,такиметь дело сизрезультатдатакой жеиз
group by key
иметь Можетспособныйточка发到Неттакой жеиз reduce середина, от достижения балансировки нагрузки из глазиз; 2、второйиндивидуальный MapReduce Задача, а затем на основе предварительной обработки изчисло по результатамв соответствии с group by key Распространено среди различных лиц reduce средний, максимальный После завершения окончательной полимеризации действуйте.
Map Агрегация конечной части: не все агрегаты необходимы для существования. Reduce Конец завершен,множество агрегатовдействовать Все Можетк Первыйсуществовать Map конецруководитьчастьполимеризация,наконецсуществовать Reduce Чтобы получить окончательный результат, верно должно быть GroupByOptimizer 。
Итак, как использовать group by Способтакой жечасстатистикамногоиндивидуальный Список?
SELECT
t.a,
SUM(t.b),
COUNT(t.c),
COUNT(t.d)
FROM
some_table t
GROUP BY
t.a;
Вот решение:
select t.a, sum(t.b), count(t.c), count(t.d) from (
select a,b,null c,null d from some_table
union all
select a,0 b,c,null d from some_table group by a,c
union all
select a,0 b,null c,d from some_table group by a,d
) t;
order by
может толькодасуществоватьодининдивидуальный reduce процесссерединаруководить,Местокесливерноодининдивидуальный Большие данныенаборруководить order by,встречапривести кодининдивидуальный reduce Процесс середина обрабатывается из числа в зависимости от размера, что приводит к медленному выполнению запроса. 。
1、существоватьфинальныйрезультатначальстворуководитьorder by,Не разбирайтесь. если конечный результат меньше,Можетксуществоватьодининдивидуальный reduceначальстворуководитьсортироватьчас,Что Что?Сразусуществоватьнаконецизрезультатнаборначальстворуководитьorder by。 2. Чтобы получить первые N фрагментов данных после сортировки, вы можете использовать распределение byиsort byсуществоватькаждыйиндивидуальныйreduceначальстворуководить Сортировать после передN полоски, а затем верно каждый набор результатов индивидуального сокращения после слияния существующих индивидуальных сокращенийсередина глобальной сортировки, а затем берут первые N частей, поскольку они участвуют в глобальной сортировке из order byизчисло Самый популярный дарредуциндивидуальныйчисло * N, поэтому эффективность будет значительно улучшена.
существоватьHiveсередина,О числе По сортировке,Содержит четыре грамматики для «Понятно».,Обязательно различайте эти четыре метода сортировки и применимые сценарии.
1、
order by
:глобальная сортировка,дефектдаможно использовать толькоодининдивидуальныйreduce 2、sort by
:Сортировка на одной машине,одининдивидуальныйreduceрезультатиметьпоследовательность 3、cluster by
:вернотакой жеодин字段точкаведроисортировать,Нетспособныйиsort используется вместе с 4、distribute by
+sort by
:точкаведро,Убедитесь, что одно и то же значение поля сохраняется в файле результатов только при середина.,объединитьsort гарантированно каждый индивидуальныйreduceРезультаты задачи по порядку
Hive HQL серединаиз order by с другими SQL Диалект серединаиз имеет ту же функцию, только результаты да Воля сортируются глобально по определенному полю, что приведет к тому, что все map Конец года вошел в индивидуальный reducer середина, существующее число может занять много времени, если объем данных велик. 。
еслиделатьиспользовать sort by, то да запустит несколько отдельных в зависимости от ситуации. reducer руководить сортировкой и гарантией каждого отдельного человека reducer Внутренне заказан. чтобы контролировать map Данные терминала присваиваются reducer из ключ, часто при сотрудничестве distribute by используются вместе. если Нет дополнения distribute by
изэ, карта Данные терминала будут случайным образом назначены reducer。
Предоставьте способ достижения глобальной сортировки: два способа:
1. Создайте таблицу и подготовьте данные для импорта.
CREATE TABLE if NOT EXISTS student(
id INT,
name string,
sex string,
age INT,
department string
) ROW format delimited fields terminated BY ",";
load data LOCAL inpath "/home/bigdata/students.txt" INTO TABLE student;
2. Первый способ
-- Использовать заказ напрямую от Делать. если результатовчисло Объем данных очень велик, поэтому эффективность будет очень низкой;
SELECT
id,
name,
age
FROM
student
ORDER BY
age desc
LIMIT
3;
3. Второй способ
-- Используйте распространение by + sort by Несколько индивидуальных задач ReduceTask, каждая индивидуальная задача Редуце Таск заказывается отдельно.
SET mapreduce.job.reduces = 3;
DROP TABLE student_orderby_result;
-- Группировка диапазонов 0 < 18 < 1 < 20 < 2
CREATE TABLE student_orderby_result AS
SELECT
*
FROM
student distribute BY (
CASE
WHEN age > 20 THEN 0
WHEN age < 18 THEN 2
ELSE 1
END
) sort BY (age desc);
Что касается определения порогового значения, используйте метод выборки для оценки закона распределения. 。
Когда вы хотите подсчитать дубликаты в определенном столбце, объем данных очень большой, count(distinct) будет очень медленным, причина та же, что и order by Похожие, считать (различные) Логики будет очень мало reducer справиться. Доступно в настоящее время group by Чтобы переписать:
-- Первый group by Снова count
SELECT
COUNT(1)
FROM
(
SELECT
age
FROM
student
WHERE
department >= "MA"
GROUP BY
age
) t;
Снова Приходитьодининдивидуальныйпример:
До оптимизации ,одининдивидуальныйобычноиз ТолькоделатьиспользоватьодининдивидуальныйreduceTaskПриходитьруководитьcount(distinct) действовать
-- До оптимизации(толькоодининдивидуальныйreduce,Первый Удалить дубликаты Сноваcountгруз Сравнивать较большой):
SELECT
COUNT(DISTINCT id)
FROM
tablename;
После оптимизации , но если так написать, начнутся два индивидуальныхMR работа (простая distinct Будет запущен только один человек, поэтому убедитесь, что объем данных достаточно велик для запуска. job из overhead Этот метод рассматривается только в том случае, если оно намного меньше времени расчета. когдачисло Набор данных малили key Если тильт очевиден, сгруппируйтесь by Это может быть даже лучше, чем distinct медленный.
-- После оптимизация(Запускаем два индивидуальных задания, одно индивидуальное задание отвечает за подзапрос( Индивидуальных сокращений может быть много), а за count(1) отвечает другая индивидуальная работа):
SELECT
COUNT(1)
FROM
(
SELECT
DISTINCT id
FROM
tablename
) tmp;
SELECT
COUNT(1)
FROM
(
SELECT
id
FROM
tablename
GROUP BY
id
) tmp;
/ / Рекомендуется использовать это
существоватьHiveизболее ранняя версиясередина,in/exists
грамматикада Нетодеялоподдерживатьиз,нодаот hive-0.8x
После к начинается грамматика владения. Но да не рекомендует использовать этот индивидуальный синтаксис. Хоть и проверял, Hive-2.3.6 такжеподдерживать in/exists действовать, но также рекомендуется использовать Hive изодининдивидуальный Эффективная заменаплан:left semi join
Например:
-- in / exists выполнить
SELECT
a.id,
a.name
FROM
a
WHERE
a.id IN (
SELECT
b.id
FROM
b
);
SELECT
a.id,
a.name
FROM
a
WHERE
EXISTS (
SELECT
id
FROM
b
WHERE
a.id = b.id
);
Вы можете использовать joinЧтобы переписать:
SELECT
a.id,
a.namr
FROM
a
JOIN b ON a.id = b.id;
следует преобразовать в:
-- left semi join выполнить
SELECT
a.id,
a.name
FROM
a LEFT semi
JOIN b ON a.id = b.id;
существоватьвычислитьпохожий scan, filter, aggregation из времени, vectorization технологиякнастраиватьпартияиметь дело сизувеличиватьколичестворазмердля 1024 Одна строка может обеспечить более высокую эффективность, чем одна запись.
set hive.vectorized.execution.enabled=true ; set hive.vectorized.execution.reduce.enabled=true;
Если вы столкнулись с кучей SQL, а шаблоны этой группы SQL остались прежними. Оба даот одного и того же индивидуального стола руководить сканированием, Делать разные из логики. Возможных мест: имеется n SQL, и эта таблица будет сканироваться каждый раз. 。
еслиодининдивидуальный HQL Нижний хочетосуществлять 10 индивидуальный Job, то его можно оптимизировать в 8 индивидуальный В общем, его однозначно можно улучшить. Можно несколько прошивок. Индивидуальность – это очень практичное умение. Прочитайте один раз и вставьте несколько раз. В некоторых сценариях после чтения данных из таблицы их необходимо использовать несколько раз. В этом случае его можно использовать. multi insert
грамматика:
FROM
sale_detail INSERT overwrite TABLE sale_detail_multi PARTITION (sale_date = '2019', region = 'china')
SELECT
shop_name,
customer_id,
total_price
WHERE
.....insert overwrite TABLE sale_detail_multi PARTITION (sale_date = '2020', region = 'china')
SELECT
shop_name,
customer_id,
total_price
WHERE
.....;
Нужна изда,multi insert
Синтаксис имеет некоторые ограничения
1. В обычных обстоятельствах,Один индивидуальный SQLсередина может записывать до 128 выходов.,Более 128 маршрутов,Тогда сообщитеграмматикаошибка。 2、существоватьодининдивидуальныйmulti insertсередина:верно ВТаблица разделов, один и тот же отдельный целевой раздел не может появляться несколько раз. верю Вэй Таблица разделов, эта таблица не может появляться более одного раза. 3. верно по той же таблице разделовиз Разные разделы не могут иметь вставки одновременно overwriteиinsert inдействовать, иначе будет возвращена ошибка
Multi-Group by
да Hive индивидуальный, очень хороший по характеристикам, это делает Hive Становится очень удобно использовать промежуточные результаты. Например:
FROM
(
SELECT
a.status,
b.school,
b.gender
FROM
status_updates a
JOIN profiles b ON (
a.userid = b.userid
AND a.ds = '2019-03-20'
)
) subq1 INSERT OVERWRITE TABLE gender_summary PARTITION(ds = '2019-03-20')
SELECT
subq1.gender,
COUNT(1)
GROUP BY
subq1.gender INSERT OVERWRITE TABLE school_summary PARTITION(ds = '2019-03-20')
SELECT
subq1.school,
COUNT(1)
GROUP BY
subq1.school;
начальствоописывать Запрос Использование оператора Понятно Multi-Group by
Характеристики непрерывные group by Понятно 2 Данные второго числа, используйте разные Multi-Group by
。этотодинхарактеристика Можеткуменьшатьодин Второсортный MapReduce действовать。
сжатие вывода карты
set mapreduce.map.output.compress=true; set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
серединамеждучислов соответствии ссжатие
серединамеждучислов соответствии ссжатие Сразудаверно hive Запросизмногоиндивидуальный Job Между изчисло согласно руководить сжатием. Лучше всего выбрать метод сжатия, чтобы сэкономить время процессора. Доступный snappy сжатиеалгоритм,Долженалгоритмизсжатиеи Эффективность декомпрессии Всеочень высокий。
set hive.exec.compress.intermediate=true; set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; set hive.intermediate.compression.type=BLOCK;
результатчислов соответствии ссжатие
финальныйизрезультатчислов соответствии с(Reducerвыходчислов соответствии с)такжеда Можеткруководитьсжатиеиз,Можетквыбиратьодининдивидуальныйсжатие Эффект лучшеиз,Можеткуменьшатьчислов соответствии сизразмеричислов соответствии сиздискчитать Писатьвремя 。
нуждаться注意:Обычно используется gzip,snappy сжатиеалгоритмда Нетподдерживатьи ХОРОШОиметь дело сиз,есличислов соответствии систочникда gzip/snappy сжимает большие файлы, поэтому индивидуальными остаются только те, которые есть. mapper Чтобы обработать этот отдельный файл, потребуется серьезно оценить эффективность запроса. Все результаты кесли числово могут быть использованы в качестве источников для других запросов, если это необходимо. Вы можете выбрать поддержку. splitable из LZO алгоритм, который может не только сжимать полученный файл, но и обрабатывать его параллельно, так что его можно значительно улучшить. job осуществлятьизскорость Понятно。
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;
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
Hive изумительный SQL Заявление необходимо преобразовать в MapReduce издействовать,определенныйнекоторый SQL оператор не нужно преобразовывать в MapReduce действовать, но студентам следует отметить, что с точки зрения теории начализма, все из SQL Высказывания необходимо преобразовать в MapReduce действовать,Только Нет Проходить Hive существоватьизменять Изменять SQL Приговор изв процессевстреча Делатьчастьоптимизация,делатьопределенныйнекоторый简одиниздействовать Нет Сновануждатьсяизменять Изменять成 MapReduce, например:
1、 только если select * время 2、where Условия фильтра при фильтрации по верному полю раздела руководить 3. С limit При операторе ветвления
Hive от HDFS Есть два способа чтения числовых данных: дать возможностьMapReduceчитать Выбирать и Возьмите напрямую 。
Возьмите направляясло под Сравнивать MapReduce Способ чтения числовых данных быстрее и больше, но можно использовать только меньшее числодействовать. напрямую Способ 。
кпроходить hive.fetch.task.conversion
Обратитесь к числу, чтобы настроить существование, когда использовать Возьмите напрямую Способ:
минимальный: только select * 、существовать Поле разделаначальство where фильтровать, иметь limit Только в этих трёх сценариях можно давать возможность Возьмите напрямую Способ。 more:существовать select、where фильтр,лимит час,Вседавать возможность Возьмите напрямую Способ 。
Проверять Hive из Стратегия сканирования:
> ## Проверять
> set hive.fetch.task.conversion;
Установите стратегию сканирования Hiveиз:
## По умолчанию больше
set hive.fetch.task.conversion=more;
Если у вас есть какие-либо сомнения, пожалуйста, посмотрите hive-default.
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, mi nimal, more].
Some select queri es can be converted to single FETCH task minimizing latency.
Currently the query should be si ngle sourced not havi ng any subquery and should not have
any aggregations or di sti ncts (whi ch i ncurs RS), lateral vi ews and
joi ns.
0. none : di sable hive.fetch.task.conversion
1.minimal : select star, filter on partition columns, limit only
2.more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and vi rtual
columns)
</descri ption>
</property>
<property>
<name>hive.fetch.task.conversion.threshold</name>
<value>1073741824</value>
<descri pti on>
input threshold for applying hive.fetch.task.conversion, if target table is native, input 1ength
is calculated by summation of file 1engths. if it's not native, storage handler for the table
can optionally implement
org.apache, hadoop. hive, ql. metadata. inputEstimator iinterface.
</descri ption>
</property>
Hiveсуществоватьнаборгруппаначальство Запросчас,По умолчанию существует начальство кластера, начальство на нескольких машинах работает,Требуется слаженная работа нескольких машин под руководством,этотдобрый Способхорошо решено Понятно Большие данныеколичествоиз Запросвопрос。нодасуществоватьHiveЗапросиметь дело сизклапанколичество Сравнивать较Маленькийиз времени,Что Действительно нетиметь Необходимо включитьдвигатьсяточка布 Традиционный режим исчез, поскольку распределенный режим предназначен для межсетевой передачи, координации нескольких узлов и потребления ресурсов. вернов маленькомчисло Согласно набор,кпроходитьлокальный режим,существование Единая машина-начальство решает все задачи.,время изучения явно сокращается.
Запуск локального режима включает в себя три шага:
##Откройте улей, чтобы автоматически определить, активировать ли переключатель локального режима
set hive.exec.mode.local.auto=true;
## карта Задача максимального значения в дневное время,*давать Возможность локального режима из задачи max gaoчисло
set hive.exec.mode.1ocal.auto.input.files.max=4;
## mapвходитьдокументмаксимумразмер,Нетначинатьдвигатьсялокальный режимизмаксимумвходитьдокументразмер
set hive.exec.mode.1ocal.auto.inputbytes.max=134217728;
Оператор Hive в конечном итоге будет преобразован в серию изMapReduceЗадача, а каждая индивидуальнаяMapReduceЗадача состоит из серии изMapTask. иReduceTask состоит из из, По умолчанию КартаReduceсерединаодининдивидуальныйMapTaskилиReduceTaskСразувстречаначинатьдвигатьсяодининдивидуальный Процесс JVM, после завершения одной индивидуальной задачи, процесс JVM завершится. Таким образом, это занимает очень короткое время и требует нескольких запусков. JVMиз Состояние Вниз,Время запуска JVM станет относительно большим потреблением.,В это время,кпроходитьповторное использование JVM для решения 。
set mapred.job.reuse.jvm.num.tasks=5;
У JVM тоже есть недостатки, включайте JVM повторно использование будет занято до тех пор, пока не будет использован слот иззадачиз, поэтому руководитьповторное использование, пока Задача не будет завершена будет выпущен.еслиопределенныйиндивидуальный Нетбалансизjobсерединаиметь Несколькоиндивидуальныйreduce задачаосуществлятьиз занимает больше времени, чем другое изредучение задача отнимает время Если слов намного больше, то зарезервированный слот останется свободным, но не может быть использован другими заданиями, пока все задания не будут выполнены. будет выпущен.
По опыту, вообще говоря, можно использовать индивидуальный процессор. ядро запускает JVM, если на сервере 16 процессоров core,нодаэтотиндивидуальный Узел, может начаться 32индивидуальный mapTask ,Вполне возможно рассмотреть: запустить JVM,осуществлятьдваиндивидуальныйTask 。
Если есть оператор запроса, Hive преобразует его в один или несколько этапов, в том числе: этап MapReduce, этап выборки, этап слияния и т. д. Ограничить этап ожидания. По умолчанию одновременно происходит только одна фаза изучения индивидуального. Но да, если некоторые этапы не являются взаимозависимыми, можно изучать параллельно. Многоэтапный параллелизм потребляет больше системных ресурсов. 。
одининдивидуальный Hive Операторы SQL могут быть преобразованы в несколько отдельныхMapReduce. Job,Каждыйодининдивидуальный job Сразудаодининдивидуальный stage, этотнекоторыйJobзаказосуществлять,этотиндивидуальныйсуществовать client из журнала запуска середина также можно увидеть. Но иногда эти задачи не являются взаимозависимыми друг от друга, и если ресурсы кластера это позволяют, то несколько дуальных задач не являются взаимозависимыми. stage Параллелизм изучать, тем самым экономя Понятное время и увеличивая Понятноосуществлять скорость, но да такое Если ресурсов кластера недостаточно, дайте Возможность Распараллеливания приведет к получению различных индивидуальных Job Взаимная конкуренция за ресурсы приводит к общей деградации производительности. давать возможность Распараллеливание:
##Можно включить параллелизм для изучения.
set hive.exec.parallei=true;
##Тот же индивидуальныйsql допускает максимальный параллелизм, значение по умолчанию — 8.
set hive.exec.paral1 el.thread.number=16;
существуют В среде распределенного кластера из-за ошибок программы (в том числе из-за ошибок самого Hadoop) нагрузка несбалансирована и ресурсы распределяются неравномерно. Эти причины приведут к несогласованной скорости выполнения одного и того же задания и некоторых задач. дачаиз может выполняться значительно медленнее, чем другие задачи (например, одно индивидуальное задание из одного индивидуального Задач). дача прогресса всего 50%, а все остальные задачи были выполнены), эти задачи будут замедлять общий ход выполнения задания изосуществлять. Чтобы избежать этой ситуации, Hadoop использует спекулятивный метод. Execution)механизм,Это подразумевает «сдерживание» из Задачи на основе определенных законов.,И для такого из Задания запустите индивидуальное резервное копирование.,Пусть Задача и исходная Задача одновременно обрабатывают одни и те же числовые данные.,ифинальный选использовать最Первый Удачи ХОРОШОЗаканчивать Задачаизвычислитьрезультатделатьдляфинальныйрезультат 。
# Начать фазу картографии, изучив механизм изучения.
set mapreduce.map.speculative=true;
# Запустите фазу редуктора, изучив механизм изучения.
set mapreduce.reduce.speculative=true;
Настройки позволяют спекулировать, изучить исло: Hadoop из mapred-site.xml документсерединаруководить Конфигурация:
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
<description>lf true, then multiple i nstances of some map tasks may be executed i n parallel.</description>
</property>
<property>
<name>mapreduce.reduce.speculati ve</name>
<value>true</value>
<descri pti on>lf true, then multi ple i nstances of some reduce tasks may be executed in parallel.
</description>
</property>
Сам Hive также предоставляет понятные элементы конфигурации для управления выводом на стороне уменьшения.
<property>
<name>hive.mapped.reduce.tasks.speculative.executi on</name>
<value>true</value>
<description>whether speculative execution for reducers should be turned on. </description>
</property>
предположение:
Пользователи очень чувствительны к отклонениям во время выполнения.,Затем эти функции можно отключить. если пользователю требуется длительное время изMapTaskилиReduceTaskиз из-за большого количества входных чиселосуществлять,Затем начните спекуляцию: изучите причины очень огромных отходов.
Так называемый строгий режим означает, что пользователям не разрешается рисковать. HiveQL Заявление, как только изучить, напрямую не удастся. Но даHiveсередина повышает эффективность операторов SQL для Понятно, и вы можете установить строгий режим, чтобы в полной мере использовать его. Hive изумительный Функции 。
## Установите строгий режим Hiveиз
set hive.mapred.mode=strict;
set hive.exec.dynamic.partition.mode=nostrict;
Примечание. После установки строгого режима будут действовать следующие ограничения:
1、верно ВТаблица разделов, где обязательно должно быть добавлено поле раздела из условной фильтрации
select * from student_ptn where age > 25
2、order Оператор by должен содержать ограничения вывода.
select * from student order by age limit 100;
3. Ограничение изучать декартово произведение из запроса
select a.*, b.* from a, b;
4. В режиме динамического секционирования, если используется строгий режим, необходимо использовать статический столбец секционирования.
Сетевое начальство о том, как найти и решить проблему Перекоса Существует множество руководств по датаиз, но большинство из них затрагивают лишь поверхностный уровень. 。этотвнутринас直接引использовать Понятно《Практика настройки производительности Hive》середина Перекос Часть содержания данныхиз позволяет каждому систематически изучать и осваивать его досконально. 。
Перекос данных,То есть объем данных, обрабатываемых одним узлом Задача, намного больше, чем объем данных, обрабатываемых Задача того же типа.,Это приводит к тому, что узел становится узким местом для всей работы.,Эта распределенная система не может избежать проблем.отприрода Приходитьобъяснять,привести к Перекос Есть две причины для данных: одна заключается в том, что да Задача читает большие файлы, а другая заключается в том, что да Задача должна обрабатывать большое количество одних и тех же ключевых данных. 。
Задача: чтение больших файлов,наиболее распространенныйиз Сразудачитать Выбиратьсжатиеиз Нетделимыйизбольшойдокумент。Задачануждатьсяиметь дело сбольшойколичествотакой жеключизчислов соответствии с,Данная ситуация имеет следующие 4 проявления:
когда объем изчисло данных кластера вырос до определенного масштаба,Некоторый архив чисел или дампы по мере необходимости,В это времяпогода частовстречаверночислов соответствии сруководитьсжатие;когдавернодокументделатьиспользоватьGZIP
сжатиеждать Нетподдерживатьдокументразделениедействоватьизсжатие Способ,существоватьденьназадиметьделать业涉ичитать Выбиратьсжатиеназадиздокументчас,Долженсжатиедокумент Тольковстречаодеялоодининдивидуальный Задача Месточитать Выбирать。если Долженсжатиедокументочень большой,ноиметь дело с ДолжендокументизMapнужно потратитьизвремявстреча Это занимает гораздо больше времени, чем чтение обычной карты файла, и карта станет узким местом при выполнении задания. В этом случае даMap читает файл из Перекос данных。Напримержитьсуществоватьтакодиноткрытьповерхностьt_des_info
。
Таблица t_des_info состоит из 3 отдельных GZIP-файлов, сжатых из файлов. 。
Чтосередина,large_file.gz
документо200MB,существуют время работы вычислительной машины,предварительно Первыйнастраивать Каждый индивидуальныйMapиметь дело сизчислов соответствии сколичестводля128MB,нодавычислить引擎无法резатьточкаlarge_file.gz
документ,Место к Файл не будет прочитан Давать две индивидуальные задачи Карты, а да имеет и только один индивидуальный Задачасуществоватьдействовать 。
Таблица t_des_info содержит 3индивидуальные файлы gz. Любой, кто участвует в обработке таблицы, будет использовать только 3индивидуальные файлы. Map。
Чтобы избежать перекоса чтения данных чисел, вызванного неразделяемыми большими файлами, существует сжатие данных чисел. ждать Можеткиспользоватьbzip2
иZip
ждатьподдерживатьдокументразделениеизсжатиеалгоритм。
В реальных бизнес-операциях в операциях вычислений задействовано большое количество значений NULL и некоторые бессмысленные данные. середина, эти числовые данные могут поступать из бизнеса, а не из-за того, что число в соответствии со стандартом Воля, какой-то тип данных числа нормализован в нулевое значение или форму ожидания пустой строки. Эти несвязанные данные вводятся для того, чтобы при объединении таблиц происходила групповая агрегация. данные. верноиз-за таких проблемиз Перекос данных,существоватьвычислить Проходить Ченг середина может исключить такие «аномальные» данные 。
существоватьмного维полимеризациявычислитьчасжитьсуществоватьтакизсцена:select a,b,c,count(1)from T group by a,b,c with rollup
。верно ВначальствоописыватьизSQL,Можно разобрать на 4 типа из клавиш руководить группировкой и агрегацией.,Они разныеда(a,b,c)
、(a,b,null)
、(a,null,null)
и(null,null,null)
。
Таблица ifT изчисло содержит большой объем данных, и агрегация на стороне карты не может эффективно сжимать данные. В этом случае это приведет к быстрому расширению выходных данных на стороне карты. Эта ситуация может легко привести к переполнению памяти задания. Что-то не так. если таблица T содержит Перекос ключ данных, который активизирует процесс Shuffleиз Перекос данных 。
верностьначальства В приведенной выше ситуации мы, естественно, подумаем о том, чтобы разобрать поверхность начальства из оператора SQL и Volyarollup на следующие несколько отдельных группировок общего типа из комбинаций.
select a, b, c, count(1) from T group by a, b, c;
select a, b, null, count(1) from T group by a, b;
select a, null, null, count(1) from T group by a;
select null, null, null, count(1) from T;
Это очень неуклюжий метод. Сгруппированных столбцов агрегации гораздо больше, чем 3 столбца, поэтому их нужно разбирать. SQLзаявлениевстреча Дажемного。существоватьHiveсерединакпроходитьженьшеньчисло (hive.new.job.grouping.set.cardinality)
Конфигурацияиз Способсдвигатьсяконтрольделать业издемонтировать,Должен женьшеньчислопо умолчаниюценитьда30。Долженженьшеньчислоповерхностьиндикаторная стрелкаверноgrouping sets/rollups/cubes
этотдобрыймного维полимеризацияиз срабатывания, если последняя разборка комбинации клавиш (пример начального лица из комбинации да4) превышает это значение, будет предоставлено Новая возможность из Задачи обрабатывать комбинации, превышающие это значение. еслисуществовать При обработке числовых данных определенная индивидуальная группировка агрегации из столбца Если наклон большой, вы можете соответствующим образом отрегулировать значение. 。
существоватьодиннекоторыйдействоватьсерединанельзя разрезатьсерединамеждурезультат,Напримерделатьиспользоватьcollect_list
полимеризацияписьмочисло,житьсуществоватьследующееSQL:
SELECT
s_age,
collect_list(s_score) list_score
FROM
student_tb_txt
GROUP BY
s_age
существоватьstudent_tb_txt
поверхностьсередина,s_ageиметь Перекос данных, но если число настолько велико, что наверняка изчисло Эта сумма приведет к тому, что обработка наклона изReduceЗадача сгенерирует переполнение памяти из-за исключения. Для этого сценария это делатьвключатьhive.groupby.skewindata
Параметры Конфигурация не сыграет роли в работе по оптимизации, но затянет всю индивидуальную работу.
давать возможность Должен Параметры Конфигурация вакансии Воля будет разделена на две индивидуальные работы, первая индивидуальная работа будет как Воля Map изчислов соответствии с平均точка配到Reduceэтап,исуществоватьэтотиндивидуальныйэтапвыполнитьчислов соответствии сиз Преполимеризация,куменьшать Второе индивидуальное задание по обработке изчисло данных Второе индивидуальное задание сущес; твовать первую индивидуальную обработку заданий из числа на основе начальства приводить результаты агрегирования.
hive.groupby.skewindata
изосновная рольсуществовать Вгенерироватьиз Нет.одининдивидуальныйделать业способный够иметьэффектуменьшатьчислоколичество。нодаверно Вcollect_list
этотдобрый要求全количестводействоватьвсечислов соответствии сизсерединамеждурезультатизписьмочисло Приходитьобъяснять,Очевидно, не работает,Вместо этого нагрузка на сетевой ввод-вывод увеличивается из-за введения новых операций. Увеличить Понятнодиски,В результате производительность становится еще ниже.
решить такую проблему,самый прямойиз Способ Сразуда КорректированиеReduceМестоосуществлятьиз Внутрижитьразмер,делатьиспользовать mapreduce.reduce.memory.mb
этотиндивидуальныйженьшеньчисло(еслидаMapЗадача Внутрижитьузкое место Можетк Корректирование mapreduce.map.memory.mb
)。новозвращатьсяжитьсуществоватьодининдивидуальныйвопрос,если подключение HiveизClient изHIveServer2 необходимо единоразово вернуть обработку, то число данных очень велико,Понятное начало настройки HiveServer2 из кучи Java (Xmx),Это также приведет к переполнению служебной памяти HiveServer2.
дваповерхностьруководитьобычноизrepartition Если при присоединении соединение таблицы из хранилища ключей существует перекошено, то существует Фаза перемешивания неизбежно приведет к Перекосу. данных 。
В этом случае Hiveиз обычно ничего другого сделать не может. Возможность двух индивидуальных работ, первая обработка индивидуальной работы без наклона изчисло по данным, вторая индивидуальное задание Воля наклона изчисло данных хранятся в распределенном кэше середина и распределяются между каждым индивидуальным Карта Задача существования узла. Фаза существованияMap завершена joinдействовать, то есть MapJoin, который позволяет избежать Понятное Shuffle,отиизбегать Понятно Перекос данных。
[1]
Китайский толстяк «Полное руководство по настройке улья»
[2]
Линь Чжихуан «Практика настройки производительности Hive»