一、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