写缓冲区
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()操作失败。