2012-01-17 2 views
4

Я довольно активно использовал Hive, и мне было интересно, есть ли способ улучшить следующий рабочий процесс.Оптимизация нескольких ГБ данных в Hadoop 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 МБ.

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

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

Я также попытался создать временную таблицу в качестве сжатого sequencefile с INSERT INTO SELECT, но ВСТАВИТЬ просто слишком долго ...

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

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

+0

Отвечая на мой собственный вопрос: многопользовательские вставки - это решение. Через некоторую магию теперь требуется 20 минут для запуска всего набора бухгалтерских услуг. * сбитый с толку * – Mario

+0

Ну, это было преждевременно. Повторяя то же самое, он вернулся к исходной среде исполнения. – Mario

+0

Какова ваша сеть и использование диска? –

ответ

0

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

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

+0

У меня есть несколько анализов, которые ортогональны многим схемам разделов, поэтому это не очень поможет. И теперь я сделал это на Pig. – Mario

0

Наряду с разделением вы можете сделать Bucketing, и вы можете указать Sort By в нем.

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

Смежные вопросы