Эпическая настройка производительности Hive на 30 000 слов (рекомендуемый сборник)
Эпическая настройка производительности Hive на 30 000 слов (рекомендуемый сборник)

Предисловие

Hive Поскольку компонент хранилища данных широко используется в области больших данных, особое внимание следует уделять эффективности при проектировании и выполнении запросов. 。Влияние Hive Эффективность почти от не дачисло по сумме слишком велика, и да Перекос данные, число Избыточность данных, слишком много заданий или операций ввода-вывода, MapReduce Необоснованное распределение и так далее. В улей Тюнинг включает в себя оба Hive Что касается конструкции стола, HiveHQL Оптимизация самой постановки также включает в себя Hive Параметры конфигурации и базовый двигатель MapReduce корректировки 。

В этой статье я предлагаю вам сосредоточиться в основном на следующих четырех аспектах.

Структура каталогов

Чтобы не учиться вслепую, нам нужно сначала знать Hive настраиватьотличныйизважность:существуют при условии, что результаты деятельности останутся неизменными.,Уменьшите использование ресурсов,уменьшать Задачаизосуществлятьвремя

Инструкция по настройке

Прежде чем начать, вам необходимо иметь общее представление о следующих «Заметках».

  1. верно Для вычислительных машин с большими объемами данных: число. С большими объемами данных проблем нет, Перекос. данныхдаиндивидуальныйвопрос。
  2. Hiveиз сложного нижнего слоя HQL будет преобразован в несколько отдельных MapReduce. Задания бывают параллельными и последовательными, и их много. Эффективность работы заданий относительно низкая. Например, даже если в таблицах данных всего несколько сотен строк, они связываются и суммируются несколько раз, в результате чего получается более одного. дюжину рабочих мест, что занимает много времени. Причина да MapReduce Время инициализации задания относительно велико. 。
  3. существоватьруководитьHiveБольшие данные При анализе,Общие операции агрегирования, такие как сумма,count,max,min,UDAFждать ,Не боюсь Перекос данныхвопрос,MapReduce существовать Этап Маппе из Преполимеризациядействовать,делать Перекос данные не проблема 。
  4. Хороший дизайн таблиц и моделей позволит получить вдвое больший результат, прилагая вдвое меньше усилий.
  5. Разумная установка MapReduce из Task Параллелизм может эффективно повысить производительность. (Например, 10w+число объёма данных Уровень из рассчитывается с помощью 100 индивидуальный уменьшитьTask, что дафаза, когдаиз расточительно, достаточно 1индивидуального, но даеслида При объеме данных миллиардного уровня 1 индивидуальная задача кажется слишком растянутой)
  6. Понятное решениечисло Согласно раздаче, уже решил Перекос данный вопрос — индивидуальный товар по выбору. Это общий алгоритм оптимизации, но иногда его невозможно адаптировать к конкретным бизнес-контекстам. , разработчики Понятно понимают бизнес, Понятно понимают число согласно, кпроходить бизнес-логику можно решить точно и эффективно Перекос данныхвопрос。
  7. число Когда объем данных велик из,Используйте count(distinct) с осторожностью,group by Он склонен к проблемам с наклоном.
  8. верномаленькие файлыруководить слиянием,да Проверенный метод повышения эффективности планирования.,Если все задания настроены правильно и файлы верны,верно Задачаиз Общая эффективность планирования также приведет к положительному результату теста.
  9. оптимизация охватить все,Оптимальный вариант отдельного задания не так хорош, как общий оптимум.

Детали настройки

Ладно, давайте официально поговорим о деталях процесса тюнинга.

Уровень проектирования здания стола улья

HiveizTable создание и настройка уровня дизайна,В основном говорят оизКак разумно организовать информацию,Удобен для последующих и эффективных расчетов. Например, создайте тип таблицы,Хранение файлов Формат,Сжимать лиждатьждать

Используйте оптимизацию таблицы разделов

Давайте сначала рассмотрим, какие бывают настольные типы ульев?

1. Таблица разделов 2. Стол-ковш

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

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

Например:

Язык кода:javascript
копировать
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 осознать 。

Далее попробуйте следующее:

