我是Hbase的新手 . 将数据从文本文件批量加载到Hbase时,我遇到了问题 . 假设我有一个下表:
Key_id | f1:c1 | f2:c2
row1 'a' 'b'
row1 'x' 'y'
- 当我解析2条记录并同时将它放入Hbase(相同的时间戳)时,只更新版本
{row1 'x' 'y'}
. 这是解释:
将数据放入HBase时,需要时间戳 . 时间戳可以由RegionServer自动生成,也可以由您提供 . 时间戳必须对于给定单元的每个版本是唯一的,因为时间戳标识了版本 . 例如,要修改单元格的先前版本,您将为数据本身发出具有不同值的Put,但具有相同的时间戳 .
我正在考虑指定时间戳的想法,但我不知道如何自动设置批量加载的时间戳,它是否会影响加载性能?我需要最快速,最安全地导入大数据流程 .
- 我试图解析并将每条记录放入表中,但速度非常慢......所以另一个问题是:在放入hbase之前,应该批量处理多少条记录/大小的数据 . (我写了一个简单的java程序 . 它比我使用Imporrtsv工具导入的速度慢得多 . 我不知道这个工具批量的确切数量..)
很多你的建议!
2 回答
Q1:Hbase使用时间戳维护版本 . 如果您不提供它将采用hbase系统提供的默认值 .
在put请求中,如果您有此要求,也可以更新自定义时间 . 它不会影响性能 .
Q2:你可以通过两种方式实现 .
具有批处理技术的简单java客户端如下所示 .
Mapreduce importtsv(批量客户端)
Ex: #1 Simple java client with batching technique.
我在批处理json的批处理列表对象中使用hbase put来解析json(类似于你的独立csv客户端)
下面是我实现此目的的代码片段 . 在解析其他格式时也可以做同样的事情)
可能是你需要在2个地方调用这个方法
1)批量为100000条记录 .
2)处理提醒您的批记录小于100000
Note : Batch size internally it is controlled by hbase.client.write.buffer like below in one of your config xmls
which has default value say 2mb size. once you buffer is filled then it will flush all puts to actually insert in to your table.
如果需要覆盖记录,可以将hbase表配置为仅记住一个版本 .
此页面说明了如何以最大可能的速度批量加载到hbase:
How to use hbase bulk loading and why