今天遇到一个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://crazyant.net/1440.html