1. Создайте таблицу с разделами:
Язык кода:javascript
копировать
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
;
2. Загрузите содержимое и укажите флаг раздела:
Язык кода:javascript
копировать
load data local inpath '/home/bigdata/pv_2018-07-08_us.txt' into table page_view partition(date='2018-07-08', country='US');
3. Запросить содержимое раздела указанной метки:
Язык кода:javascript
копировать
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 сегмента.

Язык кода:javascript
копировать
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:

Язык кода:javascript
копировать
SELECT *
FROM
       page_view TABLESAMPLE(BUCKET 3 OUT OF 32)
;

Как показано в следующем примере, отбирается половина данных в третьем сегменте из 32 сегментов в page_view:

Язык кода:javascript
копировать
SELECT *
FROM
       page_view TABLESAMPLE(BUCKET 3 OUT OF 64)
;

Давайте суммируем три распространенных метода выборки:

Язык кода:javascript
копировать
Выборка ведра: 
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 середина использует несколько знакомых форматов файлов, таких как TextFileSequenceFileRCFileAvroORCParquetFile ждать 。

Формат хранения обычно необходимо выбирать в соответствии с направлением бизнеса.,существоватьнасиз Практическая работасередина,Большинствочисло Все таблицы используютTextFileиParquetдвадобрыйхранилище Формат Изодин。TextFileда Самый простойизхранилище Формат,Это обычная текстовая запись,Также даHiveиз формата по умолчанию. Хотя это относительно дорого,Эффективность запросов также низкая,но это большеиздаделатьдлятрамплин Приходитьделатьиспользовать。RCFileORCParquetждать Форматиз Таблицы нельзя импортировать напрямую из файлов.числов соответствии с,должно бытьTextFileПриходить Делатьсерединаизменять。ParquetиORCВседа Apache подиз Открытый исходный код Список Режимхранилище Формат。Хранилище столбцов больше подходит для пакетных запросов OLAP, чем традиционное хранилище строк.,а такжеподдерживатьлучшеизсжатиеикодирование

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

1、TextFile
  1. Способ хранения: хранение строк. Формат по умолчанию,Если вы не укажете этот формат при создании таблицы, по умолчанию будет использоваться этот формат.
  2. В каждой строке есть запись,Каждая строка заканчивается символом новой строки «\n». число согласно не делать при сжатии,диск будет стоить дороже,числов соответствии с Накладные расходы на анализтакже относительно большой.
  3. Можно комбинироватьGzipBzip2ждатьсжатие Способодинростделатьиспользовать(Система будетсдинамический контроль,При запросесдинамическая декомпрессия), Рекомендуется использовать кратныйизсжатиеалгоритм。
2、Sequence File
  1. Что-то вроде Hadoop API предоставляет из двоичных файлов,делатьиспользовать方便、делимыйсжатиеиз Функции。
  2. поддерживатьтри видасжатиевыбирать:NONERECORDBLOCK。RECORDсжатие Низкая ставка,одинобщий советделатьиспользоватьBLOCKсжатие 。
3、RC File
  1. Метод хранения: число. Данные делятся на блоки по строкам, и каждый блок соответствии Колонное хранилище . А. Во-первых, данные Волячисло разделены на строки, чтобы обеспечить одинаковый индивидуальный подход. record существоватьодининдивидуальныйкусокначальство,Избегайте чтения одной отдельной записи и чтения нескольких отдельных блоков. Б. Во-вторых,Столбчатое хранилище блочных чисел,полезно длячислов соответствии ссжатиеибыстрыйиз Доступ к столбцу。
  2. Условно говоря,RCFileverno имеет незначительное улучшение производительности при повышении производительности Задачаосуществлять.,Но можно сэкономить место для хранения. Можно использовать обновленную версию формата ORC.
4、ORC File
  1. Метод хранения: число. Данные делятся на блоки по строкам, и каждый блок соответствии Колонное хранилище
  2. Hive предоставляет новый формат,Относится к обновленной версии RCFileиз.,Производительность значительно улучшилась,И данные могут быть сжаты и сохранены,Быстрое сжатие,Быстрый доступ к колонке.
  3. ORC File создаст индекс на основе столбца.,когда Запросвремяскоро будет。
5、Parquet File
  1. Способ хранения: хранилище столбцов.
  2. Parquet верно, эффективен для больших типов запросов. верно Запрос определенных столбцов путем сканирования определенной таблицы, Parquet Особенно полезно. Паркет Обычно используются сжатие Snappy и Gzip. Snappy по умолчанию.
  3. Parquet поддерживать Impala Механизм запросов.
  4. Еда файлов ФорматвыхлопколичествоиспользоватьParquetилиORC,Не только уменьшает емкость хранилища,Также оптимизация Понятный запрос,сжатие,Таблица ассоциации ожидания производительности.
Выберите правильный формат сжатия

Hive В конечном итоге выражение преобразуется в MapReduce Программа приходит интересиз, и MapReduce из-за проблем с производительностью и сетевого ввода-вывода и диск IO, чтобы решить проблему с производительностью, самое главное уменьшатьчислов соответствии сколичество,верночислов соответствии сруководитьсжатиедаиндивидуальныйхороший способ。сжатие Хотядауменьшать Понятночислов соответствии сколичество,нодасжатие Этот процесс потребляет ЦП, участвуй Hadoop середина, часто узкое место в производительности не существует CPU,CPU Давление невелико, поэтому сжатие используется полностью, а пространство относительно простаивает. CPU。

Часто используемые методы сжатия вернее, чем

Как выбрать метод сжатия

1. Степень сжатия 2. Скорость сжатия и декомпрессии 3、данетподдерживатьsplit

поддерживатьразделениеиз Файлы могутки ХОРОШОиз Сколькоиндивидуальный mapper Программа обрабатывает большие файлы данных. Большинство файлов не являются делимыми, поскольку эти файлы можно читать только начиная с заголовка.

Сжимать ли

1. Вычислительно интенсивный,Нетсжатие,неттогда впередодиншаг Увеличивать ПонятноCPUизгруз 2. Использование интенсивной сети, рекомендуется сжатие для уменьшения передачи данных по сети.

Каждый отдельный метод сжатия должен быть верным из класса.

Сжатие использует:

Job Выходной файл соответствии с Block к GZip из Способруководитьсжатие:

Язык кода:javascript
копировать
## Значение по умолчаниюда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 руководитьсжатие:

Язык кода:javascript
копировать
## давать возможность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 Вывод результатовисерединамежду Всеруководитьсжатие:

Язык кода:javascript
копировать
## Значение по умолчаниюдаfalse,Нетсжатие 
set hive.exec.compress.output=true 

## Значение по умолчаниюдаfalse,Если это правда, MR устанавливается в состояние «исжатие». давать возможность
set hive.exec.compress.intermediate=true 

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

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

1. Просмотр плана выполнения Hive

Hive из SQL заявлениесуществоватьосуществлять Необходимо раньше Воля SQL Заявление преобразуется в MapReduce Задача, поэтому вам нужно Понятно, чтобы понять специфику процесса конвертации, вы можете ксуществовать SQL Заявление середина введите следующую команду Проверить бетон и зосуществлять план 。

Язык кода:javascript
копировать
## План Проверятьосуществлять, добавьте расширенное ключевое слово, чтобы сделать Проверять более подробным и зосуществлять план 
explain [extended] query
2. Обрезка столбца

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

Hive существоватьчитатьчислов соответствии сиз времени,МожеткЧитайте только столбцы из, необходимые для запроса середина, и игнорируйте другие столбцы из.。так Делать Можетксохранятьчитать Получите накладные расходы:серединамеждуповерхностьхранилищенакладные расходыичислов соответствии с整合накладные расходы。

Язык кода:javascript
копировать
## Обрезка столбца, получение только числового запроса, который середина должен использовать столбец из, значение по умолчанию — даtrue
set hive.optimize.cp = true; 
3. Сброс предикатов

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

Язык кода:javascript
копировать
## По умолчанию даtrue
set hive.optimize.ppd=true;

Пример программы:

Язык кода:javascript
копировать
## оптимизация До
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;
4. Резка перегородок

Обрезка столбцов означает чтение только необходимых столбцов при запросе.,Очистка разделов означает чтение только необходимых разделов. . Когда имеется много столбцов или большой объем данных, если select * или Без указания разделов эффективность полного сканирования столбцов и таблиц будет очень низкой. 。

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

