Поделиться через


Настройка резервного копирования и репликации Apache HBase и Apache Phoenix в HDInsight

Apache HBase поддерживает несколько способов защиты от потери данных:

  • копирование папки hbase;
  • Экспорт и импорт
  • Копирование таблиц
  • Моментальные снимки
  • Репликация

Примечание.

Apache Phoenix хранит метаданные в таблицах HBase. За счет этого при резервном копировании таблиц системного каталога HBase также создаются резервные копии метаданных.

В разделах ниже описаны сценарии использования каждого из этих подходов.

Копирование папки hbase

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

HBase в HDInsight использует хранилище по умолчанию, выбранное при создании кластера. Это могут быть большие двоичные объекты службы хранилища Azure или Azure Data Lake Storage. В любом случае HBase хранит файлы данных и метаданных по следующему пути:

/hbase

  • В учетной записи hbase служба хранилища Azure папка находится в корне контейнера BLOB-объектов:

    wasbs://<containername>@<accountname>.blob.core.windows.net/hbase

  • В Azure Data Lake Storage папка hbase находится по корневому пути, указанному во время подготовки кластера. Обычно этот путь к корневому каталогу имеет папку clusters с вложенной папкой, имя которой совпадает с кластером HDInsight:

    /clusters/<clusterName>/hbase

В любом случае папка hbase содержит все данные, записываемые HBase на диск. Однако в ней могут отсутствовать данные, размещенные в памяти. Чтобы можно было полагаться на эту папку как на точное представление данных HBase, необходимо завершить работу кластера.

После удаления кластера данные можно оставить в стандартном расположении или скопировать в новое:

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

  • Скопируйте папку hbase в другой контейнер больших двоичных объектов службы хранилища Azure или другое расположение Data Lake Storage, а затем запустите новый кластер с этими данными. Для службы хранилища Azure используйте служебную программу AzCopy, а для Data Lake Storage — AdlCopy.

Экспорт и импорт

В исходном кластере HDInsight экспортируйте данные из исходной таблицы в подключенное хранилище по умолчанию с помощью служебной программы экспорта (поставляемой с HBase). Затем скопируйте экспортированную папку в целевое место хранения и запустите служебную программу импорта в целевом кластере HDInsight.

Чтобы экспортировать данные таблицы, сперва подключитесь к головному узлу исходного кластера HDInsight по протоколу SSH, а затем выполните следующую команду hbase:

hbase org.apache.hadoop.hbase.mapreduce.Export "<tableName>" "/<path>/<to>/<export>"

Каталог экспорта не должен существовать. В имени таблицы учитывается регистр.

Чтобы импортировать данные таблицы, подключитесь к головному узлу целевого кластера HDInsight по протоколу SSH, а затем выполните следующую команду hbase:

hbase org.apache.hadoop.hbase.mapreduce.Import "<tableName>" "/<path>/<to>/<export>"

Таблица должна существовать.

Укажите полный путь экспорта в хранилище по умолчанию или любое подключенное хранилище. Например, в службе хранилища Azure:

wasbs://<containername>@<accountname>.blob.core.windows.net/<path>

В Azure Data Lake Storage 2-го поколения используется следующий синтаксис.

abfs://<containername>@<accountname>.dfs.core.windows.net/<path>

В Azure Data Lake Storage 1-го поколения используется следующий синтаксис.

adl://<accountName>.azuredatalakestore.net:443/<path>

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

hbase org.apache.hadoop.hbase.mapreduce.Export "<tableName>" "/<path>/<to>/<export>" <numberOfVersions> <startTimeInMS> <endTimeInMS>

Необходимо указать количество версий каждой строки для экспорта. Чтобы включить все версии в диапазон дат, задайте параметру <numberOfVersions> значение, превышающее максимально возможное число версий строк, например 100 000.

Копирование таблиц

Служебная программа CopyTable копирует данные из исходной таблицы (построчно) в существующую целевую таблицу с той же схемой. Целевая таблица может находиться в том же или другом кластере HBase. В именах таблиц учитывается регистр букв.

Чтобы использовать CopyTable в кластере, подключитесь к головному узлу исходного кластера HDInsight по протоколу SSH, а затем выполните следующую команду hbase:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=<destTableName> <srcTableName>

Чтобы скопировать таблицу в другой кластер с помощью CopyTable, добавьте параметр peer с адресом целевого кластера:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=<destTableName> --peer.adr=<destinationAddress> <srcTableName>

Адрес назначения состоит из следующих трех частей:

<destinationAddress> = <ZooKeeperQuorum>:<Port>:<ZnodeParent>

  • <ZooKeeperQuorum> — это список полных доменных имен узлов Apache ZooKeeper, разделенный запятыми, например:

    <zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername2>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername3>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net

  • По умолчанию параметр <Port> в HDInsight имеет значение 2181, а <ZnodeParent>/hbase-unsecure. Поэтому полный параметр <destinationAddress> выглядит так:

    <zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername2>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername3>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net:2181:/hbase-unsecure

Сведения о том, как получить эти значения кластера HDInsight, см. в разделе Сбор списка кворума Apache ZooKeeper вручную.

Служебная программа CopyTable также поддерживает параметры, которые позволяют указать диапазон времени копируемых строк и подмножество семейств столбцов в копируемой таблице. Чтобы просмотреть полный список поддерживаемых параметров, запустите CopyTable без параметров:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable

CopyTable сканирует все содержимое исходной таблицы, которое нужно скопировать в целевую таблицу. Это может привести к снижению производительности кластера HBase.

Примечание.

Автоматизировать копирование данных между таблицами можно с помощью скрипта hdi_copy_table.sh в репозитории со служебными программами HBase Azure в GitHub.

Сбор списка кворума Apache ZooKeeper вручную

Когда оба кластера HDInsight находятся в той же виртуальной сети, как описано выше, разрешение имен внутренних узлов выполняется автоматически. Чтобы использовать CopyTable в кластерах HDInsight, расположенных в двух отдельных виртуальных сетях, подключенных через VPN-шлюз, необходимо указать IP-адреса узлов Zookeeper в кворуме.

Чтобы получить имена узлов кворума, выполните следующую команду cURL:

curl -u admin:<password> -X GET -H "X-Requested-By: ambari" "https://<clusterName>.azurehdinsight.net/api/v1/clusters/<clusterName>/configurations?type=hbase-site&tag=TOPOLOGY_RESOLVED" | grep "hbase.zookeeper.quorum"

Команда curl извлекает документ JSON с сведениями о конфигурации HBase, а grep команда возвращает только запись hbase.zookeeper.quorum, например:

"hbase.zookeeper.quorum" : "<zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername2>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername3>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net"

Значение имен узлов кворума — это вся строка после двоеточия.

Чтобы получить IP-адреса этих узлов, выполните следующую команду cURL в каждом узле из предыдущего списка:

curl -u admin:<password> -X GET -H "X-Requested-By: ambari" "https://<clusterName>.azurehdinsight.net/api/v1/clusters/<clusterName>/hosts/<zookeeperHostFullName>" | grep "ip"

В этой команде cURL <zookeeperHostFullName> —это полное DNS-имя узла ZooKeeper, как показано в этом примере: <zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net. Выходные данные этой команды содержат IP-адрес указанного узла, например:

100 "ip" : "10.0.0.9",

Собрав IP-адреса всех узлов ZooKeeper в кворуме, перестройте целевой адрес:

<destinationAddress> = <Host_1_IP>,<Host_2_IP>,<Host_3_IP>:<Port>:<ZnodeParent>

В нашем примере:

<destinationAddress> = 10.0.0.9,10.0.0.8,10.0.0.12:2181:/hbase-unsecure

Моментальные снимки

Моментальные снимки позволяют создавать резервные копии данных в хранилище HBase на определенный момент времени. Они имеют минимальные издержки и создаются в течение нескольких секунд. Во время этой операции, которая, по сути, является операцией с метаданными, записываются имена всех файлов, сохраненных на этот момент в хранилище. При создании моментального снимка фактические данные не копируются. Моментальные снимки зависят от постоянных данных, хранящихся в HDFS, где операции обновления, удаления и вставки представляют собой новые данные. Вы можете восстановить (клонировать) моментальный снимок в том же кластере или экспортировать его в другой кластер.

Чтобы создать моментальный снимок, подключитесь к головному узлу кластера HDInsight HBase по протоколу SSH и запустите оболочку hbase:

hbase shell

В оболочке hbase используйте команду создания моментального снимка, указав имена таблицы и этого моментального снимка:

snapshot '<tableName>', '<snapshotName>'

Чтобы в оболочке hbase восстановить моментальный снимок по имени, сначала отключите таблицу, а затем восстановите моментальный снимок и повторно включите таблицу:

disable '<tableName>'
restore_snapshot '<snapshotName>'
enable '<tableName>'

Чтобы восстановить моментальный снимок в новую таблицу, используйте команду clone_snapshot:

clone_snapshot '<snapshotName>', '<newTableName>'

Чтобы экспортировать моментальный снимок в HDFS, где его будет использовать другой кластер, сначала создайте моментальный снимок, как описано выше, и воспользуйтесь служебной программой ExportSnapshot. Запустите эту программу из сеанса SSH на головном узле, а не в оболочке hbase:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot <snapshotName> -copy-to <hdfsHBaseLocation>

В качестве значения параметра <hdfsHBaseLocation> можно указать любое место хранения, поддерживаемое исходным кластером. Кроме того, это значение должно указывать на папку hbase, используемую целевым кластером. Например, если к исходному кластеру подключена дополнительная учетная запись службы хранилища Azure и эта учетная запись предоставляет доступ к контейнеру, используемому по умолчанию хранилищем целевого кластера, используйте следующую команду:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 'Snapshot1' -copy-to 'wasbs://secondcluster@myaccount.blob.core.windows.net/hbase'

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

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -Dfs.azure.account.key.myaccount.blob.core.windows.net=mykey -snapshot 'Snapshot1' -copy-to 'wasbs://secondcluster@myaccount.blob.core.windows.net/hbase'

Если целевой кластер является кластером ADLS 2-го поколения, измените предыдущую команду, чтобы она подходила для соответствующих конфигураций:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -Dfs.azure.account.key.<account_name>.dfs.core.windows.net=<key> -Dfs.azure.account.auth.type.<account_name>.dfs.core.windows.net=SharedKey -Dfs.azure.always.use.https.<account_name>.dfs.core.windows.net=false -Dfs.azure.account.keyprovider.<account_name>.dfs.core.windows.net=org.apache.hadoop.fs.azurebfs.services.SimpleKeyProvider -snapshot 'Snapshot1' -copy-to 'abfs://<container>@<account_name>.dfs.core.windows.net/hbase'

После экспорта моментального снимка подключитесь к головному узлу целевого кластера по протоколу SSH и восстановите этот моментальный снимок с помощью команды clone_snapshot, как описано выше.

Моментальные снимки предоставляют полную резервную копию таблицы на момент выполнения команды snapshot. Они не обеспечивают возможность создавать добавочные моментальные снимки в промежутках времени или указывать группы семейств столбцов, которые можно включить в моментальный снимок.

Репликация

Во время репликации HBase транзакции из исходного кластера автоматически передаются в целевой кластер. При этом используется асинхронный механизм с минимальными издержками в исходном кластере. В HDInsight репликацию можно настроить между кластерами, где:

  • исходный и целевой кластеры расположены в одной виртуальной сети;
  • исходный и целевой кластеры расположены в разных виртуальных сетях, соединенных VPN-шлюзом, но при этом находятся в одном географическом расположении;
  • исходный и целевой кластеры расположены в разных виртуальных сетях, соединенных VPN-шлюзом, и находятся в разных географических расположениях.

Вот основные шаги по настройке репликации:

  1. В исходном кластере создайте таблицы и заполните их данными.
  2. В целевом кластере создайте пустые целевые таблицы со схемой исходной таблицы.
  3. Зарегистрируйте целевой кластер как кэширующий узел в исходном кластере.
  4. Включите репликацию в нужных исходных таблицах.
  5. Скопируйте имеющиеся данные из исходных таблиц в целевые.
  6. Репликация автоматически копирует новые измененные данные в исходные таблицы в целевых таблицах.

Чтобы включить репликацию в HDInsight, примените действие скрипта к выполняющемуся исходному кластеру HDInsight. Пошаговые инструкции по включению репликации в кластере или настройке репликации в образцах кластеров, созданных в виртуальных сетях с помощью шаблонов Azure Resource Manager, см. в статье о настройке репликации Apache HBase. Эта статья также содержит инструкции по включению репликации метаданных Phoenix.

Следующие шаги