Массовая загрузка с использованием встроенных задач MapReduce
Рассмотрим простейший способ, основанный на использовании встроенных утилит ImportTsv и LoadIncrementalHFiles (известной также как CompleteBulkLoad).
Шаг 1. Извлечение данных
На первом шаге необходимо подготовить образец данных и загрузить его в HDFS. Для примера используйте тестовый файл people_ages.csv. Этот файл содержит сгенерированные случайным образом имена и возрасты одной тысячи людей. Обратите внимание, что три имени дублируются — каждое из имен McGee Isabelle
, Reid Janie
и Summers Blanche
встречаются дважды. Дубликаты добавлены, чтобы продемонстрировать поведение системы в таком случае.
Выполните следующие операции:
-
Загрузите файл в свой домашний каталог на один из серверов кластера HBase. Убедитесь, что файл загружен, с помощью следующей команды:
$ ls -la ~
Вывод на экран должен содержать название загруженного файла:
total 56 drwx------. 5 dasha dasha 251 Nov 26 07:46 . drwxr-xr-x. 3 root root 19 Aug 31 11:54 .. drwx------. 3 dasha dasha 17 Aug 31 15:06 .ansible -rw-------. 1 dasha dasha 14913 Nov 25 16:07 .bash_history -rw-r--r--. 1 dasha dasha 18 Apr 1 2020 .bash_logout -rw-r--r--. 1 dasha dasha 193 Apr 1 2020 .bash_profile -rw-r--r--. 1 dasha dasha 231 Apr 1 2020 .bashrc drwxrwxrwx. 2 dasha dasha 64 Nov 26 07:45 dasha -rw-rw-r--. 1 dasha dasha 17651 Nov 26 07:46 people_ages.csv drwx------. 2 dasha dasha 29 Sep 23 17:35 .ssh
-
Создайте в HDFS каталог для своего пользователя, если такого каталога еще нет:
$ sudo -u hdfs hdfs dfs -mkdir /user/dasha $ hdfs dfs -ls /user
Пример вывода на экран:
Found 5 items drwxr-xr-x - hdfs hadoop 0 2021-11-26 09:56 /user/dasha drwx------ - hdfs hadoop 0 2021-08-31 16:15 /user/hdfs drwxr-xr-x - mapred hadoop 0 2021-08-31 16:22 /user/history drwxr-xr-x - mapred mapred 0 2021-08-31 16:21 /user/mapred drwxr-xr-x - yarn yarn 0 2021-09-01 06:57 /user/yarn
-
Расширьте права доступа на ваш каталог с помощью следующей команды (более подробная информация о защите файлов приведена в разделе Защита файлов в HDFS):
$ sudo -u hdfs hdfs dfs -chmod 777 /user/dasha $ hdfs dfs -ls /user
Пример вывода на экран:
Found 5 items drwxrwxrwx - hdfs hadoop 0 2021-11-26 09:57 /user/dasha drwx------ - hdfs hadoop 0 2021-08-31 16:15 /user/hdfs drwxr-xr-x - mapred hadoop 0 2021-08-31 16:22 /user/history drwxr-xr-x - mapred mapred 0 2021-08-31 16:21 /user/mapred drwxr-xr-x - yarn yarn 0 2021-09-01 06:57 /user/yarn
-
Скопируйте этот файл из локальной файловой системы в HDFS:
$ hdfs dfs -copyFromLocal ~/people_ages.csv /user/dasha
-
Убедитесь, что файл появился в HDFS:
$ hdfs dfs -ls /user/dasha
Пример вывода на экран:
Found 1 items -rw-r--r-- 3 dasha hadoop 17651 2021-11-26 09:57 /user/dasha/people_ages.csv
Шаг 2. Преобразование
На этом шаге необходимо создать таблицу в HBase и затем применить встроенное задание MapReduce под названием ImportTsv для преобразования загруженного файла в множество файлов формата HFile согласно структуре предварительно созданной таблицы:
-
Перейдите в интерактивный режим HBase shell:
$ hbase shell
-
Создайте таблицу
people_ages
с одним семейством колонокbasic
. Задайте четыре точки разделения данных (splits) по ключам строк на пять регионов:create 'people_ages', {NAME => 'basic', VERSIONS => 5}, {SPLITS => ['F', 'K', 'P', 'W']}
Вывод на экран:
Created table people_ages Took 1.6675 seconds => Hbase::Table - people_ages
-
Выйдите из HBase shell и запустите задание MapReduce ImportTsv:
$ hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns=HBASE_ROW_KEY,basic:age -Dimporttsv.bulk.output=test_output people_ages /user/dasha/people_ages.csv
Аргументы этой утилиты поясняет следующая таблица.
Аргументы Dimporttsv.separator
Разделитель данных в исходных данных. В этом примере им является запятая
Dimporttsv.columns
Полный перечень колонок, содержащихся в импортированном тексте. В нашем примере использование
HBASE_ROW_KEY,basic:age
означает, что первая колонка исходного текста состоит из уникальных ключей строк, а вторая содержит значения колонкиbasic:age
Dimporttsv.bulk.output
Относительный путь к каталогу HDFS, в котором требуется создать файлы в формате HFile. В нашем примере, использование
test_output
означает полный путь /user/dasha/test_outputПоследние позиции в перечне аргументов команды содержат название таблицы (
people_ages
) и путь к исходному файлу в HDFS (/user/dasha/people_ages.csv
).РЕКОМЕНДАЦИЯВходной аргумент
Dimporttsv.bulk.output
не является обязательным. Если вы не используете его, то HBase загружает данные, следуя типовой последовательности записи. Таким образом, вы можете использовать задание MapReduce ImportTsv просто для чтения файлов CSV (без выполнения последующих шагов). Однако, если необходимо загрузить данные в HFiles, надо задать этот аргумент. -
Проверьте содержимое каталога test_output:
$ hdfs dfs -ls /user/dasha/test_output
Он содержит папку basic, названную так согласно названию семейства колонок в таблице:
Found 2 items -rw-r--r-- 3 dasha hadoop 0 2021-11-26 09:59 /user/dasha/test_output/_SUCCESS drwxr-xr-x - dasha hadoop 0 2021-11-26 09:59 /user/dasha/test_output/basic
-
Проверьте содержимое папки basic:
$ hdfs dfs -ls /user/dasha/test_output/basic
Она содержит пять файлов формата HFile — один файл на регион. Эти файлы, созданные утилитой ImportTsv, содержат данные из исходного файла, отсортированные в алфавитном порядке и сохраненные в формате HFile:
Found 5 items -rw-r--r-- 3 dasha hadoop 16383 2021-11-26 09:59 /user/dasha/test_output/basic/0c17ccdbda7a465281ee063fa806ee44 -rw-r--r-- 3 dasha hadoop 15511 2021-11-26 09:59 /user/dasha/test_output/basic/13d31777206148dab3fbf3bf3c2c3ad0 -rw-r--r-- 3 dasha hadoop 14111 2021-11-26 09:59 /user/dasha/test_output/basic/5018aca2586840b5a983eff7a9b58e3f -rw-r--r-- 3 dasha hadoop 17110 2021-11-26 09:59 /user/dasha/test_output/basic/c5f4176da2764378826652cb24b6cb05 -rw-r--r-- 3 dasha hadoop 9313 2021-11-26 09:59 /user/dasha/test_output/basic/de11b176c73a4aa29133c0064c1e5d52
ПРИМЕЧАНИЕНа этом шаге данные не загружены в таблицу. Если в среде HBase shell вы исполните команду
scan
по отношению к данной таблице, она вернет пустой результат.
Шаг 3. Загрузка
На этом шаге необходимо загрузить подготовленные HFiles в таблицу HBase с помощью встроенной утилиты LoadIncrementalHFiles:
-
Предоставьте HBase право на перемещение подготовленных файлов. Для этого замените их владельца на
hbase
:$ sudo -u hdfs hdfs dfs -chown -R hbase:hbase /user/dasha/test_output
Убедитесь, что владелец каталога test_output и всех файлов в нем изменен:
$ hdfs dfs -ls /user/dasha/
Пример вывода на экран:
Found 4 items drwx------ - dasha hadoop 0 2021-11-26 09:59 /user/dasha/.staging drwxrwxrwx - dasha hadoop 0 2021-11-26 09:59 /user/dasha/hbase-staging -rw-r--r-- 3 dasha hadoop 17651 2021-11-26 09:57 /user/dasha/people_ages.csv drwxr-xr-x - hbase hbase 0 2021-11-26 09:59 /user/dasha/test_output
Владелец папки изменен, как и запланировано. Теперь проверим владельца файлов в этой папке:
$ hdfs dfs -ls /user/dasha/test_output/basic
Пример вывода на экран:
Found 5 items -rw-r--r-- 3 hbase hbase 16383 2021-11-26 09:59 /user/dasha/test_output/basic/0c17ccdbda7a465281ee063fa806ee44 -rw-r--r-- 3 hbase hbase 15511 2021-11-26 09:59 /user/dasha/test_output/basic/13d31777206148dab3fbf3bf3c2c3ad0 -rw-r--r-- 3 hbase hbase 14111 2021-11-26 09:59 /user/dasha/test_output/basic/5018aca2586840b5a983eff7a9b58e3f -rw-r--r-- 3 hbase hbase 17110 2021-11-26 09:59 /user/dasha/test_output/basic/c5f4176da2764378826652cb24b6cb05 -rw-r--r-- 3 hbase hbase 9313 2021-11-26 09:59 /user/dasha/test_output/basic/de11b176c73a4aa29133c0064c1e5d52
-
Запустите утилиту LoadIncrementalHFiles с правами пользователя
hbase
. Аргументами должны быть путь к созданному каталогу (test_output
) и название таблицы (people_ages
):$ sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/dasha/test_output people_ages
-
В среде HBase shell определите количество строк в таблице
people_ages
:count "people_ages"
Как видите, в таблице только 997 строк вместо 1000 строк в исходном файле. Причиной этого является наличие трех дублированных имен, как мы обсуждали ранее.
997 row(s) Took 0.3057 seconds => 997
ВНИМАНИЕБудьте внимательны к выбору поля исходного файла для формирования ключей строк. Значения в этом поле должны быть уникальными. Дублирование приведет к потере строк, несмотря на поддержку нескольких версий в семействе колонок.
-
Просканируйте таблицу для получения ее содержимого:
scan 'people_ages'
Первые десять строк, выведенные командой, приведены ниже:
ROW COLUMN+CELL Abbott Delia column=basic:age, timestamp=1637918350575, value=62 Abbott Howard column=basic:age, timestamp=1637918350575, value=24 Abbott Jack column=basic:age, timestamp=1637918350575, value=29 Adams Clyde column=basic:age, timestamp=1637918350575, value=29 Aguilar Myrtie column=basic:age, timestamp=1637918350575, value=23 Aguilar Terry column=basic:age, timestamp=1637918350575, value=65 Alexander Derrick column=basic:age, timestamp=1637918350575, value=46 Alexander Gregory column=basic:age, timestamp=1637918350575, value=54 Alexander Leon column=basic:age, timestamp=1637918350575, value=42 Allen Austin column=basic:age, timestamp=1637918350575, value=34
-
Проверьте распределение данных таблицы по пяти регионам, выполнив следующую команду:
list_regions 'people_ages'
Пример вывода на экран:
SERVER_NAME | REGION_NAME | START_KEY | END_KEY | SIZE | REQ | LOCALITY | -------------------------------------------------- | ------------------------------------------------------------- | ---------- | ---------- | ----- | ----- | ---------- | bds-adh-1.ru-central1.internal,16020,1637912629824 | people_ages,,1637920713477.bf509f13aa0dd59a5f4e9bcfc6cfbfab. | | F | 0 | 953 | 1.0 | bds-adh-3.ru-central1.internal,16020,1637912629738 | people_ages,F,1637920713477.b6693f3894a0feddba80ff15c06e2fbf. | F | K | 0 | 873 | 1.0 | bds-adh-3.ru-central1.internal,16020,1637912629738 | people_ages,K,1637920713477.50dcc6b90c412dab1f830a1b963d21e1. | K | P | 0 | 781 | 1.0 | bds-adh-2.ru-central1.internal,16020,1637912628845 | people_ages,P,1637920713477.80f4f1f471c9129f00d8f73701159145. | P | W | 0 | 1019 | 1.0 | bds-adh-2.ru-central1.internal,16020,1637912628845 | people_ages,W,1637920713477.ef6dfb19328842ce5c4ce883378329b0. | W | | 0 | 369 | 1.0 | 5 rows Took 0.2080 seconds hbase(main):012:0> 'people_ages' => "people_ages"
-
Для проверки наличия HFiles в HBase выйдите из HBase shell и запустите следующую команду:
$ hdfs dfs -ls /hbase/data/default/people_ages
Вывод на экран содержит пять папок, содержащих файлы в формате HFile, и две служебные папки:
Found 7 items drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/.tabledesc drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/.tmp drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/50dcc6b90c412dab1f830a1b963d21e1 drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/80f4f1f471c9129f00d8f73701159145 drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/b6693f3894a0feddba80ff15c06e2fbf drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/bf509f13aa0dd59a5f4e9bcfc6cfbfab drwxr-xr-x - hbase hbase 0 2021-11-26 09:58 /hbase/data/default/people_ages/ef6dfb19328842ce5c4ce883378329b0
Все данные HBase хранятся в каталоге HDFS /hbase/data/. Путь к файлу HFile содержит название пространства (namespace), в данном случае — default
, и название таблицы (people_ages
).