如何在hbase中快速插入10万条数据

时间:2022-11-28 23:27:33
 我们知道每一条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语句运行十万次快多了,另外缓冲区的大小设定也会效率。