我遇到的业务场景是统计10个维度的用户画像数据,之前我是放在一个shell脚本里串行跑,总共跑下来差不多要9个多小时:从数据预处理、维度统计、数据上传三大部分。
9个多小时,时间有点长啊,受不鸟了,所以就想着怎么优化hive和集群,然后就各种百度,按照网上的一通操作下来并没啥用,也许是我用的方式不对,所以后面就干脆自己尝试着研究。
我们肯定要明确调优方向:hive,那么这就涉及到hdfs、hive、yarn。。。
首先是hdfs,这块这次基本上没动;
其次是hive本身,首先使用了Tez,CDH怎么集成Tez,这个看我之前的那篇文章,不多说。。下面讲讲这次调整的参数:
参数名 | 修改前 | 修改后 | 参数说明 |
---|---|---|---|
hive.execution.engine | 默认mr | tez | 执行引擎 |
hive.exec.parallel | 默认flase | true | 是否允许并行 |
hive.exec.parallel.thread.number | 默认8 | 32 | 是否允许并行 |
hive.tez.container.size | 默认无 | 6144M | tez容器的容量大小 |
具体在CDH页面上配置如下:
第三,是重点yarn了,因为所有的hive任务,都需要yarn来分配资源的
参数名 | 修改前 | 修改后 | 参数说明 |
---|---|---|---|
yarn.scheduler.minimum-allocation-mb | 1024M | 6144M | 可申请的最少内存资源,以MB为单位 |
yarn.scheduler.maximum-allocation-mb | 40752M | 8192M | 可申请的最大内存资源,以MB为单位 |
yarn.nodemanager.resource.memory-mb | 37526M | 61440M | NM总的可用物理内存,以MB为单位 |
yarn.nodemanager.resource.cpu-vcores | 24 | 30 | 可分配的CPU个数 |
yarn.scheduler.minimum-allocation-vcores | 1 | 3 | 可申请的最小虚拟CPU个数 |
yarn.scheduler.maximum-allocation-vcores | 32 | 8 | 可申请的最 大虚拟CPU个数 |
另外还需要修改一处地方,那就是yarn的资源池
经过上述一番设置后,重启yarn和hive,然后再整理一下hive脚本。
现在基本上是把脚本分成3个:
execPreProcess.sh :执行数据预处理任务
execStatistic.sh :处理10个维度统计的任务
execSummary.sh:处理汇总上传的任务
现在整体速度由原来的串行执行9小时,到现在并行执行3小时,速度上提升还是比较明显。
欢迎大家留言讨论
内容将同步到微信公众号,欢迎关注微信公众号:LearnBigData