hive高级进阶

hive性能优化主要是在数据查询、联合查询(JOIN)方面的优化。基本上可以在以下几个方面进行优化:

一、小文件

小文件产生原因:

a.在数据插入时候做了动态分区(文件个数 = maptask个数 * 分区数)

当分区字段包含不同值比较多比如按照分钟分区,一小时会产生60个分区文件。

b.数据源本身就包含很多小文件

c.reduce个数越多,生成的小文件也越多(reduce的个数和输出文件是对应的)

小文件产生的影响:

a.Hive层面上看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能;

b.在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展。

小文件解决方案:

1、从小文件的产生途径解决;

a.使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文  件。set hive.exec.dynamic.partition=true

set hive.exec.dynamic.partition.mode=strictb.减少reduce的数量;

set mapred.reduce.tasks=10c.使用distribute by分区,尽量减少使用动态分区。

      2、对已存在的小文件进行解决

a.使用hadoop archive命令把小文件进行归档;

Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。

b.重建表,建表时减少reduce数量;

c.设置map/reduce端的相关参数

//每个Map最大输入大小(这个值决定了合并后文件的数量)

set mapred.max.split.size=256000000

//一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)

set mapred.min.split.size.per.node=100000000

//执行Map前进行小文件合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

//设置map端输出进行合并,默认为true

set hive.merge.mapfiles = true

//设置reduce端输出进行合并,默认为false

set hive.merge.mapredfiles = true

//设置合并文件的大小,当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge

set hive.merge.size.per.task = 256*1000*1000

二、数据倾斜

三、并行执行

你可能感兴趣的:(hive高级进阶)