hive调优

怎样才能让程序花费的时间最短?Hadoop 是分布式处理系统,可以从两方面进行入手:控制任务的处理数量,使之均衡分布在每个reduce上,不会使哪个任务因为数据量多大而使用过长的时间;增加reduce到一定的数量。

另外的制约因素是tasktracker的负载,一个tasktracker能同时运行多少个map任务,是由 mapred.taskertracker.map.tasks.maximun 属性控制,默认是2个任务。能同时运行多少个reduce任务数是由mapred.tasktracker.reduce.task.maximun属性所控制,默认也是2.

在一个taskertracker 上同时运行的任务数取决于一台机器有多少个处理器,由于mapreduce作业通常是I/O-bound(I/O密集型,cpu通常要等硬盘/内存的读写),因此设置任务数大于处理器数有一定的道理。

1. map的数量

map的数量跟输入的文件大小和个数有关系,可以通过set dfs.block.size 来查看集群设置的文件块大小:

hive> set dfs.block.size;

dfs.block.size=134217728

如果你输入一个文件file1 大小为450M,hdfs 会把它分成4个块,3个128M的和一个66M的文件块,map的数量就是4。

如果你输入4个文件f 大小分别为10M,20M,100M,140M,则hdfs就会把其分成5个文件块:10,20,100,128,12。

map数不是越多越好,如果输入的文件都是小文件,远小于128M,那么每一个文件都会被当作一个map进行处理,map任务启动和初始化时间会大于逻辑处理处理的时间,那么会造成资源的浪费,而且可同时执行的map数是受限制的,只能分批执行。

map处理文件的大小也不是越接近128M越好,同时要根据这个文件记录的数量进行评估,比如文件只有一列,但有几千万行,用一个map来处理是比较费时的。根据实际情况,控制map数量要遵循两个原则: 使大数据量利用合适的map数,使单个map任务处理合适的数据量。

如何合并小文件,减少map数量?

假如有一个SQL任务:

Select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’;

该任务的inputdir  /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04

一共有194个文件,其中有很多文件远小于128M,总共9个G大小,正常会运行194个map任务

Map总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020

我通过以下方法在map执行前合并小文件,减小map数:

set mapred.max.split.size =  100000000; ---每个map最大输入的大小

set mapred.min.split.size.per.node = 100000000;---一个节点上split至少的大小,决定了跨多个datanode 上的文件是否需要合并

set mapred.min.split.size.per.rack = 100000000; ---一个交换机下split至少的大小,决定了多个交换机上的文件是否需要合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;---执行map前进行小文件的合并

再执行以上的语句,用了74个map任务, map消耗的计算资源:SLOTS_MILLIS_MAPS= 333,500

对于这个简单的SQL任务,执行时间差不多,但节省了一半的计算资源。

前面三个参数确定合并文件块的大小,大于文件块的大小128M的,按照128来划分,小于128,大于100的,按照100来划分,把那些小于100(包括小文件和大文件划分剩下的)进行合并,最终得到了74块。

如何增加map数量?

当input文件都很大,执行逻辑复杂,map执行非常慢,可以考虑增加map数,来使得每个map处理的数量减少,提高任务执行效率。

有一个任务:

select id

, count(distinct ...)

, sum(case when ...)

, sum(case when ...)

...

from table1 group by id

;

如果table1只有一个文件块120M,但有几千万行,如果用一个map去处理这个任务,肯定会比较耗时,在这种情况下,我们可以把一个文件拆成多个文件。

set mapred.reduce.task = 10;

create table table2 as

select * from table1

distribute by rand();

这样文件table2 就通过调整reduce数量输出了10个文件块,用来代替table1。再次查询就会用10个map任务去完成。10个map任务并行去处理肯定比一个map快。

原文地址:https://www.cnblogs.com/dali133/p/9302552.html

时间: 2024-08-30 17:27:48

hive调优的相关文章

Hive调优实战

Hive优化总结 ---by 食人花 优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜. 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的.map reduce作业初始化的时间是比较长的. 3.对su

Hive调优-萌贝树母婴无骗子

1 Fetch 抓取 Hive调优-萌贝树母婴无骗子,Fectch 抓取是指对某些情况下的查询不必使用 MapReduce 计算将 hive.fetch.task.conversion 设置成 more,在全局查找.字段查找.limit查找等都不走 MapReduce2 本地模式 Hive调优-萌贝树母婴无骗子,多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的,不过,有时 Hive 的输入数据量是非常小的,在这种情况下,为查询触发执行任务消耗的时间可能会比

hive 调优手段

调优手段 (1)利用列裁剪 当待查询的表字段较多时,选取需要使用的字段进行查询,避免直接select *出大表的所有字段,以免当使用Beeline查询时控制台输出缓冲区被大数据量撑爆. (2)JOIN避免笛卡尔积 JOIN场景应严格避免出现笛卡尔积的情况.参与笛卡尔积JOIN的两个表,交叉关联后的数据条数是两个原表记录数之积,对于JOIN后还有聚合的场景而言,会导致reduce端处理的数据量暴增,极大地影响运行效率. 以下左图为笛卡尔积,右图为正常Join. (3)启动谓词下推 谓词下推(Pre

二、hive调优

下面是hive使用过程中一些调优策略 一.fetch抓取 ? Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算.例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台.? 在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查

Hive调优(语法与参数层面优化)

一.简介 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统计甚至全由Hive完成,如我所在的电商.Hive在企业云计算平台发挥的作用和影响愈来愈大,如何优化提速已经显得至关重要. 好的架构胜过任何优化,好的Hql同样会效率大增,修改Hive参数,有时也能起到很好的效果. 有了瓶颈才需要优化 1.Hadoop的主要性能瓶颈是IO负载,降IO负载是优化的重头戏. 2.对中间结果的压缩 3.合理设置分区,静态分区和动态分区 二.H

(转)hive调优(1) coding调优

本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是用hive比较好. 先将工作中总结,以及学习其他人的hive优化总结如下: 一. 表连接优化 这是比较常见的问题 1.  将大表放后头 Hive假定查询中最后的一个表是大表.它会将其它表缓存起来,然后扫描最后那个表. 因此通常需要将小表放前面,或者标记哪张表是大表:/*streamtable(tab

Hive调优技巧

1.Fetch抓取 set hive.fetch.task.conversion=more(默认) 1 Fetch 抓取是指,Hive 中对某些情况的查询可以不必使用 MapReduce 计算.该属性设置为 more 以后,在全局查找.字段查找.limit 查找等都不走 MapReduce. 设置为none后所有类型的查找语句都要走MapReduce: 2.本地模式 set hive.exec.mode.local.auto=true(开启本地模式) 1 Hive 可以通过本地模式在单台机器上

八、Hadoop学习笔记————调优之Hive调优

表1表2的join和表3表4的join同时运行 此法需要关注是否有数据倾斜(大量数据集中在某一区间段)

hadoop 调优

Hadoop调优 mapred.tasktracker.map.tasks.maximum 官方解释:The maximum number of map tasks that will be run  simultaneously by a task tracker. 我的理解:一个tasktracker最多可以同时运行的map任务数量 默认值:2 优化值:mapred.tasktracker.map.tasks.maximum = cpu数量 cpu数量 = 服务器CPU总核数 / 每个CPU