`
iwinit
  • 浏览: 455051 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
文章列表
HBase put数据时会先将数据写入内存,其内存结构是一个ConcurrentSkipListMap,其Comparator是KVComparator。 keyvalue对象结构 KVComparator的KeyValue对象比较过程 1.使用KeyComparator比较rowkey,结果是rowkey字节序从小到大 2.如果rowkey一样,则按column family比较,结果是column family字节序从小到大 3.如果column family一样,则按family+qualifier比较,结果是qualifier字节序从小到大 4.如果qualifier ...
昨天联调的时候发现一个问题,请求发送后,页面上一直不返回数据,好像一直在waiting。用stack看了下,第一个线程在等待hbase RPC请求返回数据 "http-bio-8080-exec-5" daemon prio=10 tid=0x00002aaab3661000 nid=0x2bb6 in Object.wait() [0x0000000045258000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Met ...
Flush过程,对应MemStoreFlusher 1.是否需要做global flush,有则取当前rs最大的region进行flush if (isAboveLowWaterMark()) { .... //获取memstore最大的region进行flush if (!flushOneForGlobalPressure()) { // Wasn't able to flush any region, but we're above low water mark // ...
HBase的批量put操作主要步骤 1.同个region的put视为同一批操作 2.对批量操作按rowkey进行字节排序 Collections.sort(actionsForRegion);  3.检查region server的全局内存是否超过阀值,如超过则唤醒flush线程进行flush操作   public void reclaimMemSto ...
  接上文,我们创建表t1,列族c1,hbase.root目录为/new。当创建空表时,系统会自动生成一个空region,我们以这个region分配过程看下Region是如何在HMaster和Region server(以下简称rs)中创建的。大致过程如下: 1.HMaster指定分配计划,一个region只会分配给一个rs,多个rs均匀分配 2.多个rs并发执行assiagnment操作 3.先在zk的/hbase/assiangment目录下创建region节点,状态为‘offline’ 4.RPC对应rs,请求分配region 5.master端开始等待所有region都被 ...
让我们从创建表开始探索hbase内部机制。假设hbase.root目录为/new,测试表名为t1。 client使用HBaseAdmin的createTable接口,过程如下 1. 建立HMasterRPC连接,并调用之,由于hmaster端创建table是异步的,所以这里是一个异步操作。如果不指定split规则,默认会创建一个空region。 getMaster().createTable(desc, splitKeys);  2. client线程全表扫描meta表,检查t1表的region是否都分配好。默认重试100次,每次失败sleep。 MetaScannerVis ...
HBase RPC的client主要工作:   1.JDK动态代理获取代理类 2.调用对应服务方法,逻辑包装在Invoker里,新建连接,发送数据包,等待server端响应,默认超时60s 3.超时使用wait+loop检查实现 其类图如下   0.94实现如下 HBaseRPC getProxy入口   public static VersionedProtocol getProxy( Class<? extends VersionedProtocol> protocol, long clientVersion, InetSo ...
HBase的RPC沿用了hadoop的RPC部分代码。HMaster,RegionServer和client都是通过RPC交换数据的。其实大抵相似。RegionServer端RPC部分类图如下:    HBaseServer核心类,实现了Reactor模型,主线程Listener负责accept外部连接,子线程Reader负责连接的具体读写操作,将数据反序列化成Call对象,通过Queue交给后面的Handler线程处理,Handler线程发起反射调用,并将response数据交给Responder线程处理,Responder线程将数据最终写回给client。   0.94代码实现如 ...
HBase的table是该region切分的,client操作一个row的时候,如何知道这个row对应的region是在哪台Region server上呢?这里有个region location过程。主要涉及到2张系统表,-ROOT-,.META.。其结构见图   在zookeeper的/hbase/root-region-server节点中存着-ROOT-表所在的Region Server地址。 -ROOT-表的一个row代表着META的一个region信息,其key的结构是META表名,META表Region的startkey,RegionId。其value的主要保存regioni ...
前面几篇文章讲了follower和leader之间如何选举和初始化的,这一篇将以之前描述过的CREATE请求作为例子来描述在集群环境下是如何处理事务的。 关于client和zookeeper server的描述前几篇文章已经涉及了。这里不就不再赘述了。假设 ...
前一篇介绍了Leader选举,这一篇介绍选举成功之后Leader和Follower之间的初始化。 先看Leader端操作   case LEADING: LOG.info("LEADING"); try { //初始化Leader对象 setLeader(makeLeader(logFactory)); //lead,线程在这里阻塞 leader.lead(); ...
前面几篇文章简单介绍了zookeeper的单机server client处理。接下来几篇文章会介绍分布式部署下zookeeper的实现原理。我们假设有3台server的集群,zoo.cfg配置如下 tickTime=2000 dataDir=/home/admin/zk-data clientPort=2181 #Learner初始化连接到Leader的超时时间 initLimit=10 #Learner和Leader之间消息发送,响应的超时时间 syncLimit=5 #集群配置,3台机器,2888为Leader服务端口,3888为选举时所用的端口 server.1=ma ...
客户端接口   public String create(final String path, byte data[], List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException { final String clientPath = path; PathUtils.validatePath(clientPath, createMode.isSequential()); ...
 前一篇介绍了zookeeper的client和server之间session是如何建立的。在DataMonitor的例子中,DataMonitor通过exists异步接口和server端交互,本文将介绍exists操作是如何完成。 dataMonitor开始exist操作   public void exists(final String path, Watcher watcher, StatCallback cb, Object ctx) { ...... //exist请求头 RequestHeade ...
上一篇,小编给大家介绍了zookeeper server端的启动。这一篇将来说一下client和server端是如何建立session的。通过官网的DataMonitor例子来说明。通过Session建立这个例子,可以大概知道client端和server端是如何处理请求的,之间是如何通信的。 官网Datamonitor的代码: Executor   public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener { String znode; DataMonitor ...
Global site tag (gtag.js) - Google Analytics