首页 文章

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

提问于
浏览
3

我是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 回答

  • 0

    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

    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();
                }
            }
        }
    

    Note : Batch size internally it is controlled by hbase.client.write.buffer like below in one of your config xmls

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

    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.

    此外,使用批处理技术mapreduce客户端或独立客户端 . 批处理由上面的缓冲区属性控制

  • 3

    如果需要覆盖记录,可以将hbase表配置为仅记住一个版本 .

    此页面说明了如何以最大可能的速度批量加载到hbase:

    How to use hbase bulk loading and why

相关问题