Как создать копию таблицы в HBase на том же кластере? или, как обслуживать запросы, используя исходное состояние при работе в рабочем состоянии - PullRequest
3 голосов
/ 17 августа 2010

Существует ли эффективный способ создания копии структуры таблицы + данных в HBase в том же кластере? Очевидно, что таблица назначения будет иметь другое имя. Что я нашел до сих пор:

  1. Задание CopyTable, которое было описано как инструмент для копирования данных между различными кластерами HBase. Я думаю, что он будет поддерживать работу внутри кластера, но не знаю, была ли она разработана для эффективной обработки этого сценария.

  2. Используйте экспорт + импорт заданий. Это звучит как хак, но так как я новичок в HBase, может быть, это реальное решение?

Некоторые из вас могут спросить, почему я пытаюсь это сделать. Мой сценарий состоит в том, что у меня есть миллионы объектов, к которым мне нужен доступ, в состоянии «моментального снимка», если хотите. Существует ежедневный пакетный процесс, который обновляет многие из этих объектов. Если какой-либо шаг в этом пакетном процессе завершается неудачей, мне нужно иметь возможность «откатиться» до исходного состояния. Мало того, что во время пакетного процесса мне нужно иметь возможность обслуживать запросы в исходное состояние.

Таким образом, текущий процесс заключается в том, что я дублирую исходную таблицу в рабочую копию, продолжаю обслуживать запросы с использованием исходной таблицы, пока обновляю рабочую копию. Если пакетный процесс завершается успешно, я уведомляю все мои службы об использовании новой таблицы, в противном случае я просто отбрасываю новую таблицу.

Это хорошо сработало с использованием BDB, но сейчас я нахожусь в совершенно новом мире действительно больших данных, поэтому, возможно, я выбрал неправильный подход. Если у кого-то есть какие-либо предложения шаблонов, которые я должен использовать вместо этого, они более чем приветствуются. : -)

1 Ответ

1 голос
/ 28 августа 2010

Все данные в HBase имеют определенную временную метку. Вы можете выполнять чтение (Gets и Scans) с параметром, указывающим, что вы хотите использовать самую последнюю версию данных с заданной отметкой времени. Единственное, что вы могли бы сделать, - это выполнить ваши запросы к серверу для чтения ваших запросов, используя этот параметр, указывающий время до начала пакетного процесса. Как только пакет завершится, увеличьте время чтения до текущего состояния.

Пара вещей, о которых нужно быть осторожными, если вы выберете такой подход:

  • Таблицы HBase сконфигурированы для хранения самых последних N версий данной ячейки. Если вы перезапишете данные в ячейке с N более новыми значениями, то при следующем уплотнении вы потеряете старое значение. (Вы также можете настроить их на использование TTL для истечения срока действия ячеек, но это не совсем похоже на ваш случай).
  • Аналогичным образом, если вы удалите данные как часть вашего процесса, вы не сможете прочитать их после следующего сжатия.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...