AlbertLee

前行的路上,点点滴滴……

  • 主页
  • 随笔
所有文章 友链 关于我

AlbertLee

前行的路上,点点滴滴……

  • 主页
  • 随笔

Spark读写HBase性能问题及解决方案

2018-07-14

由于3月份换了电脑,更新博客的事情就耽搁下来,今天利用周六在家的空闲时间,在Mac上安装了hexo,总算能够正常更新博客了。

最近做了几个数据量较大的项目,在Spark读写HBase时遇到了一系列的性能问题,造成Spark程序不能正常运行,甚至出现Spark任务运行十几个小时最终报异常的情况,最终经过对HBase表的调整和Spark程序的优化,实现了性能的显著提升。下面主要讲解一下整个过程中遇到的一些问题,以及最终的解决方法。

1. HBase没有预分区导致RegionServer卡死的问题

问题描述:之前考虑到HBase表新建完默认只有一个Region,当数据量达到阈值时会自动进行Region Split操作。所以系统设计之初并没有在新建HBase表时进行预分区操作。结果当大量数据一次导入HBase时,由于Region Split并不能及时触发,造成写入压力集中在一个Region上,导致RegionServer单点负载过高,阻塞甚至卡死的问题,Spark日志会打印connection reset异常(即由于RegionServer卡死造成connection reset),Spark任务会一直阻塞。

解决方案:针对这个问题,我们在建立HBase时通过SPLITS_FILE指定分区文件,在分区文件中划定每个region的范围。我们首先在HBase的Rowkey加入了Hash前缀,并指定了00~ff共256个Region。具体的预分区方法,可以参考博客:HBase建表时预分区的方法

2. 数据倾斜导致的HBase读写性能较差的问题

问题描述: 系统设计之初对数据倾斜考虑不到位,因此没有对Rowkey加入Hash前缀,导致HBase Region读写请求严重不均衡,造成Spark读写HBase性能较慢。

解决方案: 写入HBase时对RowKey添加Hash前缀,结合HBase表的手动预分区,可以使数据均匀分布于HBase集群的各Region中,避免数据倾斜造成HBase单点负载过高,出现单点瓶颈。RowKey添加Hash前缀可以参考org.apache.hadoop.hbase.util.MD5Hash类。

3. Spark BulkLoad方式向HBase导入数据HFile频繁拆分的问题

问题描述:为了提升Spark写入HBase的性能,系统设计采用了BulkLoad的方法,绕过绕过HBase的WAL机制,直接将生成的HFile文件导入HBase集群,但观察Spark任务发现两点问题:

  • BulkLoad方式下会将HDFS上生成的HFile文件加载到HBase集群中,若某个HFile中的数据属于不同Region,会在HDFS中将该HFile拆分为多个HFile文件,可以在spark日志中发现大量的HDFS文件路径频繁split的打印信息,对写入HBase性能影响很大。
  • HBase要求每个HFile内的RowKey为升序排列,Spark采用BulkLoad方式在生成HFile时需要对数据进行排序,否则会导致写入HBase失败。在排序过程中,系统一开始使用SortByKey全局排序算子进行排序,这个过程性能较慢;

解决方案:Spark在生成HFile之前,使用Spark的PartitionBy算子进行自定义分区,保证每个HFile文件中的数据属于同一个Region,可以避免上面HDFS 频繁拆分HFile现象的发生。 针对SortByKey算子运行较慢的问题,由于只需要保证每个HFile内部有序即可,我们使用MapPartition算子进行局部排序,替换原有的SortByKey全局排序类算子,提高了排序性能。

4. 总结

​通过这次的调优过程,最大的体会就是,上述的大部分问题在系统设计之初本就可以避免,但当初过于乐观,想着HBase会自动进行Region Split,系统中的数据也不会过于倾斜,这些估计或预想都是毫无根据,纯粹是一厢情愿,也就造成了系统正式上线后遇到了诸多性能问题,这次是非常深刻的教训,今后在系统设计时,要本着最严格的要求进行开发!

  • HBase

扫一扫,分享到微信

微信分享二维码
《统计学习方法1——统计学习方法概论》
Spark源码阅读2——YarnCluster模式下应用提交流程
© 2019 AlbertLee
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 随笔
  • Spark
  • ElasticSearch
  • HBase
  • JStorm
  • Java
  • SQL
  • ML

    缺失模块。
    1、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    2、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: true
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • Spark源码阅读3——SparkContext初始化流程

    2019-05-27

    #Spark

  • Spark源码阅读1——spark-submit应用提交整体流程

    2019-05-23

    #Spark

  • 《统计学习方法6——Logistic回归与最大熵模型》

    2018-07-22

    #ML

  • 《统计学习方法5——决策树》

    2018-07-20

    #ML

  • 《统计学习方法4——朴素贝叶斯法》

    2018-07-19

    #ML

  • 《统计学习方法3——K近邻法》

    2018-07-18

    #ML

  • 《统计学习方法2——感知机》

    2018-07-16

    #ML

  • 《统计学习方法1——统计学习方法概论》

    2018-07-14

    #ML

  • Spark读写HBase性能问题及解决方案

    2018-07-14

    #HBase

  • Spark源码阅读2——YarnCluster模式下应用提交流程

    2018-05-24

    #Spark

  • 2017年度工作总结

    2018-02-13

    #随笔

  • 《深入理解JVM虚拟机》阅读总结

    2017-12-11

    #Java

  • SparkStreaming实践总结

    2017-12-08

    #Spark

  • Apache Livy介绍

    2017-10-17

    #Spark

  • HBase系列5——性能优化

    2017-10-15

    #HBase

  • HBase系列4——常用API介绍与Spark读写HBase

    2017-10-14

    #HBase

  • HBase系列3——表结构设计

    2017-10-13

    #HBase

  • HBase系列2——读写流程

    2017-10-12

    #HBase

  • 《SQL学习指南》阅读总结

    2017-10-09

    #SQL

  • Spark杂谈1

    2017-10-09

    #Spark

  • HBase系列1——简介及基本架构

    2017-08-27

    #HBase

  • ElasticSearch系列1——简介及基本架构

    2017-08-22

    #ElasticSearch

  • 新的征程

    2017-08-20

    #随笔

  • JStorm源码阅读系列4——SubmitTopology分析

    2017-03-30

    #JStorm

  • JStorm源码阅读系列3——TopologyBuilder分析

    2017-03-26

    #JStorm

  • JStorm源码阅读系列1——Nimbus启动流程

    2017-03-22

    #JStorm

  • 《Java编程思想》读书笔记——4

    2017-03-20

    #Java

  • 《Java编程思想》读书笔记——3

    2017-03-19

    #Java

  • JStorm源码阅读系列2——Supervisor启动流程

    2017-03-02

    #JStorm

  • JStorm源码阅读系列

    2017-03-02

    #JStorm

  • 《Java编程思想》读书笔记——2

    2017-02-21

    #Java

  • serialVersionUID的用法

    2017-02-14

    #Java

  • 《Java编程思想》读书笔记——1

    2017-02-12

    #Java

  • 开启博客之旅

    2017-01-14

    #随笔

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
前行的路上

点点滴滴……