阅读更多

1顶
1踩

数据库
编者按:高可用架构推出 2015 年度回顾系列文章,分享在架构领域具有典型意义的年度案例,本文由张虔熙分享。转载请注明来自高可用架构公众号「ArchNotes」。
引用
张虔熙,Hulu 网,专注于分布式存储和计算,HBase contributor。

HBase 2015 年技术发展

在2015年,HBase 迎来了一个里程碑——HBase 1.0 release,这也代表着 HBase 走向了稳定。

New Interface(更加清晰的接口定义)

旧 的 HBase 接口逻辑与传统 JDBC 方式很不相同,新的接口与传统 JDBC 的逻辑更加相像,具有更加清晰的 Connection 管理方式。同时,在旧的接口中,客户端何时将 Put 写到服务端也需要设置,一个 Put 马上写到服务端,还是攒到一批写到服务端,新用户往往对此不太清楚。在新的接口中,引入了 BufferedMutator,可以提供更加高效清晰的写操作。

HBase 0.98 与 HBase 1.0 接口名称对比



举一个例子,旧的 API 写入操作的代码:



新的 API 写入操作的代码:



可以看到,在操作前,首先建立连接,然后拿到一个对应表的句柄,之后再进行一系列操作。以上两个是同步写操作。下面看一下批量异步写入接口:



代码有相应的注释,可见新的接口显得更加清晰。

多个 Region 副本(读操作高可用 HBASE-10070)



如图所示,在HBase中,Table被横向划分为Region,它是一段数据的管理者,Region 被分发到RegionServer 上进行管理,一个Region只被一个RegionServer管理,它的数据存储在HDFS上,是可以有多个副本的。

也就是说:管理者 (Region) 只有一个,数据有多个副本。

HBase的以前实现中,当一台RegionServer 不可用时,需要数十秒甚至数分钟才可以完成发现和恢复工作,在这段时间内,这台RegionServer上的Region 是不可用的。当一个Region不可用时,它需要一段时间才可以被其他RegionServer 接管。

在最新的实现中,一个 Region 可以有多个副本(Region 是数据的管理者,是实际数据的抽象),分布在多个 RegionServer 上。



特点:
  • 有一个主 Region,多个从 Region。
  • 只有主 Region 接收写请求,并把数据持久化到 HDFS 上。
  • 从 Region 从 HDFS 中读取数据并服务读请求。
  • 从 Region 可能会读到脏数据(主 Region 内存中的数据)。
  • 读操作可以只读主,或者既可以读主又可读从(可配置)。

这样在主 Region 不可用时,用户仍可以读从 Region 的数据。目前社区在进行的开发:主 Region 异步同步数据到从 Region,从而减少从 Region 缺少的数据量。

Family 粒度的 Flush(减少小文件,优化磁盘 IO,提高读性能 HBASE-10201)

我们先看一下 HBase 的写流程图



数据从客户端写到 RegionServer 上的 Region 后,先写入到内存中,积攒到阈值后写入磁盘,即 LSM-tree 架构。

在 以前的实现中,服务端数据从内存刷写到 HDFS 上是 Region 粒度的,Region 下面所有的 Family 都会被 Flush。在很多应用场景中,HBase 中存储的是稀疏数据,在写入一行的数据中,有的 Family 具有值,有的为空,而且不同 Family 中存储的数据大小本身就不同,所以当大的 Family 到达阈值需要刷写数据时,小的 Family 也会跟着刷写,这样会导致很多小文件的产生,影响性能。

在新的实现中,提供了更小粒度的 Flush——Family 级别。它的特点是:
  • 更加合理的使用内存的写延迟和聚合功能
  • 减少 Compaction 的磁盘IO
  • 提高读性能

RPC 读写队列分离(读写隔离,scan 与 get 隔离 HBASE-11355)

之 前的实现中,RegionServer 上所有操作共享队列,各种操作互相影响。比如Scan 和 Get,在 RPC Call Queue 中,如果一个大的 Scan 请求排列在 Get 之前,那么 Get 就需要等待之前的 Scan 完成才可以执行,延迟较大。

在现在的实现中,RPC 可以具有多个 Call Queue,同时将它们分配给不同的操作使用,从而实现各种 Put、Scan 和 Get 等操作的隔离。具体配置的参数如下:

