hadoop—在hbase中为行键设置不同值但时间戳相同的解决方案?

jexiocij  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(452)

我是hbase的新员工。将文本文件中的数据批量加载到hbase时,我遇到了一个问题。假设我有下表:

Key_id | f1:c1 | f2:c2
row1     'a'     'b'
row1     'x'     'y'

当我解析2条记录并同时将其放入hbase(相同的时间戳)时,只有版本 {row1 'x' 'y'} 已更新。解释如下:
将数据放入hbase时,需要时间戳。时间戳可以由regionserver自动生成,也可以由您提供。时间戳对于给定单元格的每个版本都必须是唯一的,因为时间戳标识了版本。例如,要修改单元格的早期版本,您需要为数据本身发出一个具有不同值但时间戳相同的put。
我在考虑指定时间戳的想法,但我不知道如何为批量加载自动设置时间戳,这会影响加载性能吗??我需要最快和安全的大数据导入过程。
我试图解析每个记录并将其放入表中,但是速度非常慢…所以另一个问题是:在放入hbase之前,应该批处理多少记录/数据大小(我写了一个简单的java程序来放。它比我使用importsv工具通过命令导入要慢得多。我不知道这个工具的批量大小…)
谢谢你的建议!

mo49yndu

mo49yndu1#

q1:hbase使用时间戳维护版本。如果您不提供它将采取默认提供的hbase系统。
在put请求中,如果您有这样的要求,也可以更新自定义时间。它不会影响性能。
问题2:你可以用两种方法来做。
简单的java客户机和批处理技术如下所示。
mapreduce importtsv(批处理客户端)
例如:#1个带有批处理技术的简单java客户机。
我使用hbase放入100000条记录的批处理列表对象来解析json(类似于您的独立csv客户机)
下面是我实现这一点的代码片段。在解析其他格式时也可以做同样的事情)
可能你需要在两个地方调用这个方法
1) 一批10万条记录。
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 如下面的一个配置XML中所示

<property>
         <name>hbase.client.write.buffer</name>
         <value>20971520</value> // around 2 mb i guess
 </property>

它的默认值是2mb大小。一旦您的缓冲区被填满,那么它将刷新所有的put以实际插入到您的表中。
此外,mapreduce客户机或单机客户机都可以使用批处理技术。批处理由上述缓冲区属性控制

bihw5rsg

bihw5rsg2#

如果需要覆盖记录,可以将hbase表配置为只记住一个版本。
本页介绍如何以最大可能的速度批量加载到hbase:
如何使用hbase批量加载及其原因

相关问题