- 浏览: 353548 次
- 性别:
- 来自: 杭州
最新评论
-
penkee:
为何我启动 zookKeeper bookie 10 不能创 ...
bookkeeper安装及测试体验 -
Golden-jin:
1楼也好时髦呀
bookkeeper简单分析 -
xGss2000:
要是减少到300个 region,block就0.04s了。话 ...
多region下的hbase写入问题 -
brandom520:
请问lz,我从hbase0.94版本上的数据导入到0.96.1 ...
在不同版本hdfs集群之间转移数据 -
huanghaifeng1990:
您好,我想请问一下,我执行了会发生OOM溢出的Deflater ...
perftools查看堆外内存并解决hbase内存溢出
hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享。
第一次生产故障的现象及原因
现象:
修复方法:直接使用check_meta.rb重新生成.META.表并修补空洞,但是会引起数据丢失。因为引起该空洞的原因是某个region的parent和daughter都被删掉了
查找故障过程非常复杂,具体就不提了,都是内伤啊...
故障原因需要从split的原理说起:
split是一个分布式的事务过程,由于分布式的复杂性,在每一步都有可能发生异常中止,因此每进行一步就要记录一下当前的状态。如果出错了,就根据己经进行的状态来进行对应的回滚操作。这个记录状态的变量在代码里体现为JournalEntry
于是split的过程是这样的:(见图)
当以上过程中任何一步抛出异常时,regionserver会进入回滚逻辑(rollback):
对状态机中存储己经进行的状态进行检查,并从后往前开始遍历己进行的状态:
了解了以上过程,我们来假设以下两种场景:
场景1 如果split期间如果在第4步(close parent并且返回所有storefile)结束后,或者执行过程中发生异常,那么此时会发生什么呢?
状态机里的值是CREATE_SPLIT_DIR,因此会删除子目录,但由于parent己经被close或者处于closing状态了,那么就是父子region都没有在线,此时无法读写该region对应的数据
场景1还比较好解决,比如直接下线该台rs再重启就能解决了。当然对于在线业务来讲,这个还是不能接受的,因为系统不可用时间太长了。于是需要用到HBASE-4563这个patch来解决它
它的原理很简单:把CLOSED_PARENT_REGION状态放到close parent前面即可
场景2 如果split期间在第14步期间或以后发生异常。那此时meta表己经将parent下线了,回滚时却没有将parent在meta中的状态改回来,而是删除了子region的目录以及open parent
(注意在open parent的时候并不会修改meta中的offline及split值)。于是该region就不再上线了,形成了空洞。不过这个时候客户端如果cache了该region的地址,那暂时还不会报错,
因为regionserver己经把它重新上线了,数据暂时还能读到。
但是严重的问题是:master有个垃圾清理线程(CatalogJanitor)会定期对meta表做扫描,默认5min一次。它会扫描meta表中split和offline状态为true的那些region,检查是否有子region指向它,如果没有的话,它会认为这个region是己经split成功的,于是会将它从meta表以及hdfs上删掉。检查子region是否指向它是检查是否有子目录存在并且不为空。在场景2中显然子目录己经不再存在了,因此被认为是split成功的region,于是数据被master删掉...
这里的根本原因是没有对写meta这个状态进行记录以及回滚,并且master检查子region是否存在的条件太过简单,需要做调整。具体可参见HBASE-3872以及HBASE-4562(3872试图解决这个问题,但是没有解决掉。4562进行了进一步的处理)
修复的原理就是增加一个状态来记录,而当回滚发现这个问题时,让这台regionserver自己挂掉。这样在master恢复它的时候,会执行fixDaughter的逻辑,这个逻辑会完整地恢复这个region,让split成功,子region上线。而CatalogJanitor的逻辑也进行了调整,对数据进行更加严格的检查和保护,避免随意删除数据。
场景2是个非常严重的bug,推荐大家都升级一下。因为在复杂的网络环境中这个异常还是比较容易出现的。
第二次生产故障的现象及原因
现象:
修复方法:找到start_key和end_key相同的几个region,把它们的从hdfs上删除掉。然后用add_table重建meta表(会导致丢失数据)
这个过程也是一个hbase的bug产生的,这个bug来自于重启过程。复现问题也很容易,进行以下几步即可复现:
1 找到一台正在split的region所在的rs
2 kill掉该台rs
3 重启整个集群或master进行切换
原因分析:
当hbase的master在主从切换或者重启的时候,有一个步骤是切换之后的master需要对原来所有的挂掉的regionserver上的region进行processDeadRegion,即重新上线。
该过程在0.90.4之前存在一个bug,即会把meta表中所有处在split期间的region也进行处理,虽然region在meta表中处于split状态并不能证明它己经split结束还是正在split(要对split状态进行标记还是很复杂的,因此目前的代码还没有对split状态进行记录,只能通过一些辅助手段,比如检查子region的状态来说明region是否处于split状态),但是万一它己经split结束的话是绝对不应该上线的。因此有可能一个region己经split结束,但它在这个处理过程中又被新起的master上线了,这就导致父子region同时服务了。而父region上线后又有可能继续split,导致状况更加糟糕,同一段数据被两个region服务,等等。
正确的处理办法是在重启时检查这些region的子region状态,具体检查方案在hbase-0.90.4中己经给出,可参见HBASE-3946。注意:打上3946的patch以后,还必须要打上3995的patch,否则单元测试无法通过。
这个一般是scan某一个范围的数据作为样本,然后和源数据作比较。
呃,这个时候重启一下整个集群就行了
生产故障的话,只能从原理上来分析的
测试环境是可以直接想办法scan的
第一次生产故障的现象及原因
现象:
1 hbase发现无法写入 2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table ... is broken; edges does not contain ... 3 此时读写失败
修复方法:直接使用check_meta.rb重新生成.META.表并修补空洞,但是会引起数据丢失。因为引起该空洞的原因是某个region的parent和daughter都被删掉了
查找故障过程非常复杂,具体就不提了,都是内伤啊...
故障原因需要从split的原理说起:
split是一个分布式的事务过程,由于分布式的复杂性,在每一步都有可能发生异常中止,因此每进行一步就要记录一下当前的状态。如果出错了,就根据己经进行的状态来进行对应的回滚操作。这个记录状态的变量在代码里体现为JournalEntry
于是split的过程是这样的:(见图)
- 1 创建splitDir(region目录下的splits目录)
- 2 状态机添加CREATE_SPLIT_DIR
- 3 执行internalFlushcache把内存刷到磁盘
- 4 close parent并且返回所有storefile
- 5 状态机添加CLOSED_PARENT_REGION
- 6 把region从rs的online列表中删除
- 7 状态机添加OFFLINED_PARENT
- 8 多线程进行split storefiles,创建子目录并把文件写进去,(原文件不删除,该过程默认超过30s会强行中止并抛出IOE)
- 9 状态机添加STARTED_REGION_A_CREATION
- 10 创建第一个daughter region
- 11 状态机添加STARTED_REGION_B_CREATION
- 12 创建第二个daughter region
- 13 在meta表中下线parent
- 14 原子性往meta表中写以下信息:parent置为offline以及split状态,parent添加两列:splitA和splitB
- 15 并发open DaughterA和DaughterB(如果线程中断,则通知rs退出进程)
- 16 在open期间,如果server中止,则先把A和B的信息写入到meta表中再跳过以下过程
- 17 创建两个新的HRegion,通知rs把子region添加到online列表中
- 18 把Daughter信息写入meta表
当以上过程中任何一步抛出异常时,regionserver会进入回滚逻辑(rollback):
对状态机中存储己经进行的状态进行检查,并从后往前开始遍历己进行的状态:
- CREATE_SPLIT_DIR:删除子目录
- CLOSED_PARENT_REGION:重新初始化parent
- STARTED_REGION_A_CREATION:删除A对应的目录
- STARTED_REGION_B_CREATION:删除B对应的目录
- OFFLINED_PARENT:把parent添加到online队列中
了解了以上过程,我们来假设以下两种场景:
场景1 如果split期间如果在第4步(close parent并且返回所有storefile)结束后,或者执行过程中发生异常,那么此时会发生什么呢?
状态机里的值是CREATE_SPLIT_DIR,因此会删除子目录,但由于parent己经被close或者处于closing状态了,那么就是父子region都没有在线,此时无法读写该region对应的数据
场景1还比较好解决,比如直接下线该台rs再重启就能解决了。当然对于在线业务来讲,这个还是不能接受的,因为系统不可用时间太长了。于是需要用到HBASE-4563这个patch来解决它
它的原理很简单:把CLOSED_PARENT_REGION状态放到close parent前面即可
场景2 如果split期间在第14步期间或以后发生异常。那此时meta表己经将parent下线了,回滚时却没有将parent在meta中的状态改回来,而是删除了子region的目录以及open parent
(注意在open parent的时候并不会修改meta中的offline及split值)。于是该region就不再上线了,形成了空洞。不过这个时候客户端如果cache了该region的地址,那暂时还不会报错,
因为regionserver己经把它重新上线了,数据暂时还能读到。
但是严重的问题是:master有个垃圾清理线程(CatalogJanitor)会定期对meta表做扫描,默认5min一次。它会扫描meta表中split和offline状态为true的那些region,检查是否有子region指向它,如果没有的话,它会认为这个region是己经split成功的,于是会将它从meta表以及hdfs上删掉。检查子region是否指向它是检查是否有子目录存在并且不为空。在场景2中显然子目录己经不再存在了,因此被认为是split成功的region,于是数据被master删掉...
这里的根本原因是没有对写meta这个状态进行记录以及回滚,并且master检查子region是否存在的条件太过简单,需要做调整。具体可参见HBASE-3872以及HBASE-4562(3872试图解决这个问题,但是没有解决掉。4562进行了进一步的处理)
修复的原理就是增加一个状态来记录,而当回滚发现这个问题时,让这台regionserver自己挂掉。这样在master恢复它的时候,会执行fixDaughter的逻辑,这个逻辑会完整地恢复这个region,让split成功,子region上线。而CatalogJanitor的逻辑也进行了调整,对数据进行更加严格的检查和保护,避免随意删除数据。
场景2是个非常严重的bug,推荐大家都升级一下。因为在复杂的网络环境中这个异常还是比较容易出现的。
第二次生产故障的现象及原因
现象:
1 用户发现tps有下降,且部分写入不正常。 2 通过hbck检查到集群有"Chain of regions in table …contains less elements than are listed in META; visited=”问题存在,意即META表中某些region出错,此时若用户有新的写入,则新的写入有可能会数据丢失。 3 通过1个多小时的修复,仍然没有将该集群状态无损还原。原因是出现了两个region服务同一段数据
修复方法:找到start_key和end_key相同的几个region,把它们的从hdfs上删除掉。然后用add_table重建meta表(会导致丢失数据)
这个过程也是一个hbase的bug产生的,这个bug来自于重启过程。复现问题也很容易,进行以下几步即可复现:
1 找到一台正在split的region所在的rs
2 kill掉该台rs
3 重启整个集群或master进行切换
原因分析:
当hbase的master在主从切换或者重启的时候,有一个步骤是切换之后的master需要对原来所有的挂掉的regionserver上的region进行processDeadRegion,即重新上线。
该过程在0.90.4之前存在一个bug,即会把meta表中所有处在split期间的region也进行处理,虽然region在meta表中处于split状态并不能证明它己经split结束还是正在split(要对split状态进行标记还是很复杂的,因此目前的代码还没有对split状态进行记录,只能通过一些辅助手段,比如检查子region的状态来说明region是否处于split状态),但是万一它己经split结束的话是绝对不应该上线的。因此有可能一个region己经split结束,但它在这个处理过程中又被新起的master上线了,这就导致父子region同时服务了。而父region上线后又有可能继续split,导致状况更加糟糕,同一段数据被两个region服务,等等。
正确的处理办法是在重启时检查这些region的子region状态,具体检查方案在hbase-0.90.4中己经给出,可参见HBASE-3946。注意:打上3946的patch以后,还必须要打上3995的patch,否则单元测试无法通过。
评论
8 楼
bin_1715575332
2013-01-16
对啊,求告知如何检测数据是否丢失,!
7 楼
david.org
2012-03-30
杨俊华 写道
想问一下,你们通过什么工具检测丢掉部分数据,因为Hbase的表可能数据很多,如何得知丢失了部分数据。谢谢。
这个一般是scan某一个范围的数据作为样本,然后和源数据作比较。
6 楼
lc_koven
2011-11-10
lurga 写道
请教一下,add_table之后,所有region处于not deployed怎么处理?我直接执行hbase hbck -fix,结果,重复key又出现了
呃,这个时候重启一下整个集群就行了
5 楼
lurga
2011-11-10
请教一下,add_table之后,所有region处于not deployed怎么处理?我直接执行hbase hbck -fix,结果,重复key又出现了
4 楼
raymondysq
2011-10-30
分析的过程很辛苦吧,赞!
3 楼
lc_koven
2011-10-19
杨俊华 写道
想问一下,你们通过什么工具检测丢掉部分数据,因为Hbase的表可能数据很多,如何得知丢失了部分数据。谢谢。
生产故障的话,只能从原理上来分析的
测试环境是可以直接想办法scan的
2 楼
杨俊华
2011-10-19
想问一下,你们通过什么工具检测丢掉部分数据,因为Hbase的表可能数据很多,如何得知丢失了部分数据。谢谢。
1 楼
杨俊华
2011-10-18
超赞。
宝贵经验呀。
HBase只有在实战中努力完善。
宝贵经验呀。
HBase只有在实战中努力完善。
发表评论
-
lease引发的血案
2011-12-19 23:01 6167今天线上出现了一个故障惊出一身冷汗,经过查明原来是lease引 ... -
hbase写被block住的典型案例分析
2011-11-10 22:32 5940今天一个线上集群出现莫名奇妙不能写入数据的bug,lo ... -
在不同版本hdfs集群之间转移数据
2011-10-26 18:56 7208本文仅供记录一下程序心得: 很多人会有这样一个需求:将 ... -
hbase中的deleteColumn
2011-10-26 16:59 5163Delete类的接口有两个方法:deleteColum ... -
splitlog期间丢失数据的问题
2011-10-18 22:26 3702splitlog是保证在重启或rs挂掉后,恢复hlog ... -
hbase中多次加载root及meta的bug
2011-10-18 22:24 3197执行以下case可以见到root或meta被加载两次: ... -
hbase中regionserver常见的oom原因分析
2011-09-15 10:40 9076首先要清楚reginserver中内存是如何使用的。 ... -
hbase的export与import工具
2011-09-01 08:01 11317hbase提供了导出表的方案,将指定的表导出到HDFS ... -
disable table失败的处理
2011-08-30 20:02 4343相信每一个维护hbase集群的运维人员一定碰到过dis ... -
使用zookeeper管理多个hbase集群
2011-08-16 15:30 18161zookeeper是hbase集群的"协调器 ... -
一次奇异的getRegionInfo异常定位
2011-08-10 19:55 2526今天在线上环境的 ... -
多region下的hbase写入问题
2011-08-10 13:13 9251最近在集群上发现hbase写入性能受到较大下降,测试环 ... -
hbase上应用lucene创建索引及检索
2011-07-21 17:14 11620hbasene(https://github.com/ ... -
hbase-0.90.4的主要更新
2011-07-15 22:15 2819apache邮件列表中提 ... -
hbase中缓存的优先级
2011-06-15 16:30 4134今天同事问到hbase中in-memory属性的作用, ... -
hbase交流记录
2011-06-02 10:34 3542前几天和公司的同事杨传辉(http://www.nosqlno ... -
secondary index for hbase
2011-05-07 23:05 5799最近因为业务需求 ... -
hdfs上的append测试
2011-05-04 23:42 6556hbase在写入数据之前会先写hlog,hlog目前是se ... -
hbase写入性能影响续
2011-04-18 15:28 10604今天发现hbase在写入一张新表时,写入过程中时常会出 ... -
hbase中的缓存的计算与使用
2011-04-13 20:20 8371hbase中的缓存分了两层:memstore和b ...
相关推荐
### 大数据HBASE考题材料解析 #### 单项选择题解析 1. **HBase的起源** HBase的设计灵感源自于Google的BigTable论文,这使得HBase能够支持大规模的... - 这个过程中,HLog会记录每一次的写操作,以防止数据丢失。
即使单个节点发生故障,HBase也能够保证数据的完整性和服务的连续性。 3. **实时读写**:相比于HDFS主要针对批处理场景,HBase提供了低延迟的随机读写能力,适合实时数据查询和更新。 4. **可伸缩性**:HBase的...
《Storm流计算项目:1号店电商实时数据分析系统——优化Bolt支持重启及结果数据核查》 在大数据处理领域,Storm作为一个实时计算框架,被广泛应用于实时数据分析和处理任务。在1号店的电商实时数据分析系统中,项目...
综上所述,此数据仓库建设方案以高效的数据采集和处理为核心,结合灵活的存储和分析机制,旨在为列车监控与诊断系统提供强大的数据支持,确保故障诊断的准确性和响应速度,进一步提升列车运营的安全性和效率。
数据仓库建设方案主要聚焦于构建一个高效、稳定的数据存储和分析平台,以支持专家系统对车辆故障的诊断和处理。方案的核心目标是整合来自不同来源的数据,如TCMS(列车监控与检测系统)和车载子系统,进行实时或离线...
* 采用 HDFS 默认的冗余备份数量配置,保证集群中的数据不会因为单节点出现故障而丢失。 插件化程序开发: * 采用 Apache 的 Felix(Apache OSGi 开源实现),使用 OSGi API 来创建应用,然后将之部署到 OSGi 容器中...
- **全量迁移**:DTS提供一次性全量数据迁移功能,确保新旧系统之间的初始数据一致。 - **实时同步**:在全量迁移后,DTS可以持续监控源数据库的变更,实时将新增、修改、删除的操作同步到目标数据库,实现零数据...
以上内容涵盖了大数据领域的关键技术点,包括但不限于分布式计算框架、资源调度、数据分析步骤、Hive、Hadoop HA、Hadoop联邦机制、Storm、Kafka以及HBase等,旨在帮助读者全面了解大数据领域的核心技术及其实现细节...
每个数据块通常都有多个副本,这样即使某些节点故障,数据也不会丢失。HDFS遵循“一次写入,多次读取”(WAL)的原则,确保数据的一致性。 **MapReduce** MapReduce是Hadoop的数据处理模型,它将复杂的并行计算...
大数据Spark二次开发是指使用Apache Spark进行大数据处理和分析的过程。Spark是基于内存的计算引擎,可以快速处理大量数据。 Spark任务运行流程 Spark任务运行流程包括以下几个步骤: 1. 任务提交:用户提交...
当某个副本丢失时,系统会自动恢复数据。 - **大数据处理能力**:HDFS可以处理PB级别的数据,适用于处理非常大的文件集合,其设计允许高效地处理大规模数据集。 - **低成本实现**:HDFS可以在廉价的硬件上运行,通过...
比如,通过HDFS(Hadoop Distributed File System)这样的分布式文件系统,数据会被自动复制到多台机器上,即使某台机器出现故障,数据也不会丢失。 数据的扩展能力是分布式爬虫的又一显著特征。当数据量不断增长时...
默认情况下,HDFS会将每个数据块复制三次,分别存储在不同的数据节点上,形成主副本和两个备份副本。 3. **NameNode与DataNode**:NameNode是HDFS的元数据管理节点,负责维护文件系统的命名空间和块信息。DataNodes...
- **可靠性**:Flume 提供了多种机制来确保数据传输过程中的完整性和可靠性,例如通过 Channel 存储事件,即使遇到节点故障也能保证数据不丢失。 - **灵活性**:Flume 具有丰富的插件生态系统,允许用户根据需求选择...
容错性意味着Hadoop能够在遇到硬件故障时继续运行,而不会丢失数据;经济性则在于使用商用硬件即可搭建Hadoop集群,而不必依赖昂贵的专用硬件;灵活性则是指Hadoop支持多种数据类型和处理模式,从简单的日志分析到...
在 Storm 中,Spout 必须是可容错的,确保即使在部分节点失败时,数据也不会丢失。 3. **Bolt**:Bolt 是执行具体业务逻辑的组件,可以进行数据清洗、聚合、过滤、计算等操作。Bolt 支持并行处理,可以同时处理多条...
这是为了防止单点故障造成的数据丢失,通过不同地理位置的数据中心,保证即使某一中心发生故障,其他数据中心仍然可以继续服务,确保业务的连续性。 综上所述,文件提供了一个关于ApsaraDB for MongoDB的技术概览,...
- 高可靠性:HDFS采用了数据副本的方式,通过在不同节点上存储多个数据副本来保证数据的可靠性,即使一些节点发生故障,也不会丢失数据。 - 高扩展性:HDFS可以很容易地扩展到数百个节点的集群,满足大数据存储...
- **列族存储**: 如HBase,适合处理大规模数据分析任务。 - **图形数据库**: 如Neo4j,用于处理复杂的关系网络数据。 #### 6. MySQL与MongoDB之间的差异 - **数据表示**: - **MySQL**: 关系型表结构。 - **...