Оптимизация нескольких ГБ данных в Hadoop Hive

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

Каждую ночь дамп несжатого текстового файла с разделителями табуляции из нашего кластера Oracle записывается в HDFS для обработки Hive.

Я загружаю таблицу так:

CREATE EXTERNAL TABLE ACCOUNTINGTABLE (                                                                                                                                                                                                                                
       ts STRING,                                                                                                                                                                                                                                                      
       duid STRING,                                                                                                                                                                                                                                                    
       owner STRING,                                                                                                                                                                                                                                                   
       hidden STRING,                                                                                                                                                                                                                                                  
       lgroup STRING,                                                                                                                                                                                                                                                  
       nbfiles INT,                                                                                                                                                                                                                                                    
       length BIGINT,                                                                                                                                                                                                                                                  
       replicas INT,                                                                                                                                                                                                                                                   
       provenance STRING,                                                                                                                                                                                                                                              
       state STRING,                                                                                                                                                                                                                                                   
       campaign STRING,                                                                                                                                                                                                                                                
       rlength BIGINT,                                                                                                                                                                                                                                                 
       rnbfiles INT,                                                                                                                                                                                                                                                   
       rowner STRING,                                                                                                                                                                                                                                                  
       rgroup STRING,                                                                                                                                                                                                                                                  
       rarchived STRING,                                                                                                                                                                                                                                               
       rsuspicious STRING,                                                                                                                                                                                                                                             
       name STRING,                                                                                                                                                                                                                                                    
       ami STRING,                                                                                                                                                                                                                                                     
       site STRING)                                                                                                                                                                                                                                                    
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'                                                                                                                                                                                                
LOCATION '/user/accounting/dump';                                                                                                                                                                                                                                      

LOAD DATA INPATH '/user/accounting/dump_REPLACEWITHTIMESTAMP.lst' INTO TABLE ACCOUNTINGTABLE;

а затем запустите несколько сводок бухгалтерского учета, подобных этому, для создания текстового вывода для постобработки:

set hive.exec.reducers.max=90;

CREATE EXTERNAL TABLE ACCOUNTINGTABLE_site_project_datatype_tag (                                                                                                                                                                                                      
ts STRING,                                                                                                                                                                                                                                                             
project STRING,                                                                                                                                                                                                                                                        
datatype STRING,                                                                                                                                                                                                                                                       
tag STRING,                                                                                                                                                                                                                                                            
site STRING,                                                                                                                                                                                                                                                           
duids INT,                                                                                                                                                                                                                                                             
replicas INT,                                                                                                                                                                                                                                                          
nbfiles INT,                                                                                                                                                                                                                                                           
rnbfiles INT,                                                                                                                                                                                                                                                          
length BIGINT,                                                                                                                                                                                                                                                         
rlength BIGINT)                                                                                                                                                                                                                                                        
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'                                                                                                                                                                                                
LOCATION '/user/accounting/summary/REPLACEWITHTIMESTAMP/site_project_datatype_tag';                                                                                                                                                                                    

INSERT OVERWRITE TABLE ACCOUNTINGTABLE_site_project_datatype_tag                                                                                                                                                                                                       
SELECT                                                                                                                                                                                                                                                                 
'REPLACEWITHTIMESTAMP',                                                                                                                                                                                                                                                
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){1}', 1),                                                                                                                                                                                                            
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){5}', 1),                                                                                                                                                                                                            
split(regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){6}', 1), '_tid')[0],                                                                                                                                                                                          
site,                                                                                                                                                                                                                                                                  
count(distinct duid),                                                                                                                                                                                                                                                  
sum(replicas),                                                                                                                                                                                                                                                         
sum(nbfiles),                                                                                                                                                                                                                                                          
sum(rnbfiles),                                                                                                                                                                                                                                                         
sum(length),                                                                                                                                                                                                                                                           
sum(rlength)                                                                                                                                                                                                                                                           
from                                                                                                                                                                                                                                                                   
ACCOUNTINGTABLE                                                                                                                                                                                                                                                        
where                                                                                                                                                                                                                                                                  
(                                                                                                                                                                                                                                                                      
ami='project.datasetnumber.physicsshort.prodstep.datatype.version'                                                                                                                                                                                                     
or                                                                                                                                                                                                                                                                     
ami='project.runnumber.streamname.prodstep.datatype.version'                                                                                                                                                                                                           
)                                                                                                                                                                                                                                                                      
group by                                                                                                                                                                                                                                                               
'REPLACEWITHTIMESTAMP',                                                                                                                                                                                                                                                
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){1}', 1),                                                                                                                                                                                                            
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){5}', 1),                                                                                                                                                                                                            
split(regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){6}', 1), '_tid')[0],                                                                                                                                                                                          
site;                                                                                                                                                                                                                                                                  

