我的 Hive 为什么跑不起来/跑得慢?看看是不是少了这几行代码?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyan_soul/article/details/84668830

《饮食男女》开头说:“人生不能像做菜,把所有的料都准备好了才下锅。”

但做大数据挖掘不一样,MapReduce 不同于人生,一定要把准备工作做好了,才能顺利运行后面的步骤。如果你的 HiveQL 代码没毛病,却一运行就出现 Fail 提示,可以看看,是不是少了下面哪项准备工作?


指定队列

set mapred.job.queue.name=queue01; //自己指定一个队列

在 HADOOP 中,队列的组织是一切的基础,决定了队列管理和资源分配,一定要在程序开头指定一个队列,注意任务和资源的平衡。

自动化 MapJoin

set hive.auto.convert.join=true;

这是一步优化操作,自动化了 MapJoin,之后我们就不需要在 query 中再写了。MapJoin 用于小表 Join 大表的场景,在大表通过 Mapper 时,小表会被完全放入内存中,Hive 会在 map 端进行连接,因为 Hive 可以和内存中的小表进行逐一匹配,从而省略掉 reduce 过程。

任务并行

set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=100;

参数 hive.exec.parallel 控制着同一个 sql 中是否允许并行执行,默认为 false,设置为 true 则开启任务的并行执行。并通过设置 hive.exec.parallel.thread.number 来指定同一个 sql 允许并行运行的最大线程数。

设置超时时间

set mapred.task.timeout=600000000;

这里设置的是 Job 运行多久后会因超时而被 kill 掉,根据数据量而定。我目前工作中处理的数据有上亿条,维度近千,所以设置得比较大。

“健康监测”

set mapred.healthChecker.script.timeout=600000000;

这个参数的作用是,若检测到脚本在一定时间内无响应,那么 NodeHealthCheckerService 线程会将该节点的监控状态标注为 “unhealthy”。但 Hadoop 2.x 以后,参数 mapred.healthChecker.script.timeout 的名字已经改为 mapreduce.tasktracker.healthchecker.script.timeout,虽然原名还可用,最好还是使用新的参数名。

设置容量大小

set hive.tez.container.size=10240;

Tez 是 YARN 的作业模式,hive.tez.container.size 参数可设置堆的大小,即增大内存容量。由于 D12 计算机具有 28GB 内存,因此我们常使用 10GB (10240MB) 大小的容器。

设置聚集操作执行时机

set hive.map.aggr=false;

若将该参数设置为 true,则会在 mapper 端先进行 group by,然后执行 merge 操作,减少 reduce 要处理的数据量,效率更高但需要更多内存。若将该参数设置为 false,则把前面的步骤放在了 reduce 阶段再进行。

设置 reduce 个数

set mapred.reduce.tasks=500;

该参数用于设置 reduce 的任务个数,设置为500,即生成500个文件。根据具体数据量进行调整,使得单个 map 能处理合适的数据量。


在海量数据真正跑起来前,一般需要设置的几个参数就是以上提到的啦,具体每个参数需要设置成什么值,还要根据具体的数据量和时间、设备等条件来定,可以反复尝试进行优化。

 

欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool

展开阅读全文

没有更多推荐了,返回首页