《饮食男女》开头说:“人生不能像做菜,把所有的料都准备好了才下锅。”
但做大数据挖掘不一样,MapReduce 不同于人生,一定要把准备工作做好了,才能顺利运行后面的步骤。如果你的 HiveQL 代码没毛病,却一运行就出现 Fail 提示,可以看看,是不是少了下面哪项准备工作?
set mapred.job.queue.name=queue01; //自己指定一个队列
在 HADOOP 中,队列的组织是一切的基础,决定了队列管理和资源分配,一定要在程序开头指定一个队列,注意任务和资源的平衡。
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 阶段再进行。
set mapred.reduce.tasks=500;
该参数用于设置 reduce 的任务个数,设置为500,即生成500个文件。根据具体数据量进行调整,使得单个 map 能处理合适的数据量。
在海量数据真正跑起来前,一般需要设置的几个参数就是以上提到的啦,具体每个参数需要设置成什么值,还要根据具体的数据量和时间、设备等条件来定,可以反复尝试进行优化。
回复【算法】,获取最全面的机器学习算法网络图: