Migra datos de HBase a Cloud Bigtable

En este artículo se describen las consideraciones que se deben tener en cuenta y los procesos para migrar datos desde un clúster de Apache HBase hasta una instancia de Cloud Bigtable en Google Cloud.

Antes de comenzar con esta migración, debes tener en cuenta las implicaciones de rendimiento, el diseño del esquema de Bigtable, las implicaciones de tu método de autenticación y autorización, y el conjunto de atributos de Bigtable.

Consideraciones previas a la migración

En esta sección, se sugieren algunos aspectos que se deben revisar y considerar antes de comenzar la migración.

Rendimiento

En una carga de trabajo típica, Bigtable ofrece rendimiento muy predecible. Antes de migrar los datos, asegúrate de comprender los factores que afectan el rendimiento de Bigtable.

Diseño de esquema de Bigtable

En la mayoría de los casos, puedes usar el mismo diseño de esquema en Bigtable que en HBase. Si deseas cambiar tu esquema o si tu caso práctico está cambiando, revisa los conceptos presentados en Diseña tu esquema antes de migrar tus datos.

Autenticación y autorización

Antes de diseñar el control de acceso para Bigtable, revisa los procesos existentes de autenticación y autorización de HBase.

Bigtable usa los mecanismos estándar de Google Cloud para la autenticación y administración de identidades y accesos a fin de proporcionar control de acceso, por lo que puedes convertir tu autorización existente de HBase en IAM. Puedes asignar los grupos existentes de Hadoop que proporcionan mecanismos de control de acceso para HBase a diferentes cuentas de servicio.

Bigtable te permite controlar el acceso a nivel de proyecto, instancia y tabla. Para obtener más información, consulta Control de acceso.

Migración de HBase a Bigtable

Si deseas migrar tus datos de HBase a Bigtable, debes exportar una instantánea de HBase para cada tabla a Cloud Storage y, luego, importar los datos a Bigtable. Estos pasos son para un solo clúster de HBase y se describen en detalle en las siguientes secciones.

  1. Deja de enviar operaciones de escritura a tu clúster de HBase.
  2. Toma instantáneas de las tablas del clúster de HBase.
  3. Exporta los archivos de instantáneas a Cloud Storage.
  4. Calcula los hash y expórtalos a Cloud Storage.
  5. Crea tablas de destino en Bigtable.
  6. Importa los datos de HBase de Cloud Storage a Bigtable
  7. Validar los datos importados
  8. Enrutamiento de operaciones de escritura en Bigtable

Antes de comenzar

  1. Crea un bucket de Cloud Storage para almacenar tus instantáneas. Crea el bucket en la misma ubicación en la que planeas ejecutar tu trabajo de Dataflow.

  2. Crea una instancia de Bigtable para almacenar tus tablas nuevas.

  3. Identifica el clúster de Hadoop que exportas. Puedes ejecutar los trabajos para tu migración directamente en el clúster de HBase o en un clúster de Hadoop separado que tenga conectividad de red con el Namenode y los Datanodes del clúster de HBase.

  4. Instala y configura el conector de Cloud Storage en cada nodo del clúster de Hadoop y en el host desde el que se inicia el trabajo. Para obtener más detalles sobre los pasos de instalación, consulta Instala el conector de Cloud Storage.

  5. Abre un shell de comandos en un host que pueda conectarse a tu clúster de HBase y a tu proyecto de Bigtable. Allí es donde completará los siguientes pasos.

  6. Obtén la herramienta de traducción de esquema:

    wget BIGTABLE_HBASE_TOOLS_URL
    

    Reemplaza BIGTABLE_HBASE_TOOLS_URL por la URL de la JAR with dependencies más reciente disponible en el repositorio Maven de la herramienta. El nombre del archivo es similar a https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/1.24.0/bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar.

    Para encontrar la URL o descargar el archivo JAR de forma manual, haz lo siguiente:

    1. Ir al repositorio.
    2. Haz clic en el número de versión más reciente.
    3. Identifica el JAR with dependencies file (por lo general, en la parte superior).
    4. Haz clic con el botón derecho y copia la URL, o haz clic para descargar el archivo.
  7. Obtén la herramienta de importación:

    wget BIGTABLE_BEAM_IMPORT_URL
    

    Reemplaza BIGTABLE_BEAM_IMPORT_URL por la URL de la shaded JAR más reciente disponible en el repositorio Maven de la herramienta. El nombre del archivo es similar a https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-beam-import/1.24.0/bigtable-beam-import-1.24.0-shaded.jar.

    Para encontrar la URL o descargar el archivo JAR de forma manual, haz lo siguiente:

    1. Ir al repositorio.
    2. Haz clic en el número de versión más reciente.
    3. Haz clic en Descargas.
    4. Mueve el mouse sobre shaded.jar.
    5. Haz clic con el botón derecho y copia la URL, o haz clic para descargar el archivo.
  8. Configura las siguientes variables de entorno:

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export INSTANCE_ID=INSTANCE_ID
    export REGION=REGION
    export CLUSTER_NUM_NODES=CLUSTER_NUM_NODES
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export IMPORT_JAR=IMPORT_JAR
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export MIGRATION_DESTINATION_DIRECTORY="$BUCKET_NAME/hbase-migration-snap"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_DIRECTORY=MIGRATION_SOURCE_DIRECTORY
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El proyecto de Google Cloud en el que se encuentra tu instancia
    • INSTANCE_ID: El identificador de la instancia de Bigtable a la que deseas importar tus datos
    • REGION: Es una región que contiene uno de los clústeres en tu instancia de Bigtable. Ejemplo: northamerica-northeast2
    • CLUSTER_NUM_NODES: La cantidad de nodos en tu instancia de Bigtable
    • TRANSLATE_JAR: El nombre y el número de versión del archivo JAR bigtable hbase tools que descargaste de Maven. El valor debe ser similar a bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar.
    • IMPORT_JAR: El nombre y el número de versión del archivo JAR bigtable-beam-import que descargaste de Maven. El valor debe ser similar a bigtable-beam-import-1.24.0-shaded.jar.
    • BUCKET_NAME: Es el nombre del bucket de Cloud Storage en el que almacenas las instantáneas.
    • ZOOKEEPER_QUORUM: El host del zookeeper al que se conectará la herramienta, en el formato host1.myownpersonaldomain.com
    • MIGRATION_SOURCE_DIRECTORY: Es el directorio en tu host de HBase que contiene los datos que deseas migrar, en el formato hdfs://host1.myownpersonaldomain.com:8020/hbase.
  9. (Opcional) Para confirmar que las variables se configuraron de forma correcta, ejecuta el comando printenv a fin de ver todas las variables de entorno.

Deja de enviar operaciones de escritura a HBase

Antes de tomar instantáneas de las tablas de HBase, deja de enviar operaciones de escritura al clúster de HBase.

Toma instantáneas de tablas de HBase

Cuando tu clúster de HBase ya no transfiera datos, toma una instantánea de cada tabla que planees migrar a Bigtable.

Al principio, una instantánea tiene una huella de almacenamiento mínima en el clúster de HBase, pero con el tiempo puede crecer al mismo tamaño que la tabla original. La instantánea no consume ningún recurso de CPU.

Ejecuta el siguiente comando para cada tabla con un nombre único para cada instantánea:

echo "snapshot 'TABLE_NAME', 'SNAPSHOT_NAME'" | hbase shell -n

Reemplaza lo siguiente:

  • TABLE_NAME: El nombre de la tabla de HBase desde la que exportas los datos.
  • SNAPSHOT_NAME: Es el nombre de la instantánea nueva.

Exporta las instantáneas de HBase a Cloud Storage

Después de crear las instantáneas, debes exportarlas. Cuando ejecutas trabajos de exportación en un clúster de HBase de producción, supervisa el clúster y otros recursos de HBase para asegurarte de que permanezcan en un buen estado.

Para cada instantánea que desees exportar, ejecuta el siguiente comando:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT -snapshot SNAPSHOT_NAME \
    -copy-from $MIGRATION_SOURCE_DIRECTORY \
    -copy-to $MIGRATION_DESTINATION_DIRECTORY/data

Reemplaza SNAPSHOT_NAME por el nombre de la instantánea que deseas exportar.

Procesamiento y exportación de hash

A continuación, crea hashes para usar en la validación una vez que se complete la migración. HashTable es una herramienta de validación proporcionada por HBase que calcula hashes para rangos de filas y los exporta a archivos. Puedes ejecutar un trabajo de sync-table en la tabla de destino para hacer coincidir los hashes y ganar confianza en la integridad de los datos migrados.

Ejecuta el siguiente comando para cada tabla que exportaste:

hbase org.apache.hadoop.hbase.mapreduce.HashTable --batchsize=32000 --numhashfiles=20 \
TABLE_NAME $MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME

Reemplaza lo siguiente:

  • TABLE_NAME: El nombre de la tabla de HBase para la que creaste y exportaste una instantánea

Crea tablas de destino

El paso siguiente es crear una tabla de destino en tu instancia de Bigtable para cada instantánea que exportaste. Usa una cuenta que tenga permiso bigtable.tables.create para la instancia.

En esta guía, se usa la herramienta de traducción de esquema de Cloud Bigtable, que crea la tabla de forma automática. Sin embargo, si no quieres que tu esquema de Bigtable coincida con exactitud con el esquema de HBase, puedes crear una tabla con la herramienta de línea de comandos de cbt o Google Cloud Console.

La herramienta de traducción de esquemas de Cloud Bigtable captura el esquema de la tabla de HBase, incluidos el nombre de la tabla, las familias de columnas, las políticas de recolección de elementos no utilizados y las divisiones. Luego, crea una tabla similar en Bigtable.

En cada tabla que desees importar, ejecuta el siguiente comando para copiar el esquema de HBase en Bigtable.

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$INSTANCE_ID \
 -Dgoogle.bigtable.table.filter=TABLE_NAME \
 -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
 -Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
 -jar $TRANSLATE_JAR

Reemplaza TABLE_NAME por el nombre de la tabla de HBase que deseas importar. La herramienta de traducción de esquemas usa este nombre para tu nueva tabla de Bigtable.

De manera opcional, puedes reemplazar TABLE_NAME por una expresión regular, como “.*”, que capture todas las tablas que deseas crear y, luego, ejecutará el comando solo una vez.

Importa los datos de HBase a Bigtable con Dataflow

Una vez que tengas una tabla lista para migrar tus datos, estarás listo para importar y validar tus datos.

Tablas sin comprimir

Si tus tablas de HBase no están comprimidas, ejecuta el siguiente comando para cada tabla que desees migrar:

java -jar $IMPORT_JAR importsnapshot \
    --runner=DataflowRunner \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --hbaseSnapshotSourceDir=$MIGRATION_DESTINATION_DIRECTORY/data \
    --snapshotName=SNAPSHOT_NAME \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/staging \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/temp \
    --maxNumWorkers=$(expr 3 \* $CLUSTER_NUM_NODES) \
    --region=$REGION

Reemplaza lo siguiente:

  • TABLE_NAME: El nombre de la tabla de HBase que se importará. La herramienta de traducción de esquemas usa este nombre para tu tabla de Bigtable nueva. No se admiten nombres de tabla nuevos.
  • SNAPSHOT_NAME: Es el nombre que asignaste a la instantánea de la tabla que deseas importar.