hbase.ipc.server.callqueue.handler.factor

hbase.ipc.server.callqueue.read.ratio

hbase.ipc.server.callqueue.scan.ratio

在线调整配置 HBASE-12147

之前的实现中,每次修改配置后都需要重启集群(Rolling Restart)

现在,调整配置后不再需要重启,但是目前只支持一部分配置的在线调整,如 Load Balance 和 Compaction。Hadoop 也已经实现了此功能。

目前社区的工作方向和趋势:

提高可用性

很多应用都要求存储具有高可用性,目前 HBase 实现的还不够优秀,Facebook 的 HydraHBase 是 Facebook 内部维护的 HBase 版本,它使用 Raft 协议管理 Region Server,从而实现高可靠,它的可用率达到 99.999%,Facebook 声称 HydraBase 能将 Facebook 全年的宕机时间缩减到不到 5 分钟。Cloudera Kudu 使用 Raft 协议管理协调 Tablet,从而也可以达到很高的可用率。

HBase 与 HydraHBase 对比:

HBase



HydraBase



对于 HDFS 多存储介质的使用

随着 HDFS 对内存、SSD 的支持和使用,HBase 也会充分使用它们带来的高性能。比如把 WAL 和更多的热数据放到 HDFS 的内存或者 SSD上(三副本)

减少对 ZooKeeper 的使用

Zookeeper 的抖动会对 HBase 造成影响,目前已经完成对 Master 上的 Assignment Manager 的改造,使它不再依赖 ZooKeeper。

堆外内存的使用

Java 管理大内存的方式还不高效,HBase 可以把 Cache 放在堆外,读取的时候不再拉到堆内中,以减少 GC 的影响。

Q & A

1、HBase 集群是不是尽量要读写分离(针对整个集群),我们的集群,随机写入很大,也有随机读,现在碰到随机读请求很不稳定的情况,希望有经验分享一下

HBase 可以支持高吞吐的写请求。对于随机读,如果写操作很多,会造成很多文件来不及 Compact,这会影响随机读的性能。同时,如果 JVM 参数没有经过调优,忙碌的 HBase 集群会有 GC 问题,也会影响随机读的性能。建议可以先调优 JVM 参数和 Cache,也可以引入 BloomFilter 等来优化查询。如果对随机读延迟要求较高,可以考虑分离读写。

2、对于HBASE脏读问题,如果只读从region,是不是就可以避免了?

不 能,因为从 Region 的数据就是过时的,主 Region 才是最新的数据。目前 HBase 的实现中,只有读主 Region 才可以获得最新数据,当主 Region 不可用时,如果可以忍受 stale 的数据,则可以读从 Region 来保证可用性。目前高可用实现的还不太好,这也是社区努力的方向之一。

3、修改 HBase 配置文件,但不重启集群是怎么实现的?

