Migra datos de HBase a Bigtable

En este artículo, se describen consideraciones y procesos para migrar los datos de un clúster de Apache HBase a un clúster de Bigtable en Google Cloud (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.

Implicaciones de rendimiento

En una carga de trabajo típica, Bigtable ofrece rendimiento muy predecible. Cuando todo funciona sin problemas, se puede esperar lograr el rendimiento siguiente para cada nodo en tu clúster Bigtable, según el tipo de almacenamiento que use tu clúster.

Tipo de almacenamiento Lecturas   Escrituras Análisis
SSD 10,000 filas por segundo a 6 ms o 10,000 filas por segundo a 6 ms 220 MB/s
HDD 500 filas por segundo a 200 ms o 10,000 filas por segundo a 50 ms 180 MB/s

Las estimaciones que se muestran en la lista se basan en filas que contienen 1 KB de datos. También reflejan una carga de trabajo de solo lectura o solo escritura. El rendimiento para una carga de trabajo combinada de lecturas y escrituras puede variar.

Estos números de rendimiento son solo para guiarte, no son reglas estrictas. El rendimiento por nodo puede variar según tu carga de trabajo y el tamaño de valor típico de una solicitud o una respuesta. Para obtener más información, consulta Información sobre el rendimiento de Bigtable .

Diseño de esquema de Bigtable

Diseñar un esquema de Bigtable no es como diseñar un esquema para una base de datos relacional. Antes de diseñar tu esquema, revisa los conceptos que se presentan en Diseño de tu esquema.

También debes mantener el esquema por debajo de los límites de tamaño recomendados. Como guía, mantén filas individuales por debajo de 100 MB y valores individuales por debajo de 10 MB. Puede haber situaciones en las que debas almacenar valores grandes. El almacenamiento de valores grandes puede afectar el rendimiento, ya que extraerlos requiere tiempo y memoria. Evalúa esas situaciones caso por caso.

Autenticación y autorización

Antes de diseñar el control de acceso para Bigtable, revise 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 Cloud Identity and Access Management a fin de proporcionar control de acceso, por lo que conviertes tu autorización existente de HBase en Cloud IAM. Puedes asignar los grupos existentes de Hadoop que proporcionan mecanismos de control de acceso para HBase a diferentes cuentas de servicio.

Si bien Bigtable te permite controlar el acceso a nivel de la instancia, no proporciona un control detallado a nivel de la tabla. Una forma de proporcionar un nivel de detalle a nivel de la tabla es agrupar las tablas que tienen patrones de acceso similares en una instancia de Bigtable. Sin embargo, este método podría implicar que necesitarás usar varias instancias de Bigtable para migrar todas tus tablas.

Para obtener más información, consulta Control de acceso.

Migración de HBase a Bigtable

Para migrar sus datos de HBase a Bigtable, debes exportar los datos como una serie de archivos de secuencia de Hadoop. Este es un formato de archivo que usa HBase que consta de pares clave-valor binarios.

Para migrar la tabla HBase a Bigtable, sigue estos pasos:

  1. Recoge detalles de HBase.
  2. Exporta tablas de HBase a archivos de secuencia.
  3. Mueve los archivos de secuencia a Cloud Storage.
  4. Importa los archivos de secuencia a Bigtable con Dataflow.
  5. Valida el movimiento.

Planea la migración: recoge detalles de HBase

A fin de prepararte para la migración, recopila la información siguiente del clúster de HBase existente, ya que la necesitarás para crear la tabla de destino.

  • Lista de tablas
  • Recuentos de filas
  • Recuentos de celdas
  • Detalles de la familia de columnas (incluidos el tiempo de actividad y la cantidad máxima de versiones, entre otros)

Una forma fácil de recopilar estos detalles en una tabla de origen es usar la secuencia de comandos siguiente que deja el resultado en HDFS:

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

Exporta la tabla de HBase a Cloud Storage

Cuando sepas los conceptos básicos de las tablas de HBase que se van a migrar, debes exportar la tabla a los archivos de secuencia y moverlos a Cloud Storage. Antes de realizar acciones para migrar datos en línea, ejecuta los pasos siguientes a fin de asegurarte de que tu clúster cumpla con los requisitos previos y poder acceder a Google Cloud:

  • Instala el conector de Cloud Storage

    Si quieres migrar datos en línea con distcp, instala y configura el conector de Cloud Storage. Primero, identifica el sistema de archivos de HDFS que administra los datos que quieres migrar. Luego determina qué nodo de cliente en tu clúster de Hadoop tiene acceso a este sistema de archivos. Por último, instala el conector en el nodo de cliente. Para obtener más detalles sobre los pasos de instalación, consulta Instala el conector de Cloud Storage.

  • Instala el SDK de Cloud

    Para migrar datos con distcp o gsutil, instala el SDK de Cloud en el nodo cliente del clúster de Hadoop donde se iniciará la migración. Para obtener más detalles sobre los pasos de instalación, consulta la documentación del SDK de Cloud.

Exporta la tabla de HBase a HDFS

Después exporta la tabla de HBase que deseas migrar a alguna parte de tu clúster de Hadoop. Supongamos que el nombre de tu tabla de HBase es [MY_NEW_TABLE]. El directorio de destino está en tu directorio de usuarios en HDFS. Exporta la tabla de HBase como archivos de secuencia con los comandos siguientes:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
cd ${HBASE_HOME}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export my-new-table \
    /user/hbase-${TABLENAME} \
    -export ${MAXVERSIONS}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -DRAW_SCAN=true \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

Migra los archivos de secuencia de HDFS a Cloud Storage

El paso siguiente es mover los archivos de secuencia a un depósito de Cloud Storage. En función del tamaño de los datos, la cantidad de archivos, la fuente de datos y el ancho de banda disponible, puedes elegir la opción adecuada para mover los archivos de secuencia a Cloud Storage: Transfer Appliance, distcp, gsutil, o Servicio de transferencia de almacenamiento.

Usa Transfer Appliance

Usa Transfer Appliance para migrar tus datos cuando suceda lo siguiente:

  • En caso de que quieras controlar el ancho de banda saliente de forma programada
  • Cuando el tamaño de los datos sea mayor a 20 TB

Con esta opción, no necesitas comprar ni aprovisionar una red adicional con Google. Cuando el tiempo de transferencia de extremo a extremo (tiempo de envío del dispositivo, rehidratación, etc.) promedia los 100 Mbps.

Para mover datos con Transfer Appliance, copia los archivos de secuencia y, luego, envía el dispositivo a Google. Google carga los datos en Google Cloud. Para obtener más información, consulta la documentación de Transfer Appliance.

Usa distcp

Usa distcp para migrar tus datos cuando ocurra lo siguiente:

  • Cuando haya más de 100 Mbps de ancho de banda disponibles para la migración.
  • El conector de Cloud Storage y el SDK de Cloud se pueden instalar en el entorno de origen de Hadoop.
  • La administración de un trabajo de Hadoop nuevo para realizar la migración de datos es aceptable.
  • Cuando el tamaño de los datos sea menor que 20 TB.

Para mover datos con distcp, usa tu nodo cliente del clúster de Hadoop configurado con el conector de Cloud Storage para enviar un trabajo de MapReduce a fin de copiar los archivos de secuencia en Cloud Storage:

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

Usa gsutil

Usa gsutil para migrar tus datos cuando ocurra lo siguiente:

  • Cuando haya más de 100 Mbps de ancho de banda disponibles para la migración.
  • El SDK de Cloud se puede instalar en el entorno de origen de Hadoop.
  • La administración de un trabajo de Hadoop nuevo para realizar la migración de datos no es aceptable.
  • Cuando el tamaño de los datos sea menor que 10 TB.

Para mover datos con gsutil, usa tu nodo cliente del clúster de Hadoop a fin de iniciar la migración de datos:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

Usa el Servicio de transferencia de almacenamiento

Usa el Servicio de transferencia de almacenamiento para migrar tus datos cuando suceda lo siguiente:

  • Cuando tu fuente de datos sea un depósito de Amazon S3, una ubicación HTTP/HTTPS o un depósito de Cloud Storage.
  • Cuando el tamaño de los datos sea menor que 10 TB.

El Servicio de transferencia de almacenamiento tiene opciones que facilitan las transferencias de datos y la sincronización entre las fuentes de datos y los receptores de datos. Por ejemplo, puedes hacer lo siguiente:

  • Programar operaciones de transferencia únicas o, también, operaciones de transferencia recurrentes.
  • Borrar objetos existentes en el depósito de destino si no tienen un objeto correspondiente en la fuente
  • Borrar los objetos de la fuente después de transferirlos
  • Programar una sincronización periódica desde la fuente de datos hasta el receptor de datos con filtros avanzados según las fechas de creación de archivos, los filtros de nombres de archivos y el momento del día en el que prefieres importar los datos

Para obtener más información, consulta esta documentación sobre el Servicio de transferencia de almacenamiento.

Crea la tabla de destino

El paso siguiente es crear la tabla de destino en Bigtable.

En primer lugar, debes usar la herramienta de línea de comandos de gcloud para instalar la herramienta cliente de Bigtable cbt.

gcloud components update
gcloud components install cbt

A continuación, crearás una tabla en Bigtable con las familias de columnas adecuadas de tu esfuerzo de descubrimiento anterior.

Con las divisiones existentes, realiza una división previa de la tabla de destino a medida que la creas. Esto mejorará el rendimiento de la carga masiva.

Por ejemplo, si notas que las divisiones existentes son las que se muestran a continuación:

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

Configura un proyecto predeterminado y una instancia de Bigtable para la herramienta cbt destinada a tu cuenta de usuario de esta manera:

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

Crea las divisiones siguientes en la tabla de destino:

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

Crea familias de columnas en la tabla de destino para que coincidan con las que encontraste antes. Por ejemplo, si descubriste que hay dos familias de columnas, cf1 y cf2, crea la familia de columnas cf1 en Bigtable de esta manera:

cbt createfamily my-new-table cf1

Crea la familia de columnas cf2 de la manera siguiente:

cbt createfamily my-new-table cf2

Después de crear las familias de columnas, es importante actualizar la política de recolección de elementos no utilizados de cada familia de columnas, incluida la antigüedad máxima y la cantidad máxima de versiones para los valores de esa familia de columnas. Debes hacer esto incluso si usaste la configuración predeterminada de HBase para tu tabla de HBase, porque las herramientas nativas de Bigtable usan una configuración predeterminada diferente a la de HBase.

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

Importa los datos de HBase a Bigtable con Dataflow

Hay dos formas de importar datos a Bigtable. Consulta Importa archivos de secuencia en los documentos de Bigtable para obtener más información.

Recuerda las sugerencias siguientes:

  • Para mejorar el rendimiento de la carga de datos, asegúrate de establecer maxNumWorkers. Este valor ayuda a asegurar 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 el clúster de Bigtable.

  • Durante la importación, debes supervisar el uso de la CPU del clúster de Bigtable. En la sección de uso de CPU del documento de supervisión de Bigtable, se proporciona más información sobre este tema. Si el uso de CPU en el clúster de Bigtable es demasiado alto, es posible que debas agregar nodos adicionales. El clúster puede tardar hasta 20 minutos en proporcionar 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.

Verifica los datos importados en Bigtable

Para validar los datos importados, puedes usar algunas verificaciones diferentes:

  • Verifica la coincidencia del recuento de filas. El trabajo de Dataflow informará el recuento total de filas. Este valor debe coincidir con el recuento de filas de la tabla de origen de HBase.
  • Verifica rápido con las búsquedas de filas específicas. Puedes elegir un conjunto de claves de filas específico de la tabla de origen y buscarlo en la tabla de destino para asegurarte de que coincidan:
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

Próximos pasos

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Cómo migrar Hadoop a GCP