Hive связан с обрезкой разделов:

Язык кода:javascript
копировать
## По умолчанию даtrue
set hive.optimize.pruner=true; 

существовать HiveQL Стадия анализа ColumnPruner логический оптимизатор 。

Язык кода:javascript
копировать
SELECT
    *
FROM
    student
WHERE
    department = "AAAA";
5. Объедините небольшие файлы

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

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

Язык кода:javascript
копировать
## После ввода и объединения файлов на стороне карты, соответствии с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 из файлов результатов для устранения тестирования 。

Язык кода:javascript
копировать
## да Объединять ли выходные файлы карты, Значение по умолчанию — 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, поэтому оно будет объединено в один логический срез.

6. Правильно настройте параллелизм MapTask
Первое: механизм параллелизма MapTask в MapReduce.

Картачислослишком большая:когдавходитьдокумент Очень большой,MapTask Особенно много, каждый вычислительный узел выделен изучаиз MapTask Их много, в это время можно подумать поменьше MapTask расчет , увеличивая каждый MapTask Обработка данных. если MapTask Слишком много, окончательный сгенерированный файл результатов будет слишком большим. 。

причина: 1. Выходной файл этапа «Карта» слишком мал, в результате чего образуется большое количество маленьких файлов. 2. Инициализация и создание Map очень затратны.

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

причина: 1. Параллельная обработка файлов или запросов мала, а время выполнения задания слишком велико. 2. При большом количестве заданий кластер легко заблокировать.

существовать MapReduce из «Кейса программирования середина» мы узнали, что индивидуальный MapReduce Job из MapTask Число делится на ввод InputSplit Решите из. А входной фрагмент да имеет вид FileInputFormat.getSplit() Решатьиз。одининдивидуальный Входные фрагментыверноотвечатьодининдивидуальный MapTask, а входное шардирование определяется тремя параметрами:

Входные фрагментыразмеризвычислитьдаэтот Что?вычислитьвне Приходитьиз:

Язык кода:javascript
копировать
long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))

По умолчанию,Входные фрагментыразмери HDFS Размер блока данных по умолчанию для кластера одинаков, то есть один блок данных используется по умолчанию, а другой включен. MapTask руководитьиметь дело с,так Делатьизвыгодадаизбегать Понятносерверный узелмеждуизчислов соответствии спередача инфекции,улучшать job Эффективность обработки

Две классические элементы управления MapTask изиндивидуальныйчислоплан:уменьшать MapTask число или Увеличивать MapTask число:

1. Уменьшить MapTask числодапроходить Объединение небольших По данным источника 2、Увеличивать MapTask числокпроходитьконтрольначальствоодининдивидуальный job из reduceTask индивидуальныйчисло Важное внимание:Нетрекомендоватьпоставь этоиндивидуальныйценитьруководитьслучайныйнастраивать!рекомендоватьиз Способ:делатьиспользовать По умолчанию изрезатькусокразмер Прямо сейчас Может。если Необходимо настроить,Лучшее да, нарезанное кубиками из N раз числа

Второе: разумно контролировать количество MapTasks.
  1. уменьшать MapTask числокпроходить Объединение небольших файловосознать
  2. Увеличивать MapTask числокпроходитьконтрольначальствоодининдивидуальный ReduceTask По умолчанию из MapTask индивидуальныйчисло

Метод расчета

Общий размер входного файла: total_size HDFS настраиватьизчислов соответствии скусокразмер:dfs_block_size default_mapper_num = total_size / dfs_block_size

MapReduce середина предоставляет Понятное число следующих параметров для управления map Задачаиндивидуальный номер, от буквального начализма, выглядит так, что можно задать напрямую MapTask похоже на индивидуальное числооиз, но, к сожалению, это невозможно, это значение индивидуального параметра только больше, чем существующее default_mapper_num Оно вступит в силу только тогда, когда 。

Язык кода:javascript
копировать
## Значение по умолчанию да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 числоизожидаемого значения, но оно может не вступить в силу 。

7. Правильно настройте параллелизм Редуктор Таск.

если число 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 расчет。такжекпроходить

