把HIVE程序优化30倍的经验

针对Hive处理复杂计算任务时的性能瓶颈,通过调整输入数据分片、利用distributeby优化数据分布、改进Python脚本的数据结构及增加日志跟踪等手段显著提升了处理速度。

今天遇到一个HIVE需求,输入只有4列,大概160MB,需要引用一些字典文件,然后输出70列数据;

典型的复杂计算,由于HIVE无法单独实现,采用TRANSFORM写了PYTHON脚本实现;

 

刚开始写完,map.tasks被设置为7个,结果运行了40分钟还没结束;

以下是一些改进的过程:

1、修改mapred.map.tasks无法实现修改map.tasks数目的目的,迂回的办法是将输入数据进行分片

我将输入数据分片到了87,这样该任务的map.tasks数目变成了87,速度大为提升,每个机器处理的速度减慢;

2、将输入数据按照键distribute by

如果不这样做,那么每个机器分到的数据都是平均的,导致一些聚合操作无法减少存储量,事先对输入数据进行distribute by分片,单个机器上的聚合效果非常好;

3、Python代码中优化数据结构

由于Python代码需要遍历所有的数据行,所以最好不要每个行都去查询很多词典,把多次相同的查询保存下来,共用结果数据;

同时把(a,b,c)为Key的词典,优化成dict[a][b][c]的形式,这样的查询效率高,并且省了更多的内存;

4、增加日志的跟踪

在HADOOP的脚本中,可以用sys.stderr输出一些错误日志,这样就不会干扰结果数据,但是能保存日志记录,比如写个这样的函数:

def logger(msg):
    curr_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
    sys.stderr.write("%s %s\n" % (str(curr_time), str(msg)))

就能够记录时间和自己想要跟踪的信息。

本文地址:http://www.crazyant.net/1440.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁学Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值