一、Hbase的优化
1、JVM优化:
1)如:HBase RegionServer 的 Java 配置选项
-XX:+UseParNewGC (设置年轻代为并行收集)-XX:+UseConcMarkSweepGC(使用CMS内存收集) -XX:CMSInitiatingOccupancyFraction=70(使用cms作为垃圾回收使用70%后开始CMS收集) -XX:+CMSParallelRemarkEnabled(降低标记停顿) -XX:+UseCompressedOops (压缩指针,解决内存占用)
2)另外设置合理的zookeeper.session.timeout,默认3分钟(GC回收时间如果超过这个值,zk认为宕机regionserver下线)
2、读写性能优化:
1)HTable.setAutoFlushTo(false)关闭自动刷新,避免一个put就执行更新。开启缓存、客户端达到阈值批量提交给RS。
2)对于日志数据可以临时关闭WAL增加性能。
3)建议少的列族(最优不超过3)原因1 多个列族意味着多个memstore,内存使用大效率低。原因2 假设列族1 数据量大,列族2数据量很少,region分裂时两个都会分裂,造成列族2分裂到不同的多个region上造成查询效率低。
4)设置Bloomfilter提升读写性能定位在那个hfile上r;
5)设置hbase压缩。
6)设置hbase.regionserver.handler.count处理RPC线程数,默认10,不是越大越好(OOM)
7)在离线批量读取请求时设置禁用缓存,scan.setBlockCache(false)
8)region拆分:rowkey设d计预分区,保证散列,读写压力均衡
二、Spark优化
1、预估好资源使用情况,通过submmit时的配置参数申请资源。根据core根据资源设置合理的并行度
2、注意数据倾斜,在shuffle阶段,如distinct,groupbykey,join,repartition等,看是在那个stage,那个task。抽样数据,确定是什么key导致,可以通过hive预处理聚合,或者过滤这些key,单独计算;或者预处理采用两步聚合,比如key前加个随机数,聚合一次,去掉随机数再聚合;
3、另外大表join小表情况采用mapjoin(broadcast+map),
4、算子的使用,了解执行原理,比如reducebykey对比groupbykey的效果,repartion对比Coalesce,以及map和mappartition等等,对于可复用的RDD使用cache,persist或者checkpoint等缓存,以及尽量减少shuffle。
三、hive优化
1、排序:orderby,sortby等几种类型排序的选择(详细见发布的另外一篇文章)
2、存储类型优化:详细见:快速理解Hive的数据存储格式及mapreduce底层原理
3、根据数据量设置合理的map、reduce数量
4、其他:如查询的过滤条件必须加入分区筛选, join操作对于大表关联小表时采用map join,对于普通量级别的数据采用即席查询的mpp引擎(presto,impala等等)