HBase 将数据写入,javaAPI操作
数据写入Hbase这里采用Table.put(putList) 的方式 ,数据的格式为Put类型,put方法传参既可以是一个Put对象也可以是一个List<Put>集合,集合情况下为批量入库
入库机制:类似于关系型数据库,如果是一条一条入库,则region每次都会进行一次提交;批量入库,则在数据量达到一定阈值时提交一次,在Table关闭时还会提交一次,批量入库时也可以类似与关系型数据库那样支持手动提交。
创建Put:
Put put = new Put(Bytes.toBytes(rowkey)); // 创建时需要添加RowKey
put.setDurability(durability.SKIP_WAL); // 不写WAL日志——可以视自己情况定
put.addColumn(Bytes.toBytes(ColumnFamily),Bytes.toBytes(Field), Timestamp, Bytes.toBytes(Data));
// ColumnFamily 列族名 Field 字段名 Timestamp 时间戳精确到毫秒,可以不要,数据里的timestamp为入表的时间戳,设置了就是自己设定的这个时间戳 Data 数据
可以创建多个Put,将其放入一个List<Put>集合中,进行批量入库
创建链接:
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum",zookeeperHosts);
conf.set("hbase.zookeeper.property.clientPort", zookeeperPort);
conf.set("zookeeper.znode.parent","/hbase-unsecure"); // 适用hdp集群
// 创建Connection
Connection conn = ConnectionFactory.createConnection(conf);
// 创建 Admin
Admin hbaseAdmin = conn.getAdmin();
批量入库:
public boolean put(String tablename, List<Put> putList)
{
Table table = null;
try
{
TableName tName = TableName.valueOf(tablename);
table = conn.getTable(tName);
table.put(putList); // 数据量达到某个阈值时提交,不达到不提交
return true;
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
finally
{
try
{
if(table != null)table.close(); // 提交一次
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
手动提交式批量入库:
public boolean put(String tablename, List<Put> putList)
{
BufferedMutator mutator = null;
TableName tName = TableName.valueOf(tablename);
BufferedMutatorParams params = new BufferedMutatorParams(tName);
params.writeBufferSize(5*1024*1024); // 可以自己设定阈值 5M 达到5M则提交一次
try
{
mutator = conn.getBufferedMutator(params);
mutator.mutate(putList); // 数据量达到5M时会自动提交一次
mutator,flush(); // 手动提交一次
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
finally
{
try
{
if(mutator != null)mutator.close(); // 提交一次
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
手动提交,增大数据阈值,能减少提交次数,提高入库效率