一、Pig 优化
pig 主要瓶颈:
(1). 输入数据量大小
(2). shuffle大小,即Map输出的大小
(3). 输出结果大小
(4). 中间结果大小
(5).内存
主要优化策略:
1. 尽早过滤 (filter) ,去除不需要的记录行
2. 尽早映射 (foreach......generate......) ,去除不需要的列
3. 正确使用Join:
(a). Join注意小表在前,大表在后
(b). 合理运用分片-复制连接 replicated join: join big_table by col1 , join small_table by col2 using 'replicated'
(c). 合理运用倾斜数据连接 skew join:join_table = join table1 by col1, join table2 by col2 using 'skewed'
(d). 合理运用排好顺序的数据连接 merge join:join table1 by col1, join table2 by col2 using 'merge'
4. 为各个字段指定具体的数据类型,不要用默认的bytearray
5. 调整并行度 parrallel N. 调大但必须留有余地
6. 压缩中间结果, 配置mapred.compredd.map.output=true, mapred.compredd.map.output.compression.codec为LZO/Snappy等,
配置pig.tmpfilecompression=true, pig.tmpfilecompression.codec 为LZO/Snappy等,
7. 调节参数 pig.cachedbag.memusage,配置为bag分配的内存百分比,默认0.1
8. 调节参数 pig.skewedjoin.reduce.memusage,配置join过程中出现数据倾斜时,将一边数据具体化到内存中去的可使用内存百分比,默认0.3
9. 适当时候使用多个multiquery 并组装
10.使用Explain 观察执行计划进行优化
二、Hive 优化
主要优化策略:
1. 使用Explain 观察执行计划进行优化
2. 正确使用Join:
(a). Join注意小表在前,大表在后
(b). 合理运用 map-side join:设置了 hive.auto.convert.join=true, hive.mapjoin.smalltable.filesize=2500, hive.optimize.bucketmapJoin=true 等参数会自动开启
3. 小数据量的时候用本地模式,设置mapred.job.tracker=local, 或者让Hive自动使用hive.exec.mode.local=auto
4. 开启 job 并行执行 , hive.exec.parallel=true,
5. 设置严格模式 hive.mapred.mode=strict, 此时有以下限制:查询分区表必须指定分区、Order By 必须使用Limit、禁止笛卡尔积查询
6. 调整Mapper、Reducer 个数,一般 hive.exec.reducers.max = 1.5*总Reduce槽位数/执行中的查询平均个数
7. JVM 重用,即每个JVM可运行多个task, 配置 mapred.job.reuse.jvm.num.tasks=10
8. 使用索引
9. 动态分区调整,即限制分区的最大个数 hive.exec.max.dynamic.partitions, hive.exec.max.dynamic.partitions.pernode
10. 推测执行, mapred.map.tasks.speculative.execution=true, mapred.reduce.tasks.speculative.execution=true, hive.reduce.tasks.speculative.execution=true,
11. 将多个GROUP BY 操作组合到单个Mapreduce,hive.multigroupby.singlemr=true
12. 使用虚拟列 INPUT_FILE_NAME, BLOCK_OFFSET_INSIDE_FILE, ROW_OFFSET_INSIDE_BLOCK 调试
13. 压缩中间结果,hive.exec.compress.intermediate=true,
14. 使用Sequence File 并压缩
三、Pig 和Hive 优化的异同
相同:
1、都要合理运用 Join:小表在前,大表在后;都有map-side join
2、都可通过压缩中间结果提升性能
3、都可调节并行度,即reducer个数
4、都可查看 Explain
不同:
1、Hive有分区,故可优化分区
2、Hive可以使用索引
3、Pig 类似存储过程,故而可优化Filter、Foreach...Generator 等,Hive 不支持存储过程
4、Pig 的Join 有 skew join、merge join