关于hbase、spark、hive使用时的优化问题

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

猜你喜欢

转载自blog.csdn.net/weixin_38653290/article/details/86625804