IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    把HIVE程序优化30倍的经验

    Crazyant发表于 2014-05-28 13:58:37
    love 0

    今天遇到一个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

    您可能也喜欢:

    Hive开发经验问答式总结

    Hive开发中使用变量的两种方法

    hive从查询中获取数据插入到表或动态分区

    Hive的left join、left outer join和left semi join三者的区别

    Hive使用TRANSFORM运行Python脚本总结
    无觅


沪ICP备19023445号-2号
友情链接