Язык кода:javascript
копировать
set mapred.map.tasks=10; 
set mapreduce.job.reduces=10;

Часто приходится вручную указывать ReduceTask индивидуальныйчисло。принимая во внимание Mapper Объем данных выходного числа фазы обычно будет значительно больше, чем входное уменьшение, поэтому даже если он не установлен ReduceTask индивидуальныйчисло,перезагрузить Справочное число2 Это также необходимо 。

Основываясь на опыте, вы можете Справочное число2 установлен на M * (0.95 * N) (N — кластер NodeManager индивидуальное число). Вообще говоря, NodeManager и DataNode изиндивидуальныйчислодаодин Образециз。

8. Присоединяйтесь к оптимизации

Общий принцип оптимизации соединения:

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серединаключ, чтобы данные числа были случайным образом и равномерно распределены по разным изредукторам. начальство 。

9. Включите MapJoin

Используйте эту меру оптимизации всякий раз, когда можете! большие часы join маленькие часы маленькие часы Соответствуют потребностям: маленькие Когда часовчисло меньше контрольного условия 。

MapJoin да Воля join Меньшие столы с обеих сторон раздаются непосредственно каждому человеку. map процессиз Внутрижитьсередина,существовать map процесссерединаруководить join действовать,так Сразу Нетиспользоватьруководить reduce шагов, тем самым увеличивая скорость. только join Операция необходима для включения MapJoin 。

Язык кода:javascript
копировать
## да Нет согласно данным маленький часыизразмер,сдвигаться Воля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:

Язык кода:javascript
копировать
-- Режим 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 из переключателя!

Некоторые общие настройки параметров:

Язык кода:javascript
копировать
## когдапользовательосуществлять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;
10、JoinПерекос данныхоптимизация

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

Язык кода:javascript
копировать
# Соединение по ключу, конечно, если число записей превышает это индивидуальное значение, будет управляться разделением, значение устанавливается в соответствии с конкретным объемом данных числа. 
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;

11. Оптимизация CBO

При объединении из, таблица из порядка из отношения: предыдущая из таблиц будет загружена в память середина. Назад из-за стола руководить сканированием диска 。

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;

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

когда 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 числоколичествотакжеда и Перекоса не будет данных 。

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

По умолчанию Карта этаптакой жеодининдивидуальный Key изчислов соответствии свстречаточка发到одининдивидуальный Reduce начальство,когдаодининдивидуальный Key изчисло выдаст Перекос, если данные слишком велики данных。руководить group by действоватьчас Можеткотк Вниздваиндивидуальныйаспектруководитьоптимизация:

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

Факт, что начальство не дает всех возможностей действовать в совокупности, нуждается в существовании. Reduce частьруководить,множество агрегатовдействовать Все Можетк Первыйсуществовать Map конецруководитьчастьполимеризация,Затемсуществовать Reduce Получите окончательный результат 。

Язык кода:javascript
копировать
## Включить настройки параметров агрегирования на стороне карты 
set hive.map.aggr=true; 

## Установите порог предварительного агрегирования на стороне карты. Если это значение будет превышено, задание будет разделено. Значение по умолчанию — 100000. 
set hive.groupby.mapaggr.checkinterval=100000

2. иметь Перекос данные руководят балансировкой нагрузки

когда HQL Использование оператора group by Когда число времени наклонено, если для этой переменной установлено значение правда, тогда Hive Будет активировать руководить балансировкой нагрузки. Стратегия просто да MapReduce Задача拆точка成дваиндивидуальный:Нет.одининдивидуальный Первый Делатьпредварительная агрегация,второйиндивидуальный Снова Делатьокончательное резюме

Язык кода:javascript
копировать
# сдвигатьсяоптимизация,иметь Перекос данныеиз, когда руководить балансировкой нагрузки (по умолчанию да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 Способтакой жечасстатистикамногоиндивидуальный Список?

Язык кода:javascript
копировать
SELECT
    t.a,
    SUM(t.b),
    COUNT(t.c),
    COUNT(t.d)
FROM
    some_table t
GROUP BY
    t.a;

Вот решение:

Язык кода:javascript
копировать
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;
14. Упорядочить по оптимизации

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. Создайте таблицу и подготовьте данные для импорта.

