《饮食男女》开头说:“人生不能像做菜,把所有的料都准备好了才下锅。”
但做大数据挖掘不一样,MapReduce 不同于人生,一定要把准备工作做好了,才能顺利运行后面的步骤。如果你的 HiveQL 代码没毛病,却一运行就出现 Fail 提示,可以看看,是不是少了下面哪项准备工作?
指定队列
set
在 HADOOP 中,队列的组织是一切的基础,决定了队列管理和资源分配,一定要在程序开头指定一个队列,注意任务和资源的平衡。
自动化 MapJoin
set
这是一步优化操作,自动化了 MapJoin,之后我们就不需要在 query 中再写了。MapJoin 用于小表 Join 大表的场景,在大表通过 Mapper 时,小表会被完全放入内存中,Hive 会在 map 端进行连接,因为 Hive 可以和内存中的小表进行逐一匹配,从而省略掉 reduce 过程。
任务并行
set
参数 hive.exec.parallel 控制着同一个 sql 中是否允许并行执行,默认为 false,设置为 true 则开启任务的并行执行。并通过设置 hive.exec.parallel.thread.number 来指定同一个 sql 允许并行运行的最大线程数。
设置超时时间
set
这里设置的是 Job 运行多久后会因超时而被 kill 掉,根据数据量而定。我目前工作中处理的数据有上亿条,维度近千,所以设置得比较大。
“健康监测”
set
这个参数的作用是,若检测到脚本在一定时间内无响应,那么 NodeHealthCheckerService 线程会将该节点的监控状态标注为 “unhealthy”。但 Hadoop 2.x 以后,参数 mapred.healthChecker.script.timeout 的名字已经改为 mapreduce.tasktracker.healthchecker.script.timeout,虽然原名还可用,最好还是使用新的参数名。
设置容量大小
set
Tez 是 YARN 的作业模式,hive.tez.container.size 参数可设置堆的大小,即增大内存容量。由于 D12 计算机具有 28GB 内存,因此我们常使用 10GB (10240MB) 大小的容器。
设置聚集操作执行时机
set
若将该参数设置为 true,则会在 mapper 端先进行 group by,然后执行 merge 操作,减少 reduce 要处理的数据量,效率更高但需要更多内存。若将该参数设置为 false,则把前面的步骤放在了 reduce 阶段再进行。
设置 reduce 个数
set
该参数用于设置 reduce 的任务个数,设置为500,即生成500个文件。根据具体数据量进行调整,使得单个 map 能处理合适的数据量。
在海量数据真正跑起来前,一般需要设置的几个参数就是以上提到的啦,具体每个参数需要设置成什么值,还要根据具体的数据量和时间、设备等条件来定,可以反复尝试进行优化。
欢迎大家关注微信公众号【数据池塘】: