我是Hbase的新人。将数据从文本文件批量加载到Hbase时,我遇到了问题。假设我有下表:
Key_id | f1:c1 | f2:c2
row1 'a' 'b'
row1 'x' 'y'
{row1 'x' 'y'}
。以下是解释:将数据放入HBase时,需要时间戳。时间戳可以由RegionServer自动生成,也可以由您提供。时间戳必须对于给定单元的每个版本是唯一的,因为时间戳标识了版本。例如,要修改单元格的先前版本,您将为数据本身发出具有不同值的Put,但具有相同的时间戳。
我正在考虑指定时间戳的想法,但我不知道如何自动设置批量加载的时间戳,是否会影响加载性能?我需要最快速,最安全地导入大数据流程。
很多你的建议!
答案 0 :(得分:3)
Q1:Hbase使用时间戳维护版本。如果您不提供,将采用hbase系统提供的默认值。
在put请求中,如果您有此要求,也可以更新自定义时间。它不会影响性能。
Q2:你可以通过两种方式实现。
具有批处理技术的简单Java客户端如下所示。
Mapreduce importtsv(批量客户端)
Ex:#1使用批处理技术的简单Java客户端。
我在批处理列表对象100000记录中使用hbase put来解析json(类似于你的独立csv客户端)
下面是我实现此目的的代码段。解析其他格式也可以做同样的事情)
可能需要在2个地方调用此方法
1)批量为100000条记录。
2)处理提醒您的批记录小于100000
public void addRecord(final ArrayList<Put> puts, final String tableName) throws Exception {
try {
final HTable table = new HTable(HBaseConnection.getHBaseConfiguration(), getTable(tableName));
table.put(puts);
LOG.info("INSERT record[s] " + puts.size() + " to table " + tableName + " OK.");
} catch (final Throwable e) {
e.printStackTrace();
} finally {
LOG.info("Processed ---> " + puts.size());
if (puts != null) {
puts.clear();
}
}
}
注意:批量大小在内部由hbase.client.write.buffer
控制,如下所示,在您的某个配置xmls中
<property>
<name>hbase.client.write.buffer</name>
<value>20971520</value> // around 2 mb i guess
</property>
,其默认值为2mb大小。一旦你填充了缓冲区,它就会刷新所有的库存以实际插入你的表格。
此外,mapreduce客户端或独立客户端与批处理 技术。批处理由上面的缓冲区属性
控制
答案 1 :(得分:0)