Ten en cuenta las siguientes sugerencias cuando importes:

  • Para mejorar el rendimiento de la carga de datos, asegúrate de establecer maxNumWorkers. Este valor ayuda a garantizar que el trabajo de importación tenga suficiente capacidad de procesamiento a fin de completar las tareas en un período razonable, pero no tanto como para que sobrecargue la instancia de Bigtable.
    • Si no usas la instancia de Bigtable para otra carga de trabajo, multiplica la cantidad de nodos en tu instancia de Bigtable por 3 y usa esa cantidad para maxNumWorkers.
    • Si usas la instancia para otra carga de trabajo al mismo tiempo que importas tus datos de HBase, reduce el valor de maxNumWorkers de forma adecuada.
  • Usa el tipo predeterminado de trabajador.
  • Durante la importación, debes supervisar el uso de la CPU de la instancia de Bigtable. Si el uso de CPU en la instancia de Bigtable es demasiado alto, es posible que debas agregar nodos adicionales. Puede tomar hasta 20 minutos que el clúster proporcione el beneficio de rendimiento de nodos adicionales.

Para obtener más información sobre la supervisión de la instancia de Bigtable, consulta Supervisión de una instancia de Bigtable.

Tablas comprimidas de Snappy

Si importas tablas comprimidas de Snappy, debes usar una imagen de contenedor personalizada en la canalización de Dataflow. La imagen de contenedor personalizada que usas para importar datos comprimidos a Bigtable proporciona compatibilidad con la biblioteca de compresión nativa de Hadoop. Debes tener la versión 2.30.0 o superior del SDK de Apache Beam para usar Dataflow Runner v2.

Para importar tablas comprimidas de Snappy, ejecuta el mismo comando que ejecutas en las tablas sin comprimir, pero agrega las siguientes dos opciones:

    --experiments=use_runner_v2 \
    --sdkContainerImage=gcr.io/cloud-bigtable-ecosystem/unified-harness:latest

Valida los datos importados en Bigtable

Para validar los datos importados, debes ejecutar el trabajo sync-table. El trabajo sync-table calcula los hash de los rangos de filas en Bigtable y, luego, los hace coincidir con el resultado de HashTable que calculaste antes.

Para ejecutar el trabajo sync-table, ejecuta lo siguiente en el shell del comando:

java -jar $IMPORT_JAR sync-table  \
    --runner=dataflow \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --outputPrefix=$MIGRATION_DESTINATION_DIRECTORY/sync-table/output-TABLE_NAME-$(date +"%s") \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/staging \
    --hashTableOutputDir=$MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/dataflow-test/temp \
    --region=$REGION

Reemplaza TABLE_NAME por el nombre de la tabla de HBase que deseas importar. La herramienta de traducción de esquemas usa este nombre para tu nueva tabla de Bigtable.

Cuando el trabajo de sync-table esté completo, abre la página Detalles del trabajo de Dataflow y revisa la sección Contadores personalizados del trabajo. Si el trabajo de importación importa con éxito todos los datos, el valor de ranges_matched tiene un valor y el valor de ranges_not_matched es 0

Contadores personalizados de Dataflow

Si ranges_not_matched muestra un valor, abre la página Registros, elige Registros de trabajadores y filtra por Coincidencias el rango. El resultado procesable de estos registros se almacena en Cloud Storage en el destino de salida que creas en la opción outputPrefix con tabla sincronizada.

Registros de trabajador de Dataflow

Puedes volver a intentar el trabajo de importación o escribir una secuencia de comandos para leer los archivos de salida a fin de determinar dónde se produjeron las discrepancias. Cada línea del archivo de salida es un registro JSON serializado de un rango que no coincide.

Dirige operaciones de escritura a Bigtable

Después de validar los datos de cada tabla del clúster, puedes configurar tus aplicaciones para enrutar todo su tráfico a Bigtable y, luego, dar de baja la instancia de HBase.

Cuando se complete la migración, puedes borrar las instantáneas en la instancia de HBase.

¿Qué sigue?