Migra datos de HBase a Bigtable

En esta página, se describen las consideraciones y los procesos para migrar datos de un clúster de Apache HBase a una instancia de Bigtable en Google Cloud.

Para migrar datos a Bigtable desde un clúster de HBase que está alojado en un servicio de Google Cloud, como Dataproc o Compute Engine, consulta Migra HBase en Google Cloud a Bigtable.

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 de uso 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.

Migra HBase a Bigtable

Para 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. Dirige operaciones de escritura a 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 independiente que tenga conectividad de red con el Namenode y 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ás 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 JAR with dependencies más reciente disponible en el repositorio de 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 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 shaded JAR más reciente disponible en el repositorio de 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. Presiona 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: 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: el directorio en tu host de HBase que contiene los datos que deseas migrar, en el formato hdfs://host1.myownpersonaldomain.com:8020/hbase.
  9. Si deseas confirmar que las variables se configuraron de forma correcta, ejecuta el comando printenv para ver todas las variables de entorno (opcional).

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: 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 los clústeres permanezcan en 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 hashes

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 consiste en 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 esquemas de Bigtable, que crea la tabla automáticamente por ti. Sin embargo, si no deseas que tu esquema de Bigtable coincida de manera exacta con el esquema de HBase, puedes crear una tabla con la herramienta de línea de comandos de cbt o la consola de Google Cloud.

La herramienta de traducción de esquemas de Bigtable captura el esquema de la tabla de HBase, incluido 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 preparado para importar y validar los 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 deseas 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: el nombre que asignaste a la instantánea de la tabla que deseas importar.

Después de ejecutar el comando, la herramienta restablece la instantánea de HBase en tu bucket de Cloud Storage y, luego, inicia el trabajo de importación. El proceso de restablecimiento de la instantánea puede tomar varios minutos en completarse según el tamaño de la instantánea.

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 la 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 de la biblioteca de compresión nativa de Hadoop. Debes tener la versión 2.30.0 o posterior del SDK de Apache Beam para usar Dataflow Runner v2 y la versión 2.3.0 o posterior de la biblioteca cliente de HBase para Java.

Para importar tablas comprimidas de Snappy, ejecuta el mismo comando que ejecutas en las tablas sin comprimir, pero agrega la siguiente opción:

    --enableSnappy=true

Valida los datos importados en Bigtable

Para validar los datos importados, debes ejecutar el trabajo sync-table. El trabajo sync-table calcula los hashes para 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.

Cuando el trabajo sync-table esté completo, abre la página Detalles del trabajo de Dataflow y revisa la sección Contadores personalizados (Custom counters) 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 (Logs), elige Registros trabajadores (Worker Logs) y filtra por Mismatch on range. 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 trabajadores 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?