今天写了一个统计脚本,shell为主体,调用hive接口,来实现hdfs上表的汇总统计计算。
本来设想的很好,将各个表的统计维度抽取出来,然后各个表负责自己对应的统计字段,最后按照统计维度将结果group by出来。
我做事情习惯于分步实现,循环测试。在中间环节就遇到了一个小问题:
测试的时候没有统计最后结果,而是将各个表的union结果先select出来,放置在本地文件中,待脚本执行完,我可以查看文件,看看有什么问题。
但是mapreduce执行完就会卡在100%的位置,一卡就是1个小时。
观察输出的文件大小一直在增加,到8G左右时候还在涨。
意识到shell脚本远程调用hive接口,输出文件到本地这个过程本身就有问题:
1. 需要网络传输。
2. 传输是单机的执行。
平时这么做,因为数据量较小,完成的速度较快,于是没有察觉这个过程。
--------
修改脚本,将结果存入hdfs的临时表,取消传输到本地文件这一过程。
运行到最后的位置,如期,顺利完成。
查看整个hdfs表大小9.3G,试想,第一个环节再多卡一会,岂不是也能完成了?
9.3G也有点大,看了一下union的逻辑,中间有个子表可以事先做聚合,减少输出的数据量,经过聚合,将临时表的数据量缩减到1.7G。
完事!根据临时表的数据继续往下统计吧。
晚上吃个好的犒劳一下自己