DROP TABLE ACCOUNTINGTABLE_site_project_datatype_tag;

Теперь:

Средний размер файла дампа Oracle составляет около 5 ГБ (так что не так уж много) и содержит около 250 миллионов строк. Резюме не превышают 1-2 МБ.

Среднее задание Hive, как упоминалось выше, выполняется около часа. Фаза отображения проходит очень хорошо и достигает 100% примерно через 15 минут, но затем уменьшение занимает почти 45 минут, все время показывая 100%. Теперь мы постепенно добавляем все больше и больше различных сводок, и скоро мы достигнем магического предела в 24 часа для обработки сводок. Наш мониторинг инфраструктуры также показывает, что загрузка узла низкая (процессор ~ 30-40%, ввод-вывод ~ 10%).

Я пробовал играть с io.sort.mb, io.sort.factor и т. д., но это почти всегда усугубляло ситуацию. Итак, теперь я использую настройки Hadoop по умолчанию (кстати, дистрибутив Cloudera). Кластер состоит из 12 узлов (8 ядер), по 24 ГБ ОЗУ и 2 ТБ на диске каждый, настроен на 8 картографов, 8 редукторов (6/6 на namenode).

Я также пытался создать временную таблицу в виде сжатого файла последовательности с помощью INSERT INTO SELECT, но эта INSERT заняла слишком много времени...

У меня есть подозрение, что может быть что-то не так с самим рабочим процессом, а не только с кластером/конфигурацией.

Любые советы с радостью приветствуются.


person Mario    schedule 17.01.2012    source источник
comment
Отвечая на мой собственный вопрос: вставки с несколькими группами - это решение. С помощью какой-то магии теперь требуется 20 минут, чтобы запустить весь бухгалтерский пакет. озадачен   -  person Mario    schedule 17.01.2012
comment
Что ж, это было преждевременно. Запустив то же самое снова, он вернулся к исходной среде выполнения.   -  person Mario    schedule 18.01.2012
comment
Как у вас обстоят дела с использованием сети и диска?   -  person Steve Severance    schedule 18.01.2012
comment
Сеть загружена до максимума... стабильно агрегирует 60-70 МБ/с, узлы перекачивают максимум 10 МБ/с, что является максимальным значением, которое может выдержать сеть. Однако использование диска довольно низкое. Ожидание ввода-вывода составляет около 10-20%.   -  person Mario    schedule 18.01.2012
comment
Попробуйте установить для mapred.compress.map.output значение True. Это сожмет выходные данные вашей карты до того, как они будут переданы по сети.   -  person Steve Severance    schedule 18.01.2012
comment
Хм, это точно ничего не дало. Еще одно наблюдение: несколько раз, когда он работал быстро, у него было всего несколько фаз сопоставления/уменьшения (10/10), тогда как когда он был медленным, их было намного больше (550/150).   -  person Mario    schedule 18.01.2012
comment
Размер данных меняется? Как выглядит ваш план запроса?   -  person Steve Severance    schedule 18.01.2012
comment
Наконец-то я сделал это в Pig. Делает то, что я хочу, в ожидаемое количество времени. Жаль, хотя, я любил Hive.   -  person Mario    schedule 20.01.2012
comment
Я подозреваю, что это разница в том, как оптимизирован план запроса.   -  person Steve Severance    schedule 20.01.2012
comment
Действительно ли каждый из ваших узлов имеет один диск емкостью 2 ТБ? Если это так и загрузка ЦП никогда не превышает 30-40%, возможно, ваши узлы ожидают ввода-вывода. Добавление большего количества шпинделей должно помочь в этой ситуации.   -  person Olaf    schedule 25.01.2012
comment
Это два диска по 1 ТБ в JBOD. Но я думаю, что проблема в том, что план запросов от Hive просто недостаточно хорош (и у меня действительно нет времени отлаживать что-то подобное). Если я прямо укажу, что я хочу в Pig, это будет работать именно так, как рекламируется :-)   -  person Mario    schedule 26.01.2012


Ответы (2)


Вы пробовали разделы или индексы

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

person user495732 Why Me    schedule 09.02.2012
comment
У меня есть несколько анализов, которые ортогональны многим схемам разбиения, так что это мало поможет. И к настоящему времени я сделал это в Pig. - person Mario; 10.02.2012

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

Проверьте создание представлений. Это тоже может помочь, чем таблица без разделов.

person Raviteja Chirala    schedule 12.07.2013