Решения для размещения различных значений для ключа строки, но одинаковых меток времени в hbase?


Я новичок в Hbase. Я сталкиваюсь с проблемой при массовой загрузке данных из текстового файла в Hbase. Предположим, что у меня есть следующая таблица:

Key_id | f1:c1 | f2:c2
row1     'a'     'b'
row1     'x'     'y'
  1. Когда я разбираю 2 записи и помещаю их в Hbase в то же время (те же метки времени), то обновляется только версия {row1 'x' 'y'}. Вот объяснение:

Когда вы помещаете данные в HBase, требуется временная метка. Метка времени может быть автоматически сгенерирована сервером RegionServer или предоставлена вами. Отметка времени должна быть уникальна для каждой версии данной ячейки, поскольку метка времени идентифицирует версию. Чтобы изменить предыдущую версию ячейки, например, вы бы выдали Put с другим значением для самих данных, но с той же меткой времени.

Я думаю об идее, которая определяет временные метки, но я не знаю, как автоматически устанавливать временные метки для перегрузки и влияет ли это на производительность загрузки?? Мне нужен самый быстрый и безопасный процесс импорта больших данных.

  1. я пытался разбирать и складывать каждую запись в таблицу, но скорость очень и очень slow...So другой вопрос: сколько записей / размер данных должно быть в пакете, прежде чем положить в hbase. (Я пишу простую java-программу, чтобы поставить. Это гораздо медленнее, чем я использую инструмент Imporrtsv по командам для импорта. Я не знаю точно, сколько размер в партии этого инструмента..)

Много thx для вашего совета!

2 3

2 ответа:

Q1: Hbase поддерживает версии с использованием временных меток. Если вы не предоставите, он будет принимать значение по умолчанию, предоставленное системой hbase.

В запросе put вы также можете обновить пользовательское время, если у вас есть такое требование. Это не влияет на производительность.

Q2: вы можете сделать это двумя способами.

  • Простой java-клиент с технологией дозирования, показанной ниже.

  • Mapreduce importtsv (пакетный клиент)

Пример: # 1 простой java-клиент с пакетной обработкой метод.

Я использовал hbase помещает в пакетный список объекты 100000 записей для разбора 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 как показано ниже в одном из ваших конфигурационных XML

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

который имеет значение по умолчанию, скажем, размер 2 Мб. после того, как вы буфер заполнен, то он будет промывать все ставит на самом деле вставить в вашей таблице.

Кроме того, либо mapreduce клиент, либо автономный клиент с пакетом метод. дозирование контролируется указанным выше свойством буфера

Если вам нужно перезаписать запись, вы можете настроить таблицу hbase так, чтобы она запоминала только одну версию.

На этой странице объясняется, как выполнить массовую загрузку в hbase с максимально возможной скоростью:

Как использовать массовую загрузку hbase и почему