Язык кода:javascript
копировать
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. Первый способ

Язык кода:javascript
копировать
-- Использовать заказ напрямую от Делать. если результатовчисло Объем данных очень велик, поэтому эффективность будет очень низкой;
SELECT
    id,
    name,
    age
FROM
    student
ORDER BY
    age desc
LIMIT
    3;

3. Второй способ

Язык кода:javascript
копировать
-- Используйте распространение 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);

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

15. Подсчитайте различную оптимизацию

Когда вы хотите подсчитать дубликаты в определенном столбце, объем данных очень большой, count(distinct) будет очень медленным, причина та же, что и order by Похожие, считать (различные) Логики будет очень мало reducer справиться. Доступно в настоящее время group by Чтобы переписать:

Язык кода:javascript
копировать
-- Первый group by Снова count
SELECT
    COUNT(1)
FROM
    (
        SELECT
            age
        FROM
            student
        WHERE
            department >= "MA"
        GROUP BY
            age
    ) t;

Снова Приходитьодининдивидуальныйпример:

До оптимизации ,одининдивидуальныйобычноиз ТолькоделатьиспользоватьодининдивидуальныйreduceTaskПриходитьруководитьcount(distinct) действовать

Язык кода:javascript
копировать
-- До оптимизации(толькоодининдивидуальныйreduce,Первый Удалить дубликаты Сноваcountгруз Сравнивать较большой):
SELECT
    COUNT(DISTINCT id)
FROM
    tablename;

