hive数据调优

        hive作为数据仓库工具,可以查看HDFS结构化文件内容,使用sql进行数据加工处理。在使用hive进行数据查询时,底层执行引擎主要是MapReduce,而MapReduce流程加工处理期间有数据落盘情况,会浪费大量时间,接下来整理下hive是如何确定map和reduce数量及相关优化方法。 

    hive如何确定map数量

        1、输入文件总个数;2、输入文件大小;3、集群设置的文件块大小(默认128,hdfs-set.xml 中dfs.block.size确定大小)。

        比如:

        1、假设input目录下有3个文件a、b、c,大小分别是10m、20m、150m,那么hadoop会分隔成4个块,10m、20m、128m、22m共4个map。

        2、假设输入目录下有1个文件a,大小是780m,hadoop会把a分割成7块,6个128m和1个12m,产生7个map。   

    map数量是否越多越好

        一个map任务启动和初始化时间是需要时间的,如果map数量多,但每个map下数据量并不大,造成执行时间小于启动初始化时间,会浪费大量的时间给更多的map分配task,同时也是对系统资源对浪费。但是对于有些文件在一个文件块下,因为字段少,数据行特别多,可以增加map数量来提高数据处理速度。

        设置调整map数量方法:

        set mapred.max.split.size=100000000  决定每个map处理的最大的文件大小

        set mapred.min.split.size.per.node=100000000  节点可以处理的最小的文件大小

        set mapred.min.split.size.per.rack=100000000  机架中可以处理的最小的文件大小

        set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat(设置执行前进行小文件合并)

    hive如何确定reduce数量

        reduce数量是min(max(totalInputFileSize/bytesPerReducer,1),maxReducers)决定。

        toalInputFizeSize job所有输入总字数

        bytesPerReducer 每个Reduce数据量,由hive.exec.reducers.bytes.per.reducer参数指定

        maxReducers 一个MapReduce作业允许的最大reduce数量,由参数hive.exec.reducer.max指定

        set mapred.reduce.tasks 设置reduce数量,这种方法不建议使用,优先通过设置Reduce数据量确定reduce数量

    hive合并输入文件设置

        set hive.merge.mapfiles = true 在map-only任务结束时合并小文件

        set hive.merge.mapredfiles = true 在map-reduce任务结束时合并小文件

        set hive.merge.size.per.task = 256*1000*1000 合并文件大小 

        set hive.merge.smallfiles.avgsize = 16000000 当输出文件的平均大小小于该值时,启动一个独立map-reduce 任务进行文件merge

你可能感兴趣的:(hive数据调优)