精华内容
下载资源
问答
  • Hbase 数据写入

    2017-11-18 17:49:34
    写缓冲(Write Buffer)对于一个put操作来说,每次用户通过Htable.add(put)或者Htable.add(List)来...操作提交时,并不是直接提交给Region Server,而是简单的写入到Write Buffer中。只有Write Buffer满了,才被按照Regi

    写缓冲(Write Buffer)

    对于一个put操作来说,每次用户通过Htable.add(put)或者Htable.add(List)来提交一个或者一组put,就要和Region Server通信一次。这样开销太大,因此引入写缓冲的概念。当Put
    操作提交时,并不是直接提交给Region Server,而是简单的写入到Write Buffer中。只有Write Buffer满了,才被按照Region Server分组,并将一组一次性提交给对应的RS。
    这种做法带来了数据一致性的问题:当数据被写入Write Buffer时,从客户端来看,认为数据写入操作已经完成了。但其实数据只是在缓冲中。这时,如果客户下线的话,数据就会丢失。
    因此是否使用Write Buffer是由用户控制的,Write Buffer的大小也是可以控制的。
    做法:

    HTable.setAutoFlush(false);
    HTable.setWriteBufferSize(123123123);

    WriteBuffer的大小缺省值是每个客户端线程2MB。需要注意的时,因为Hbase支持高并发,所以常见的Hbase客户端访问Hbase都是多线程的。
    如当一个节点上的应用程序有100个线程作为Hbase客户端访问HBase,此时就需要100*2MB=200MB的空间作为Write Buffer。因此,要合理设置WriteBuffer的大小,防止OutOfMemoryError。

    WriteBuffer会在以下几种情况下提交给对应的Region Server
    1)用户调用Htable.flushCommits();
    2)用户调用Htable.close();方法关闭客户端
    3)Write Buffer满

    展开全文
  • 提高HBase WAL写入性能

    千次阅读 2017-09-22 10:51:39
    问题描述: HBase在集成其它组件,作为存储引擎完成组合服务时,往往是数据先写入HBase,然后对数据进行检索,之后数据通过网络传输给目标服务。HBase与组件之间的数据一致性使用WAL来保证。WAL是一种常用的保证...

    问题描述:

          HBase在集成其它组件,作为存储引擎完成组合服务时,往往是数据先写入HBase,然后对数据进行检索,之后数据通过网络传输给目标服务。HBase与组件之间的数据一致性使用WAL来保证。WAL是一种常用的保证数据可靠写入的一种技术,全称为Write-Ahead-Log,就是在向客户端返回写成功前,先将写操作在WAL中记录下来。这样即便系统在数据写入的过程中出现宕机等情况,也可以通过WAL来恢复数据。
          WAL虽然保证了数据的写入安全,但是同样引入了问题即:系统写入性能,可以看出WAL是系统写入性能的一个瓶颈。如何解决该问题以提高写入性能呢?下面是个人的两个想法,实践证明可明显提高写入性能。

    问题分析与解决

           我们知道WAL是对HBase的每一次数据变更操作进行记录(只记录变更行的键值),该操作涉及到HDFS的flush操作,HDFS的flush操作会确保数据被写入对应的DataNode中,这个操作需要进行2次网络连接(第一次连接NameNode确定要写入的DataNode队列,第二次连接DataNode发送数据),比较耗时,会严重影响HBase的写入性能。

           通过分析HBase的写入过程,可以发现,HBase本身的WAL已经记录了最近写入而没有持久化的数据,只要保证HBase将数据刷入(flush)磁盘时,将HBase与其它组件的WAL写入HDFS,就可以保证HBase与组件之间的一致性。因此,可以考虑异步提交HBase-组件操作,如下所示:

    • 后台线程异步定时将WAL从内存刷入到HDFS中 ,防止日志过多;
    • 当Region进行flush时,在flush之前(此时已经确定了flush的记录集),将WAL全部输入HDFS(刷入失败,Region Flush操作终止) ;
    • Region WAL回放时,重做所有callback行的记录。

          通过异步策略是可以提高WAL的写入效率的,但是,当并发较大时,性能明显下降,这是因为对于同一台RegionServer,所有的WAL记录在flush之前都放在同一个队列中,队列的并发性能对WAL的写性能会有较大影响,因此,参照MapReduce分区思路,使用Hash值将写入的WAL记录进行分区,Hash%N(N为队列数)相同的记录被写入同一个队列中,不同队列之间没有竞争关系,从而降低了竞争的强度。

    总结
          通过异步提交策略和Hash分区队列的方式降低了HBase WAL对HBase写入性能的影响。

    展开全文
  • hbase为用户提供了一致的且易于理解的数据模型,同时保证高性能。...为了理解hbase并发控制,我们首先需要理解为什么hbase需要并发控制,换句话说,hbase的什么属性需要引入并发控制。hbase是基于row级别的ACID

    hbase为用户提供了一致的且易于理解的数据模型,同时保证高性能。这篇文章将向大家介绍下hbase数据模型保证和与传统关系数据库之间的区别,接着说下并发写控制的必要性,介绍了一个简单的并发控制方案。最后我们讨论读写并发控制讨论了MVCC。

    为了理解hbase并发控制,我们首先需要理解为什么hbase需要并发控制,换句话说,hbase的什么属性需要引入并发控制。hbase是基于row级别的ACID事务性,ACID是指:

    1 Atomicity:事务的所有操作要么全部成功要不全部失败;

    2 Consistency:仅有有效的数据才能写入数据库;

    3 Isolation:多个事务执行的时候相互之间不会产生影响彼此的执行;

    4 Durability:一旦事务被提交,数据便被持久化了

    如果你有使用关系数据库的经验,这些术语您应该比较熟悉。传统数据库对于数据库中所有数据提供了ACID语义。基于性能考量,hbase仅仅提供行级别的ACID。如果您不是很熟悉这些术语,不用担心。下面通过例子解释下:

    write和write-write同步

    考量两个蝙蝠写入hbase的操作,涉及两个列{company,role}:


    从之前的一篇介绍hbase写路径的文章中,我们知道hbase将执行以下两步操作,在写的时候:

    1. 写入WAL;

    2.更新memstore,将每个数据cell写入

    现在我们假设没有并发控制的情况下将可能发生以下的执行顺序:


    最后,我们可能得到以下的状态:


    这样却违反了隔离性的要求,所以的确是需要进行并发控制的。最简单的解决方案是在每行上面加锁。这样步骤变为下面:

    0 获得行锁;

    1 写WAL;

    2更新memstore;

    3释放行锁


    read-write同步

    目前为止,我们已经为写引入行锁保证ACID。而在读的时候是否也需要呢,下面让我们考虑一下的情况:


    假设我们没有进行并发控制读,这时正好也发生两次写。读如果正好开始于"Waiter"被写入memstore,这个读操作将读到这样的数据:


    因此我们需要并发控制处理read-write同步。最简单的方式是用read也去获取row锁。但是这个却会引起性能的急剧下降。实际上hbase引入了Multiversion Concurrency Control(MVCC)避免read获取锁的的方案。MVCC以下方式:

    对于写:

    w1 获取到行锁后,每个写操作立刻被分配一个write number;

    w2 每个数据cell存储自己的write number;

    w3 写操作完成以后要申明其已经完成了


    对于读

    r1 每个写操作首先被分配一个读时间戳,叫做read point;

    r2 每个read point被分配一个最大的大于所有已完成write number的整数;

    r3 对于read r将会返回数据cell,其满足所有的write number是小于或者等于read point r的最大值



    每个写呗分配一个write number(step w1),每个数据cell附带一个write number写入memstore(step w2, e.g. "Cloudera[wn=1]"),,每个写完成通过完成且write number(step w3)

    现在我们考虑下图4的读场景, read开始于step"Restaurant [wn=2]"之后,但在step“Waiter[wn=2]”之前。根据规则r1和r2,read point被分配为1,根据r3,它将会读取write number1的数据:


    现在我们将所有整合下,具体步骤:

    0 获取row lock;

    0a 获取新的write number;

    1 写入wal;

    2 更新memstore

    2a完成write number

    3释放row lock



    展开全文
  • 最近在写spark程序的时候遇到了hbase并发插入的问题,用sparkstreaming来接收kafka的数据,由于数据量较大,我用spark的executer端去并行插入hbase,结果发现有些数据没插进去,经过排查之后,发现是同一个批次中行...

    最近在写spark程序的时候遇到了hbase并发插入的问题,用sparkstreaming来接收kafka的数据,由于数据量较大,我用spark的executer端去并行插入hbase,结果发现有些数据没插进去,经过排查之后,发现是同一个批次中行键相同的数据,这些数据只能插入一部分或者都能插入,这里面存在一定的概率问题,原因就是不同的executer端会反复读写这些行键相同的数据行,导致数据不满足一致性。
    后来用checkAndPut解决了这个问题,简单说来,就是在put数据之前先经过某些条件的验证,只有满足条件的put才会入库。
    checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put) 第一个参数是行键,第二个参数是列族,第三个参数是列名,第四个参数是预期的列值,最后一个参数是put对象。

    def putsumm(rowkey:String,htable:HTableInterface,obj:ExpressPointAlloSummary): Unit ={
        var checkvalue :Array[Byte] = null
        val get = new Get(rowkey.getBytes())
        val orderd = htable.get(get)
        if (recordExist(orderd)) {
          checkvalue = getColumnValue(orderd, "brgew").getBytes()
        }
    
        var orderNumSuccess: Boolean = false
        // 循环写入数据次数
        var orderNumLoopNum: Int = 0
        while (!orderNumSuccess && orderNumLoopNum < 20) {
          val rltPut = new Put(rowkey.getBytes)
          rltPut.add(Bytes.toBytes("f"), Bytes.toBytes("fc_time"), Bytes.toBytes(obj.fc_time))
          rltPut.add(Bytes.toBytes("f"), Bytes.toBytes("site_cd"), Bytes.toBytes(obj.site_cd))
          rltPut.add(Bytes.toBytes("f"), Bytes.toBytes("dest_site"), Bytes.toBytes(obj.dest_site))
          rltPut.add(Bytes.toBytes("f"), Bytes.toBytes("brgew"), Bytes.toBytes(obj.brgew))
          rltPut.add(Bytes.toBytes("f"), Bytes.toBytes("gewei"), Bytes.toBytes(obj.gewei))
    
    
          orderNumSuccess = htable.checkAndPut(
            Bytes.toBytes(rowkey),
            Bytes.toBytes("f"),
            Bytes.toBytes("brgew"),
            checkvalue, rltPut)
          logger.info("wyk")
          orderNumLoopNum+=1
        }
        println(orderNumSuccess)
    }
    

    当然在并发超级高的时候,可能一直不满足条件,就会一直不入库,但这种概率是非常低的,可以忽略不计,为了避免陷入死循环或者循环时间太久,这里限制只循环20次,已经满足业务场景了。在这里插入代码片

    展开全文
  • 对于一张表的同一个region进行操作的时候,并发操作Hbase数据库存在等待现象。测试代码如下:List&lt;Future&lt;Boolean&gt;&gt; futs = new ArrayList&lt;&gt;();for (int w = 0; w &lt...
  • 提升HBase数据库写入性能

    千次阅读 2014-05-08 10:29:22
    这是HBase提供的一种基于MapReduce的数据导入方案,完美地绕过了HBase Client(上一节的分布式插入方法也是用mapreduce实现的,不过本质上还是用hbase client来写数据)  网上有不少文章叙述了使用命令行方式...
  • 至此,本文介绍了三种HBase数据写入的方法(1种多线程,2种mapreduce),并介绍了各类性能调优的方法。希望能对大家有所帮助。如果有大家有更好的方法,不妨留言讨论,共同进步。 原文地址: ...
  • Hbase 提高写入效率之 预分区

    千次阅读 2016-08-11 21:20:30
    背景:HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断 增加,此region已经不能承受不断增长的数据量...
  • HBase 写入流程

    2020-09-13 18:03:49
    文章目录HBase 写入流程Region写入阶段 HBase 写入流程 HBase写入流程整理分为3个阶段: 客户端处理阶段 Region写入阶段 MemStore Flush阶段 注意:用户写入请求在完成MemStore的写入后就会返回成功,MemStore ...
  • Hbase client机器(8 core + 32GB内存) 数据量:日志数据,1122MB,存储在hdfs中。 hbase rowkey为9个字节,第一个字节是hash值,后八个字节对应long型数值;value约200b。  写性能关键影响因素 1. rowkey...
  • HBase - 数据写入流程解析

    千次阅读 2018-05-10 11:57:45
    本文由 网易云 发布作者:范...当然,为了支持更高吞吐量的写入HBase还在不断地进行优化和修正,这篇文章结合0.98版本的源码全面地分析HBase写入流程,全文分为三个部分,第一部分介绍客户端的写入流程,第...
  • HBase - 数据写入流程解析

    千次阅读 2016-09-05 10:37:37
    HBase - 数据写入流程解析 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 地支撑每天10T的写入量。当然,为了支持更高吞吐量的写入HBase还在不断地...
  • 转载来自:http://hbasefly.com/2016/03/23/hbase_writer/ ...当然,为了支持更高吞吐量的写入HBase还在不断地进行优化和修正,这篇文章结合0.98版本的源码全面地分析HBase写入流程,全文分为三个部分,
  • HBase写入过快性能分析及调优

    千次阅读 2019-07-09 14:17:09
    HBase整个简单写入流程 client api ==> RPC ==> server IPC ==> RPC queue ==> RPC handler ==> write WAL ==> write memstore ==> flush to filesystem 整个写入流程从客户端调用API开始,...
  • HBase写入快的原因

    2018-10-08 13:56:00
    写入HBase写可以分为单行写和批量写: 单行写使用了void put(Put put) throws IOException方法 在创建Put对象时使用构造器: Put(byte[] row) 传入一个行键 并使用add(byte[] famliy,byte[] qualifier)...
  • Hbase并发读写优化

    千次阅读 2017-04-26 22:55:22
    淘宝搜索的个性化离线实时分析系统Pora已升级至Pora2,Pora2是在基于Yarn的流式计算框架IStream基础上开发的,同时为保证数据和消息的实时处理系统中较多地使用了Hbase,是一个典型的高并发读写HBase的分布式应用。...
  • Hbase数据读取与数据写入2.1 数据读取2.2 数据写入 HBase是一个高可靠性,高性能,面向列、可伸缩的分布式存储系统,利用HBase技术可以在廉价的PC Sever上搭建起大规模结构化存储集群。 1. 特点 海量存储,适合...
  • Hbase的数据写入

    2016-09-13 17:43:20
    多HTable并发写 创建多个HTable客户端用于写操作,提高写数据的吞吐量,一个例子:   static final Configuration conf = HBaseConfiguration.create(); static final String table_log_name = “user_log...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,920
精华内容 7,968
关键字:

hbase并发写入