Hbase问题
| Q: .meta.和root表是否要分裂? |
| A: meta表和root表不会分裂,代码中有所判断。 |
| Q: 如果不分裂,那么都只有1个region? |
| A: ... |
| (查看代码后)A: meta和root表是要split的,.meta.和-root-不split是在0.20.6以前的版本,升级到0.89以后都会split了,只是不分裂的代码接口还保留着,实际调用的并不是这段代码。-root-理论上也会split,而且一旦发生split就完蛋。但是因为root要split要满足超过1600亿的region,而region的数量被限制在Integer.max(4亿多),所以这种情况是不会发生的 |
| Q: 二级索引如何实现? |
| A: 目前没有好的实现。 |
| Q: 提供一个建议。google的做法是让应用层自己建索引表。写数据时先写数据再写索引,读数据是先读索引再读数据。这样最多是有些数据读不到,不会产生读出错误数据。 |
| A: 其实以前hbase的版本有过二级索引,实现时也是先写数据再写索引,索引放到后台队列中异步地写。实现最终一致。 |
| Q: 我讨厌最终一致这个词。它其实定义很含糊。 |
| A: 恩,hbase后来移走这块代码的一个原因就是索引到底落后数据多少时间是不确定的,特别是在异常的情况下。这样就导致在清理hlog时无法确定一个hlog是否真正全部写入数据了。 |
| Q: 所以像google那样交给应用层去做是很简单有效的一个做法。 |
| A: 应用层的压力会增大? |
| Q: 要有相应的取舍。 |
| A: oceanbeans如何实现二级索引及事务? |
| Q: ob的写是单机的,所以二级索引和事务都可以像传统数据库那样实现,完全基于内存的实现。 |
| Q: hbase中append如何实现?如何保证发生异常时不丢失数据? |
| A: append是hbase写hlog时才做的。打开autoflush的情况下每次会把数据提交到服务器端。服务器端记录下hlog和写入memstore后返还给用户成功 |
| Q: 每次都把hlog写到磁盘? |
| A: 每次都写。 |
| Q: 速度是多少? |
| A: 响应时间单线程约为毫秒级,低于10ms。在做fsync时会超过10ms,fsync每秒1次或每64MB一次 |
| Q: 那不可能,一次写磁盘至少要10ms以上。 |
| A: ... |
| Q: 如果没有写透到磁盘,那在1s以内是会丢失数据? |
| A: ... |
| A(查看代码):在hlog这一块是在append的时候追加数据用流式追加到hfile中,相当于顺序写一个日志文件。每条记录都会flush并且通过os的pagecache往文件里落地,如果单次写请求数据很少那效率确实会低不少。所以批量提交数据会有更大的优势(用put(List put)接口)。数据是不会丢失的。 |
| Q: append需要和master通信吗? |
| A: 不需要,每次写都是直接联系datanode。 |
| Q: 那怎么知道当前append的offset? |
| A: 写之前请求master当前的offset。写完再通知master更新blockmap。 |
| Q: 那能读到最新写入的数据吗? |
| A: … |
| A(回来思考了一下): 不需要立即读到最新的数据,因为这是hlog,即时性没有那么高。在每次执行了fsync后就能读到。 |
| Q: 写是一个还是三个备份成功才返回? |
| A(不确定): 两个。 |
| A(查看代码): 三个。它是一个pipe的模式,先自己写,然后交给next,next也会先写再交给下一个next,直到没有next为止。然后依次返回每一次的结果,如果有一个出错,就会抛出异常给client |
| Q: 那返回出错怎么处理? |
| A: 出错后默认的client向namenode请求新的结点新建chunk文件进行重试。 |
| Q: cluster中各机器是如何相互知道对方存在的。 |
| A: namenode和datanode、hmaster和zookeeper、zookeeper之间、regionserver和zookeeper、hmaster和regionserver之间都存在hearbeat。 |
| Q: heartbeat机制是有问题的,比如因为gc或者网络抖动导致暂时心跳停止如何处理? |
| A: gc时间一般很短,网络抖动也非经常的现象,稍调大心跳lease时间就可以了 |
| Q: 不能说一般,只要理论上可能出现的问题,实际应用中必然出现,特别是海量数据 |
| A: ...ob如何处理这种问题? |
| Q: ob的slave都是静态数据,所以不存在这种问题 |
| A: 目前至少namenode和datanode、hmaster和regionserver、zookeeper之间这三组心跳发生以上问题都不太影响。zookeeper和regionserver以及hmaster之间的心跳确实都会造成相应的影响 |
| Q: 很难在测试环境中模拟出这种情况 |
| A: 怎么模拟? |
| Q: 找QA帮忙,QA是知道如何模拟出网络不稳定的情况的。 |
| Q: 启动cluster的时候,hlog恢复时间长,是因为什么原因? |
| A: hmaster单线程读hlog,然后单线程parse,多线程恢复数据。当hlog多的时候,时间就会很长 |
| Q: 此时所有的regionserver呢? |
| A: regionserver在等待master做这个事。 |
| Q: 那region都处于offline状态? |
| A: 是的 |
| Q: 那数据如何写入? |
| A: ... |
| A(查看代码): 这里的关键是hlog中含有每一行数据的region信息。因此启动时只要读到这个region,hmaster就到对应的hdfs目录下创建一个新的文件。将相应的数据通过hdfs直接写入这个文件,这样在region扫描storefile时就能读到这个数据了。 |
| Q: 那顺序如何保证? |
| A: hmaster在恢复hlog时,默认以128M为单位缓存读到的数据。缓存时采用了一个treemap,因此写入的数据也是有序的 |
Hbase问题的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Hbase的伪分布式安装
Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- Spark读写Hbase的二种方式对比
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...
- 深入学习HBase架构原理
HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...
- hbase协处理器编码实例
Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...
- hbase集群安装与部署
1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...
- 从零自学Hadoop(22):HBase协处理器
阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...
- Hbase安装和错误
集群规划情况: djt1 active Hmaster djt2 standby Hmaster djt3 HRegionServer 搭建步骤: 第一步:配置conf/regionservers d ...
随机推荐
- makefile的命令包定义及使用
下面以\build\core\product.mk下面的内容为例介绍: define _find-android-products-files $(shell test -d device & ...
- Java之String类型详解
字符串的特点 A:字符串一旦被赋值,就不能改变. 注意:这里指的是字符串的内容不能改变,而不是引用不能改变. B:字面值作为字符串对象和通过构造方法创建对象的不同 String s = new Str ...
- Struts 2 之校验器
对于输入校验,Struts2提供了两种方式,1.使用validate方法:2.基于XML配置实现 . validate()方法 支持校验的Action必须实现Validateable接口,一般直接继承 ...
- Windows安装和使用fftw
FFTW是一个比较快的.非常出名的一个DFT的开源库. 本文探索安装和配置FFTW,用Visual Studio 2008来使用fftw. 第一步:下载最新的fftw库 这一步很简单,只要在googl ...
- GDAL使用插件方式编译HDF4、HDF5以及NetCDF的bug修改
GDAL库中提供了很方便的插件机制来扩展支持的数据格式,比如HDF4.HDF5.NetCDF.FileGDB.Postgre.Oralce等等.都可以通过插件的方式来使得GDAL支持相应的格式.最近将 ...
- 创建一个QT for Android的传感器应用应用程序(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)
这个手册描述了使用Qt Quick面访的方式在Android和ios设备上开发QtQuick应用程序的方法.我们使用Qt Creator实现一个QtQuick应用程序,这个应用程序基于加速器的值 ...
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ...
- Oracle dblink详解
database link概述 database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序.在任何分布式环境里,databas ...
- jdbcTemplate的queryForList
jdbcTemplate的queryForList的使用方法如下,它不一样的地方是,它获得的结果,会再放到一个map里去: List rows = jdbcTemplate.queryForList( ...