Массовая загрузка данных пары ключ-значение в HBASE

#hadoop #hbase #bigdata #nosql

#hadoop #hbase #bigdata #nosql

Вопрос:

Я оцениваю HBASE для работы с очень широким набором данных с переменным количеством столбцов в строке. В необработанном виде мои данные имеют переменный список имен параметров и значений для каждой строки. В преобразованном виде они доступны в парах ключ-значение.

Я хочу загрузить эти данные в HBASE. Очень легко перевести мои обработанные данные пары ключ-значение в отдельные операторы «put», чтобы получить данные. Однако мне нужно выполнить объемную загрузку, поскольку у меня есть 1000 столбцов и миллионы строк, что приводит к миллиардам отдельных пар ключ-значение, требующих миллиардов операторов «put». Кроме того, список столбцов (a, b, c, d, …) заранее не известен полностью. До сих пор я исследовал следующие варианты:

  • importtsv: не может использоваться, поскольку для этого требуется, чтобы данные были преобразованы из строк в столбцы заранее, с фиксированным набором известных столбцов для импорта.
  • КУСТ для генерации HFile: этот параметр также требует, чтобы имена столбцов указывались заранее и сопоставлялись каждому столбцу в таблице hive со столбцом в hbase.

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

Формат необработанных данных:

 rowkey1, {a:a1, b:b1}
rowkey2, {a:a2, c:c2}
rowkey3, {a:a3, b:b3, c:c3, d:d3}
  

формат обработанных данных:

 rowkey1, a, a1
rowkey1, b, b1
rowkey2, a, a2
rowkey2, c, c2
rowkey3, a, a3
rowkey3, b, b3
rowkey3, c, c3
rowkey3, d, d3
  

Ответ №1:

Вы почти наверняка хотите использовать M / R-задание клиента инкрементную загрузку (иначе массовую загрузку).

Общий процесс будет:

  1. Отправьте задание M / R, настроенное с помощью HFileOutputFormat.configureIncrementalLoad
  2. Сопоставьте необработанные данные и запишите их для HBase
  3. Загрузите выходные данные задания в таблицу, используя следующее:

    sudo -u hdfs hdfs dfs -chown -R hbase:hbase / путь / к / заданию / выход

    sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /path/to/job/output table-name-здесь

Есть способы выполнить загрузку с Java, но это означает олицетворение HBase. Сложная часть здесь заключается в том, чтобы убедиться, что файлы принадлежат HBase, а пользователь, выполняющий инкрементную загрузку, также является HBase. В этом сообщении в блоге Cloudera немного подробнее рассказывается об этих деталях.

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