Hadoop 实现了一个动态载入配置的框架,修改配置后,激发服务端重新获取配置。具体可见 Hadoop-7001(https://issues.apache.org/jira/browse/HADOOP-7001)

4、HBase 历史数据有好的处理办法吗?设定多少天之前的数据删除或者只对对历史数据进行压缩?

可以设置 TTL 来淘汰历史数据,设置的时间根据具体应用来定。HBase 可以支持 Family 级别设置压缩,原生 HBase 还不能对于一部分行做压缩,可以考虑分表或者其他上层实现。如果历史数据不再需要,可以考虑设置 TTL。

5、写 MapReduce job 从 HBase 中导出某张表的所有数据,默认是几个 region 产生几个 mapper,有什么可以优化提速的办法?

可以让多个 mapper 读取一个 region 中的数据,这时候你需要定制一下 TableInputFormat(适当修改源代码)

6、0.98 版本或以前的 HBase 有什么好的读写分离方案?snapshot 是不是是一种方法?

从 RPC 层面上讲,snapshot 不算读写分离方案,因为所有的读写都进入同一个 Call Queue。从 MVCC 和锁级别等其他方面来看,snapshot 是一种方案。

7、HBase multitenant 方面有解决方案没有?

社区已经有相应的 issue,在明年发布的 2.0 版本中会发布。

8、HBase 不同集群之间的数据同步在 1.0 版本之后有没有更好的解决方案?

目前的解决方案仍然是 copytable + replication。目前社区已经可以解决 bulk load 的数据的同步(之前 bulk load 的数据不能同步到从集群)。

9、基于 HBase 缓存怎么设计比较好,Hulu 是怎么做的?我的项目里用了 Cloudera 自带的 Solr,发现服务器 memory CPU 开销太大。

HBase 的随机读性能不足为在线服务提供缓存服务,可以考虑使用 Redis 或者 Memcache。Solr 应该是做全文索引服务,这应该和 Solr 的实现相关。如果没有设置把 HBase 的表放到内存,HBase 不会消耗很大内存。对于忙碌的 HBase 集群,还是比较消耗 CPU 。

10、社区版 Hadoop 2.6 没有对应的 HBase 版本支持,可以用刚才讲的 HydraBase 替代 HBase 吗?

HBase 1.0 应该是可以运行在 Hadoop 2.6 之上,从个人角度来看,HydraBase可以替代 HBase,Facebook 就是这么实现的,不过 HydraBase 还没有开源。从架构上来讲,HydraBase 使用 Raft 协议管理 RegionServer,写性能可能不如原生 HBase。

11、请问你们是否在生产环境种使用 HBase + Phoenix 的组合来提供复杂快速查询?如果使用了,并发查询的性能如何?

Hulu 内部还没有使用 Phoenix,以前我个人使用过 Phoenix,当时 Phoenix 对于大量并发查询支持的不好,尤其是使用了索引的复杂查询。但是 Phoenix 社区发展很快,现在的情况应该会有好转。

12、Off-heap 做二级 cache 能否提高随机读速度?

可以 。 bucket cache 实现的比较好。目前社区仍在继续优化。对于随机读,还可以增加 BloomFilter 增强性能。

13、HBase 的 Rowkey 如何设计才能既保持无热点又能有序便于 scan?

可 以考虑 salt 的方式,在写入的时候为 Rowkey 加随机前缀,比如前缀范围 001 - 100,那么我可以随机为 Rowkey 加上这些前缀来消除热点,在 scan 的时候需要加上所有的前缀(001-100)来 scan,不过这样一个 scan 就要转化为并发的 100 个 scan。
  • 大小: 17.7 KB
  • 大小: 23.1 KB
  • 大小: 25.6 KB
  • 大小: 23.5 KB
  • 大小: 26.9 KB
  • 大小: 33.2 KB
  • 大小: 31.3 KB
  • 大小: 21.8 KB
  • 大小: 21.5 KB
1
1
评论 共 1 条 请登录后发表评论
1 楼 悠然自得 2016-01-05 11:48
主 Region 异步同步数据到从 Region,从而减少从 Region 缺少的数据量。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Apache HBase 2015年发展回顾与未来展望

    摘自: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=403219545&idx=1&sn=119613ae7d52de9c033b3ed0598bae6a&scene=23&srcid=0204yhgfxt9YDzVaHxKq6rfs#rd

  • Apache Flink :回顾2015,展望2016

    回顾2015,总体而言Flink在功能方面已经从一个引擎发展成为最完整的开源流处理框架之一。与此同时,Flink社区也从一个相对较小,并且地理上集中的团队,成长为一个真正的全球性的大型社区,并在Apache软件基金会成为...

  • 开启一个新时代: Apache HBase 1.0 发布

    HBase社区的过去、现在及未来  Apache HBase社区发布了Apache HBase 1.0.0。它花费了七年时间在Apache HBase项目领域取得...让我们回顾Apache HBase 项目的过去、纵观它的现在、展望一下未来。 版本啊版本   ...

  • 大数据技术的回顾与展望 ——写在Hadoop十周年纪念

    于2006年1月28日诞生的它改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用。InfoQ策划了一系列文章,为大家梳理Hadoop这十年的变化,以及...

  • Hadoop年度回顾与2016发展趋势

    编者按:高可用架构推出 2015 年度案例系列文章,分享在架构领域具有典型意义的年度案例,本文由董西成分享。转载请注明来自高可用架构公众号「ArchNotes」。董西成,...

  • 40年技术发展变革,物联网行业的趋势、现状与挑战

    简介:40年技术发展变革,物联网行业的趋势、现状与挑战 基础设施的完善,推动应用形态不断变迁 我们把过去四十年分为五个重要的技术发展阶段,从时间轴上我们把它切分为:1980 - 2000,2000 - 2005,2005 - 2010...

  • HBase 原理、设计与优化实践

    而从应用的角度来说,HBase与一般的数据库又有所区别,HBase本身的存取接口相当简单,不支持复杂的数据存取,更不支持SQL等结构化的查询语言;HBase也没有除了rowkey以外的索引,所有的数据分布和查询都依赖rowkey。...

  • Apache Spark 2.4 回顾以及 3.0 展望

    本次分享包括了对 Apache Spark 2.4 回顾以及对 Apache Spark 3.0 的展望。 Apache Spark 2.4 版本是 2.x 系列的第五个版本,此版本的主要特性包括以下几点: 新的调度模型(Barrier Scheduling),使...

  • Apache Kylin 在 58 同城的实践与优化

    Kylin 是在 2015 年的 11 月份正式成为 Apache 顶级项目,在 16 年 7 月份正式发布了 Kylin 1.5.3,在 58 集团是 16 年 8 月份正式上线了 Kylin 1.5.3,在 19 年 3 月份又上线了 Kylin 2.6.0,在 2020 年的 5 月份...

  • Hadoop十年解读与发展预测

    Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用。在2016年Hadoop十岁生日之际,InfoQ策划了...

  • Hadoop 十年解读与发展预测(插图+排版)

    文章目录Hadoop 编年史技术篇存储...下一代分析平台下一个十年后记参考资料个人简介 摘自 http://www.infoq.com/cn/articles/hadoop-ten-years-interpretation-and-development-forecast 作者:陈飚 发表时间:2016...

  • 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

    【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

  • 六一儿童节快乐!(六一儿童节庆祝代码)Vue开发

    六一儿童节快乐!(六一儿童节庆祝代码)Vue开发 like Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Lints and fixes files npm run lint Customize configuration

  • uniapp聊天工具源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

  • NX二次开发uc1603 函数介绍

    NX二次开发uc1603 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。

  • 【目标检测数据集】遥感类军用飞机检测数据集3800张20类别VOC+YOLO格式.zip

    【目标检测数据集】遥感类军用飞机检测数据集3800张20类别VOC+YOLO格式.zip 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3821 标注数量(xml文件个数):3821 标注数量(txt文件个数):3821 标注类别数:20 标注类别名称:["A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13","A14","A15","A16","A17","A18","A19","A20"] 每个类别标注的框数: A1 框数 = 1646 A2 框数 = 1726 A3 框数 = 1164 A4 框数 = 642 A5 框数 = 1262 A6 框数 = 436 A7 框数 = 680 A8 框数 = 944 A9 框数 = 1073 A10 框数 = 924 A11 框数 = 501 A12 框数 = 702 A13 框数 = 1652 A14 框数 = 177

  • grpcio-1.64.0-cp38-cp38-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

  • Kan网络pytorch的实现

    权重替换:KAN网络通过将权重参数替换为可学习的单变量函数,提高了网络的性能和可解释性。这种设计使得KAN网络在准确性和可解释性方面优于传统的多层感知器(MLP)。 激活函数位置:与传统的MLP不同,KAN网络中的激活函数位于网络的“边”(即权重)上,而不是节点上。这使得KAN网络能够更灵活地调整每个连接上的激活函数,从而提高模型的表示能力。 非线性核函数:KAN网络可以使用非线性核函数来替代MLP“边”上的线性函数,进一步增强了模型的非线性处理能力。 逼近精度:KAN网络可以设定细粒度的结点(Knot)来提高逼近精度,这使得KAN网络在处理复杂任务时能够获得更高的准确度。 KAN网络的数学理论基础主要来自于Kolmogorov-Arnold表示定理。该定理指出,任意一个多变量连续函数都可以表示为有限数量的单变量连续函数的两层嵌套加法的形式。KAN网络正是基于这一定理,通过将多元函数的学习转化为对一组单变量函数的学习,提高了模型的表达能力和计算效率。

  • MySQL的performance-schema详解.md

    MySQL的performance_schema详解.md

Global site tag (gtag.js) - Google Analytics