#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-задание клиента инкрементную загрузку (иначе массовую загрузку).
Общий процесс будет:
- Отправьте задание M / R, настроенное с помощью
HFileOutputFormat.configureIncrementalLoad
- Сопоставьте необработанные данные и запишите их для HBase
-
Загрузите выходные данные задания в таблицу, используя следующее:
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, который, похоже, охватывает основы процесса.