1. 因为hbase的数据库是以行为原子的,所以当许多客户端需要同时修改同一行数据时就会产生问题。解决办法就是尽量使用批量处理来减少单独操作同一行数据的次数。
2. 因为在创建HTable实例的时候,会扫描.META.表,这样会很耗时,所以推荐只创建一次HTable实例,而且是每个线程创建一个,然后在客户端应用的生存期内复用这个对象。
3. 如果需要使用多个HTable实例,就要考虑使用HTablePool,他提供了一个复用多个实例的便捷方式。
put:hbase的put都是以byte的数据进行put,所以所有的数据在存储之前都要用toByte进行转换。
1. 单行put:
1.1 创建所需的配置
1.2 实例化一个新的客户端,也就是建立一个table,同时要提供table名称
1.3 新建一个put,在这个时候要提供一个rowkey,指定一行来创建一个put
1.4 在put中添加列,提供列簇名称和列的名称,“colfam1:qual1”、“colfam1:qual2”
1.5 将这一行存储到hbase表中,也就是把这个put放进table里面:table.put(put);
2. hbase配置:
2.1 hbase的conf需要提供机器集群地址:quorum
2.2 提供节点的位置信息:parent
2.3 如果使用hbasepool,还需要给定poolsize信息
这些信息可以在config文件中进行配置,这样就可以在程序启动的时候对这些基础信息进行设置。
3. 在写入的过程中可以设置时间戳,如果不设置时间戳将会调用写入系统的时候,这个时候就要保证所有机器的时间都一致,否则就会造成数据的时间戳差异。
4. 通过version可以查到同一个rowkey不同时间写入的信息。
5. 提升写入速度的方法:
5.1 Write Buffer Size
HTable htable = new HTable(config, tablename);
htable.setWriteBufferSize(6 * 1024 * 1024);
htable.setAutoFlush(false);
* 必须禁止auto flush。
* 6MB是经验值,可以上下微调以适应不同的写场景。
5.2 禁止在写得时候写WAP
5.3 减少独立RPC调用的关键是限制往返时间,另一个就是要限制传输大小,
5.4 使用tablepool进行批量写入,这样的速度就更快。
6. 写入的时候也可以用batch进行写入,batch写入的时候有两种方法:
1. void batch(list<row> action, object[] results);
2. object[] batch(list<row> action);
第一种方法可以得到部分结果,第二种方法不行。第二种方法只会返回成功或者返回null。
使用batch的方法和get(LIST<GET>)的区别是,batch直接访问服务器进行数据的写入和读取操作,但是list的方法则是会采用缓存的方式进行。