批量数据通过java写入hbase,下面有一个小小的技巧,大大提高性能
例子:写入10000行数据
注意代码中有注释//############################ 的行,下面称之为 ”#代码“
对比加入 ”#代码“ 前后的性能
没有 ”#代码“,耗时31541ms
含有 ”#代码“,耗时2455ms
效果非常明显。
贴上代码:
import java.io.IOException;
import java.util.UUID;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
public class PerformanceComparison {
private Configuration config = null;
final private String tableName = "table_test";
public PerformanceComparison(){
config = HBaseConfiguration.create();
}
public void createTable() throws IOException{
HBaseAdmin admin = new HBaseAdmin(config);
if(admin.tableExists(tableName)){
System.out.println("table [" + tableName + "] is
exist.");
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println("delete table ["+tableName+"] ok.");
}
HTableDescriptor tableDesc = new
HTableDescriptor(tableName);
tableDesc.addFamily(new
HColumnDescriptor("fam1"));//family
tableDesc.addFamily(new
HColumnDescriptor("fam2"));//family
admin.createTable(tableDesc);
System.out.println("create table [" + tableName + "]
ok.");
}
private byte[] toByte(String input){
return (input != null) ? input.getBytes() : null;
}
public void WriteIntoTable() throws IOException{
HTable htable = new HTable(config, tableName);
htable.setAutoFlush(false);//############################
System.out.println("begin to write data into table [" +
tableName + "].");
int i = 0;
while(i < 10000){
i++;
if(i00 == 0)//############################
htable.flushCommits();//############################
String itemId = UUID.randomUUID().toString();
Put put = new Put(itemId.getBytes());
put.add(toByte("fam1"), toByte("qualifier0"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam1"), toByte("qualifier1"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam1"), toByte("qualifier2"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam1"), toByte("qualifier3"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam1"), toByte("qualifier4"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam1"), toByte("qualifier5"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam2"), toByte("qualifier6"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam2"), toByte("qualifier7"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam2"), toByte("qualifier8"),
toByte(UUID.randomUUID().toString()));
put.add(toByte("fam2"), toByte("qualifier9"),
toByte(UUID.randomUUID().toString()));
htable.put(put);
}
htable.flushCommits();//############################
}
public static void main(String[] args) {
PerformanceComparison test = new
PerformanceComparison();
try {
test.createTable();
long start = System.currentTimeMillis();
test.WriteIntoTable();
long end = System.currentTimeMillis();
System.out.println("spend:" + (end - start));
} catch (IOException e) {
e.printStackTrace();
}
}
}
生活永不停步......