我们知道每一条put操作实际上都是一个rpc操作,它将客户端数据传送到服务器然后返回。这只是折小数据量的操作,如果有一个应用需要插入十万行数据 到Hbase表中,这样处理就太不合适了。 hbase的api配备了一个客户端的些缓冲区,缓冲区负责手机put操作,然后调用rpc一次性将put送往服务器。 下面是一个插入十万行到一个表的代码: [html] view plain copy 01.import org.apache.hadoop.conf.Configuration; 02.import org.apache.hadoop.hbase.HBaseConfiguration; 03.import org.apache.hadoop.hbase.TableName; 04.import org.apache.hadoop.hbase.client.HBaseAdmin; 05.import org.apache.hadoop.hbase.client.HTable; 06.import org.apache.hadoop.hbase.client.Put; 07.import org.apache.hadoop.hbase.util.Bytes; 08. 09.public class AddTest { 10. static Configuration conf = null; 11. static { 12. conf = HBaseConfiguration.create(); 13. 14. } 15. public static void main(String args[]){ 16. String tableName = "testtable1"; 17. String familie1 = "colfam1"; 18. String familie2 = "colfam2"; 19. String[] column = {"col-5","col-33","k"}; 20. String[] values = {"wellcome","my house","yes"}; 21. try { 22. //检查制定的表是否存在 23. 24. HBaseAdmin admin=new HBaseAdmin(conf); 25. if(!admin.tableExists(Bytes.toBytes(tableName))) 26. { 27. System.err.println("the table "+tableName+" is not exist"); 28. System.exit(1); 29. } 30. admin.close(); 31. //创建表连接 32. HTable table=new HTable(conf,TableName.valueOf(tableName)); 33. //将数据自动提交功能关闭 34. table.setAutoFlush(false); 35. //设置数据缓存区域 36. table.setWriteBufferSize(128*1024); 37. //然后开始写入数据 38. int i = 0; 39. while(i <100000){ 40. Put put=new Put(Bytes.toBytes("row"+i)); 41. put.add(Bytes.toBytes(familie1),Bytes.toBytes(column[0]),Bytes.toBytes(values[0])); 42. //put.add(Bytes.toBytes(familie2),Bytes.toBytes(column[1]),Bytes.toBytes(values[1])); 43. table.put(put); i++; 44. System.out.println(i); 45. //刷新缓存区 46. } 47. table.flushCommits(); 48. //关闭表连接 49. table.close(); 50. } catch (Exception e) { 51. // TODO: handle exception 52. e.printStackTrace(); 53. } 54. System.out.println("success"); 55. } 56. 57.} 在我的虚拟机集群中测试证明只需要几秒就可以插入十万行数据,这比单独的put语句运行十万次快多了,另外缓冲区的大小设定也会效率。