Массовая загрузка с использованием встроенных задач MapReduce

Рассмотрим простейший способ, основанный на использовании встроенных утилит ImportTsv и LoadIncrementalHFiles (известной также как CompleteBulkLoad).

Шаг 1. Извлечение данных

На первом шаге необходимо подготовить образец данных и загрузить его в HDFS. Для примера используйте тестовый файл people_ages.csv. Этот файл содержит сгенерированные случайным образом имена и возрасты одной тысячи людей. Обратите внимание, что три имени дублируются — каждое из имен McGee Isabelle, Reid Janie и Summers Blanche встречаются дважды. Дубликаты добавлены, чтобы продемонстрировать поведение системы в таком случае.

Выполните следующие операции:

  1. Загрузите файл в свой домашний каталог на один из серверов кластера 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
  2. Создайте в 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
  3. Расширьте права доступа на ваш каталог с помощью следующей команды (более подробная информация о защите файлов приведена в разделе Защита файлов в 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
  4. Скопируйте этот файл из локальной файловой системы в HDFS:

    $ hdfs dfs -copyFromLocal ~/people_ages.csv /user/dasha
  5. Убедитесь, что файл появился в 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 согласно структуре предварительно созданной таблицы:

  1. Перейдите в интерактивный режим HBase shell:

    $ hbase shell
  2. Создайте таблицу 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
  3. Выйдите из 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, надо задать этот аргумент.

  4. Проверьте содержимое каталога 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
  5. Проверьте содержимое папки 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:

  1. Предоставьте 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
  2. Запустите утилиту LoadIncrementalHFiles с правами пользователя hbase. Аргументами должны быть путь к созданному каталогу (test_output) и название таблицы (people_ages):

    $ sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/dasha/test_output people_ages
  3. В среде HBase shell определите количество строк в таблице people_ages:

    count "people_ages"

    Как видите, в таблице только 997 строк вместо 1000 строк в исходном файле. Причиной этого является наличие трех дублированных имен, как мы обсуждали ранее.

    997 row(s)
    Took 0.3057 seconds
    => 997
    ВНИМАНИЕ

    Будьте внимательны к выбору поля исходного файла для формирования ключей строк. Значения в этом поле должны быть уникальными. Дублирование приведет к потере строк, несмотря на поддержку нескольких версий в семействе колонок.

  4. Просканируйте таблицу для получения ее содержимого:

    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
  5. Проверьте распределение данных таблицы по пяти регионам, выполнив следующую команду:

    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"
  6. Для проверки наличия 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).

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней