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

时间:2016-07-28 10:12:58

标签: hadoop timestamp hbase versions bulk-load

我是Hbase的新人。将数据从文本文件批量加载到Hbase时,我遇到了问题。假设我有下表:

Key_id | f1:c1 | f2:c2
row1     'a'     'b'
row1     'x'     'y'
  1. 当我解析2条记录并同时将它们放入Hbase(相同的时间戳)时,只更新版本{row1 'x' 'y'}。以下是解释:
  2.   

    将数据放入HBase时,需要时间戳。时间戳可以由RegionServer自动生成,也可以由您提供。时间戳必须对于给定单元的每个版本是唯一的,因为时间戳标识了版本。例如,要修改单元格的先前版本,您将为数据本身发出具有不同值的Put,但具有相同的时间戳。

    我正在考虑指定时间戳的想法,但我不知道如何自动设置批量加载的时间戳,是否会影响加载性能?我需要最快速,最安全地导入大数据流程。

    1. 我试图解析并将每条记录放入表中,但速度非常慢......所以另一个问题是:在放入hbase之前,应该批量处理多少条记录/大小的数据。 (我写了一个简单的java程序。比我使用Imporrtsv工具导入的速度慢得多。我不知道这个工具批量的确切尺寸..)
    2. 很多你的建议!

2 个答案:

答案 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)

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

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

How to use hbase bulk loading and why