После оптимизации , но если так написать, начнутся два индивидуальныхMR работа (простая distinct Будет запущен только один человек, поэтому убедитесь, что объем данных достаточно велик для запуска. job из overhead Этот метод рассматривается только в том случае, если оно намного меньше времени расчета. когдачисло Набор данных малили key Если тильт очевиден, сгруппируйтесь by Это может быть даже лучше, чем distinct медленный.

Язык кода:javascript
копировать
-- После оптимизация(Запускаем два индивидуальных задания, одно индивидуальное задание отвечает за подзапрос( Индивидуальных сокращений может быть много), а за count(1) отвечает другая индивидуальная работа):
SELECT
    COUNT(1)
FROM
    (
        SELECT
            DISTINCT id
        FROM
            tablename
    ) tmp;

SELECT
    COUNT(1)
FROM
    (
        SELECT
            id
        FROM
            tablename
        GROUP BY
            id
    ) tmp;
/ / Рекомендуется использовать это
16. Как написать заявление in/exists

существоватьHiveизболее ранняя версиясередина,in/existsграмматикада Нетодеялоподдерживатьиз,нодаот hive-0.8x После к начинается грамматика владения. Но да не рекомендует использовать этот индивидуальный синтаксис. Хоть и проверял, Hive-2.3.6 такжеподдерживать in/exists действовать, но также рекомендуется использовать Hive изодининдивидуальный Эффективная заменаплан:left semi join

Например:

Язык кода:javascript
копировать
-- 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Чтобы переписать:

Язык кода:javascript
копировать
SELECT
    a.id,
    a.namr
FROM
    a
    JOIN b ON a.id = b.id;

следует преобразовать в:

Язык кода:javascript
копировать
-- left semi join выполнить
SELECT
    a.id,
    a.name
FROM
    a LEFT semi
    JOIN b ON a.id = b.id;
17. Используйте технологию векторизации

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

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

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

Если вы столкнулись с кучей SQL, а шаблоны этой группы SQL остались прежними. Оба даот одного и того же индивидуального стола руководить сканированием, Делать разные из логики. Возможных мест: имеется n SQL, и эта таблица будет сканироваться каждый раз. 。

еслиодининдивидуальный HQL Нижний хочетосуществлять 10 индивидуальный Job, то его можно оптимизировать в 8 индивидуальный В общем, его однозначно можно улучшить. Можно несколько прошивок. Индивидуальность – это очень практичное умение. Прочитайте один раз и вставьте несколько раз. В некоторых сценариях после чтения данных из таблицы их необходимо использовать несколько раз. В этом случае его можно использовать. multi insert грамматика:

Язык кода:javascript
копировать
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 Становится очень удобно использовать промежуточные результаты. Например:

Язык кода:javascript
копировать
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 действовать。

19. Запускаем сжатие промежуточных результатов

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

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наборгруппаподдерживатьизсжатиеалгоритм:

Язык кода:javascript
копировать
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

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

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

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 из Стратегия сканирования:

Язык кода:javascript
копировать
> ## Проверять 
> set hive.fetch.task.conversion;

Установите стратегию сканирования Hiveиз:

Язык кода:javascript
копировать
## По умолчанию больше 
set hive.fetch.task.conversion=more;

Если у вас есть какие-либо сомнения, пожалуйста, посмотрите hive-default.

Язык кода:javascript
копировать
<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>
2. Оптимизация локального выполнения

Hiveсуществоватьнаборгруппаначальство Запросчас,По умолчанию существует начальство кластера, начальство на нескольких машинах работает,Требуется слаженная работа нескольких машин под руководством,этотдобрый Способхорошо решено Понятно Большие данныеколичествоиз Запросвопрос。нодасуществоватьHiveЗапросиметь дело сизклапанколичество Сравнивать较Маленькийиз времени,Что Действительно нетиметь Необходимо включитьдвигатьсяточка布 Традиционный режим исчез, поскольку распределенный режим предназначен для межсетевой передачи, координации нескольких узлов и потребления ресурсов. вернов маленькомчисло Согласно набор,кпроходитьлокальный режим,существование Единая машина-начальство решает все задачи.,время изучения явно сокращается.

Запуск локального режима включает в себя три шага:

Язык кода:javascript
копировать
##Откройте улей, чтобы автоматически определить, активировать ли переключатель локального режима
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;
3. Повторное использование JVM

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

Язык кода:javascript
копировать
set mapred.job.reuse.jvm.num.tasks=5;

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

По опыту, вообще говоря, можно использовать индивидуальный процессор. ядро запускает JVM, если на сервере 16 процессоров core,нодаэтотиндивидуальный Узел, может начаться 32индивидуальный mapTask ,Вполне возможно рассмотреть: запустить JVM,осуществлятьдваиндивидуальныйTask 。

4. Параллельное выполнение

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

одининдивидуальный Hive Операторы SQL могут быть преобразованы в несколько отдельныхMapReduce. Job,Каждыйодининдивидуальный job Сразудаодининдивидуальный stage, этотнекоторыйJobзаказосуществлять,этотиндивидуальныйсуществовать client из журнала запуска середина также можно увидеть. Но иногда эти задачи не являются взаимозависимыми друг от друга, и если ресурсы кластера это позволяют, то несколько дуальных задач не являются взаимозависимыми. stage Параллелизм изучать, тем самым экономя Понятное время и увеличивая Понятноосуществлять скорость, но да такое Если ресурсов кластера недостаточно, дайте Возможность Распараллеливания приведет к получению различных индивидуальных Job Взаимная конкуренция за ресурсы приводит к общей деградации производительности. давать возможность Распараллеливание:

Язык кода:javascript
копировать
##Можно включить параллелизм для изучения.
set hive.exec.parallei=true;

##Тот же индивидуальныйsql допускает максимальный параллелизм, значение по умолчанию — 8.
set hive.exec.paral1 el.thread.number=16;
5. Спекулятивное исполнение

существуют В среде распределенного кластера из-за ошибок программы (в том числе из-за ошибок самого Hadoop) нагрузка несбалансирована и ресурсы распределяются неравномерно. Эти причины приведут к несогласованной скорости выполнения одного и того же задания и некоторых задач. дачаиз может выполняться значительно медленнее, чем другие задачи (например, одно индивидуальное задание из одного индивидуального Задач). дача прогресса всего 50%, а все остальные задачи были выполнены), эти задачи будут замедлять общий ход выполнения задания изосуществлять. Чтобы избежать этой ситуации, Hadoop использует спекулятивный метод. Execution)механизм,Это подразумевает «сдерживание» из Задачи на основе определенных законов.,И для такого из Задания запустите индивидуальное резервное копирование.,Пусть Задача и исходная Задача одновременно обрабатывают одни и те же числовые данные.,ифинальный选использовать最Первый Удачи ХОРОШОЗаканчивать Задачаизвычислитьрезультатделатьдляфинальныйрезультат 。

