Hbase客户端的写缓冲区和put列表

写缓冲区

HBase每次的put操作,都是一次rpc操作,如果某个应用程序每秒钟有1000+的put操作,那显然是不合适的。

HBase的客户端API中配置了一个写缓冲区,缓冲区负责收集put操作,达到一定条件后,调用一次rpc操作,将全部的缓冲数据发送到服务器端。

void setAutoFlush(boolean autoFlush)

boolean isAutoFlush()

默认情况下,写缓冲区是关闭的,可以通过setAutoFlush(false)来打开写缓冲区。

可以通过isAutoFlush()来判断当前写缓冲区的开关状态。

如果需要强制性的将数据发送到服务器端,可以通过:

void flushCommits() throws IOException

可以将所有缓冲的数据发送到服务器端。

每个HBase客户端默认的写缓冲区大小是2M,可以通过:

long getWriteBufferSize()

void setWriteBufferSize(long writeBufferSize) throws IOException

配置写缓冲区的大小。

2M的缓冲区一般比较合适,如果存储的是视频数据,例如是720P或者1080P的视频数据,那么数据的传输时间占了大部分的请求时间,所以此时缓冲区的作用就不大了(缓冲区的大小最好根据实际测试结果进行调整)。

缓冲区在两种情况下会flush到服务端:

①显示调用flushCommits()

②隐式flush

即在客户端调用put()或者setWriteBufferSize()时,客户端会自动比较缓冲区的大小和实际数据的大小,如果超过配置的缓冲区,那么会自动调用flushCommits()。另外调用HTable的close()操作时,也会调用flushCommits()。 

其实上面都是没用的,下面才是真正的东西.

put列表

void put(List<Put> puts) throws IOException

调用基于列表的put时,客户端会先把所有的Put实例插入到本地的写缓冲区中,然后隐式的调用flushCache()。如果共有5个Put实例,会对每个Put实例进行检查,如果第3个Put检查失败,那么前两个Put会被添加到缓冲区,后两个不会,自然也不会触发写命令。

另外,用户无法控制服务器端执行put的顺序,这意味着服务器被调用的顺序 也不受用户控制。

get列表

与put列表类似,但是当get列表中出现错误,会导致整个get()操作失败。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,125评论 2 89
  • 一、简介 Hbase:全名Hadoop DataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分...
    菜鸟小玄阅读 7,174评论 0 12
  • [TOC] 摘录一 hbase.rootdir 这个目录是region server的共享目录,用来持久化HBas...
    昨夜今夕阅读 13,862评论 1 8
  • Hbase的主要客户端接口通过org.apache.hadoop.hbase.client包中的HTable类来实...
    baboq阅读 4,442评论 0 1
  • 远方的恋人 拿起相机的男人 一开始的梦想 世界是我的,所有这份爱的深邃 就像恋人 我也一样 摆脱孤独的束缚 父亲不...
    零温度阅读 1,573评论 0 0