优化Hadoop Hive中的几GB数据

时间:2012-01-17 15:21:45

标签: 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转储的平均文件大小约为5GB(因此不是那么多),大约有2.5亿行。摘要不大于1-2 MB。

上面提到的平均Hive工作大约需要一个小时才能运行。映射阶段进展非常顺利,大约15分钟后达到100%,但是减少大约需要45分钟才能显示100%。 现在我们逐渐添加了越来越多不同的摘要,很快我们将达到24小时的魔术限制进行摘要处理。我们的基础设施监控还显示节点利用率很低(cpu~30-40%,io~10%)。

我尝试过使用io.sort.mb,io.sort.factor等等......但这几乎总会让事情变得更糟。所以现在我正在运行Hadoop默认值(Cloudera distribution btw)。该集群有12个节点(8个核心),每个节点有24GB内存和2TB磁盘,配置为8个映射器,8个减速器(名称节点上为6/6)。

我还尝试使用INSERT INTO SELECT创建一个临时表作为压缩序列​​文件,但INSERT只花了太长时间......

我怀疑工作流本身可能有问题,而不仅仅是群集/配置。

很高兴收到任何建议。

2 个答案:

答案 0 :(得分:0)

您是否尝试过分区或索引

分区可以极大地加速分组,因为数据通过分区在节点上进行物理划分,因此减少操作大大减少,在某些情况下是即时的。

答案 1 :(得分:0)

与分区一起,您可以执行Bucketing,您可以在其中指定Sort By。

检查创建视图。这可能比没有分区的表更有帮助。