Язык кода:javascript
копировать
# Начать фазу картографии, изучив механизм изучения. 
set mapreduce.map.speculative=true; 

# Запустите фазу редуктора, изучив механизм изучения. 
set mapreduce.reduce.speculative=true;

Настройки позволяют спекулировать, изучить исло: Hadoop из mapred-site.xml документсерединаруководить Конфигурация:

Язык кода:javascript
копировать
<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 также предоставляет понятные элементы конфигурации для управления выводом на стороне уменьшения.

Язык кода:javascript
копировать
<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из из-за большого количества входных чиселосуществлять,Затем начните спекуляцию: изучите причины очень огромных отходов.

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

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

Язык кода:javascript
копировать
## Установите строгий режим Hiveиз 
set hive.mapred.mode=strict; 
set hive.exec.dynamic.partition.mode=nostrict;

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

Язык кода:javascript
копировать
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 проявления:

  • числоданные содержат много бессмысленных исходных данных,Например, NULL, ожидание пустой строки.
  • Содержит искаженное числовое значение, существующее в данных, руководить Результаты между серединами не могут быть агрегированы во время вычисления агрегирования, и требуется большой объем числовых данных. После этапа обработки в случайном порядке, вызывающего Перекос данных
  • число Согласно существующему при расчете Создать набор данных многомерного числа, что приведет к расширению измерения из-за данных Перекоса
  • Два стола руководить Присоединиться,Оба содержат большое количество одинаковых ключей с искаженными данными.
1. Большие файлы, которые невозможно разделить, приводят к изперекосу данных.

когда объем изчисло данных кластера вырос до определенного масштаба,Некоторый архив чисел или дампы по мере необходимости,В это времяпогода частовстречаверночислов соответствии сруководитьсжатие;когдавернодокументделатьиспользовать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ждатьподдерживатьдокументразделениеизсжатиеалгоритм。

2. Бизнес не имеет никакого отношения к данным.

В реальных бизнес-операциях в операциях вычислений задействовано большое количество значений NULL и некоторые бессмысленные данные. середина, эти числовые данные могут поступать из бизнеса, а не из-за того, что число в соответствии со стандартом Воля, какой-то тип данных числа нормализован в нулевое значение или форму ожидания пустой строки. Эти несвязанные данные вводятся для того, чтобы при объединении таблиц происходила групповая агрегация. данные. верноиз-за таких проблемиз Перекос данных,существоватьвычислить Проходить Ченг середина может исключить такие «аномальные» данные 。

3、 Расширение данных числа вычислений многомерной агрегации, вызванное из Перекосом данных

существоватьмного维полимеризациявычислитьчасжитьсуществоватьтакизсцена: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 на следующие несколько отдельных группировок общего типа из комбинаций.

Язык кода:javascript
копировать
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) превышает это значение, будет предоставлено Новая возможность из Задачи обрабатывать комбинации, превышающие это значение. еслисуществовать При обработке числовых данных определенная индивидуальная группировка агрегации из столбца Если наклон большой, вы можете соответствующим образом отрегулировать значение. 。

4. Невозможно сократить время результата из-за количества данных, вызванных из Перекосом данных.

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

Язык кода:javascript
копировать
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.

5. Перекос данных запускается, когда соединяются две отдельные таблицы чисел Hive.

дваповерхностьруководитьобычноизrepartition Если при присоединении соединение таблицы из хранилища ключей существует перекошено, то существует Фаза перемешивания неизбежно приведет к Перекосу. данных 。

В этом случае Hiveиз обычно ничего другого сделать не может. Возможность двух индивидуальных работ, первая обработка индивидуальной работы без наклона изчисло по данным, вторая индивидуальное задание Воля наклона изчисло данных хранятся в распределенном кэше середина и распределяются между каждым индивидуальным Карта Задача существования узла. Фаза существованияMap завершена joinдействовать, то есть MapJoin, который позволяет избежать Понятное Shuffle,отиизбегать Понятно Перекос данных。

Ссылки

[1]

Китайский толстяк «Полное руководство по настройке улья»

[2]

Линь Чжихуан «Практика настройки производительности Hive»

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose