Transferir datos de HDFS a Cloud Storage

El Servicio de transferencia de Storage admite transferencias desde fuentes del sistema de archivos distribuidos de Hadoop (HDFS) en la nube y on-premise.

Las transferencias desde HDFS deben usar Cloud Storage como destino.

Entre los casos prácticos se incluyen la migración del almacenamiento local a Cloud Storage, el archivado de datos para liberar espacio de almacenamiento local, la replicación de datos enGoogle Cloud para garantizar la continuidad de la actividad empresarial o la transferencia de datos aGoogle Cloud para analizarlos y procesarlos.

Configurar permisos

Antes de crear una transferencia, debe configurar los permisos de las siguientes entidades:

La cuenta de usuario que se usa para crear la transferencia. Esta es la cuenta con la que se ha iniciado sesión en la consola Google Cloud o la cuenta que se ha especificado al autenticar la CLI de `gcloud`. La cuenta de usuario puede ser una cuenta de usuario normal o una cuenta de servicio gestionada por el usuario.
La cuenta de servicio gestionada por Google, también conocida como agente de servicio, que usa el Servicio de transferencia de Storage. Esta cuenta se identifica generalmente por su dirección de correo, que tiene el formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.
La cuenta de agente de transferencia que proporciona Google Cloud permisos a los agentes de transferencia. Las cuentas de agente de transferencia usan las credenciales del usuario que las instala o las credenciales de una cuenta de servicio gestionada por el usuario para autenticarse.

Consulta las instrucciones en Permisos de transferencia basados en agentes.

Instalar agentes en un grupo de agentes

Las transferencias basadas en agentes usan agentes de software para coordinar las transferencias. Estos agentes deben instalarse en una o varias máquinas con acceso a tu sistema de archivos. Los agentes deben tener acceso al nodo de nombres, a todos los nodos de datos, al servidor de gestión de claves (KMS) de Hadoop y al centro de distribución de claves (KDC) de Kerberos.

Los agentes de transferencia trabajan juntos en un grupo de agentes. Aumentar el número de agentes puede mejorar el rendimiento general de los trabajos, pero esto depende de varios factores.

  • Añadir más agentes puede ayudar, hasta aproximadamente la mitad del número de nodos de tu clúster de HDFS. Por ejemplo, en un clúster de 30 nodos, aumentar el número de agentes de 5 a 15 debería mejorar el rendimiento, pero es poco probable que se note una gran diferencia si se supera esa cifra.

  • En un clúster de HDFS pequeño, puede ser suficiente con un agente.

  • Los agentes adicionales suelen tener un mayor impacto en el rendimiento cuando una transferencia incluye un gran número de archivos pequeños. El Servicio de transferencia de Storage consigue un alto rendimiento paralelizando las tareas de transferencia entre varios agentes. Cuantos más archivos haya en la carga de trabajo, más ventajas tendrá añadir más agentes.

No incluyas información sensible, como información personal identificable (IPI) o datos de seguridad, en el nombre del grupo de agentes ni en el prefijo del ID de agente. Los nombres de recursos pueden propagarse a los nombres de otros recursos de Google Cloud y pueden exponerse a sistemas internos de Google fuera de tu proyecto.

Crear un grupo de agentes

Crea un grupo de agentes. Usa tu cuenta de usuario Símbolo de la cuenta de usuario para realizar esta acción.

Instalar agentes

Instala agentes en el grupo de agentes. Usa tu cuenta de agente de transferencias para realizar esta acción.

Google Cloud consola

  1. En la Google Cloud consola, ve a la página Grupos de agentes.

    Ir a Grupos de agentes

  2. Selecciona el grupo de agentes al que quieras añadir el nuevo agente.

  3. Haz clic en Instalar agente.

  4. Sigue las instrucciones para instalar y ejecutar el agente.

    Para obtener más información sobre las opciones de línea de comandos del agente, consulta Opciones de línea de comandos del agente.

CLI de gcloud

Para instalar uno o varios agentes con gcloud CLI, ejecuta el siguiente comando: gcloud transfer agents install

gcloud transfer agents install --pool=POOL_NAME \
  --count=NUM_AGENTS \
  --mount-directories=MOUNT_DIRECTORIES \
  --hdfs-namenode-uri=HDFS_NAMENODE_URI \
  --hdfs-username=HDFS_USERNAME \
  --hdfs-data-transfer-protection=HDFS_DATA_TRANSFER_PROTECTION \
  --kerberos-config-file=KERBEROS_CONFIG_FILE \
  --kerberos-keytab-file=KERBEROS_KEYTAB_FILE \
  --kerberos-user-principal=KERBEROS_USER_PRINCIPAL \
  --kerberos-service-principal=KERBEROS_SERVICE_PRINCIPAL \

Donde:

  • --hdfs-namenode-uri especifica un clúster HDFS que incluye un esquema, un nodo de nombres y un puerto en formato URI. Por ejemplo:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

    Usa HTTP o HTTPS para WebHDFS. Si no se proporciona ningún esquema, se asume que es RPC. Si no se indica ningún puerto, el valor predeterminado es 8020 para RPC, 9870 para HTTP y 9871 para HTTPS. Por ejemplo, la entrada my-namenode se convierte en rpc://my-namenode:8020.

    Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta más información sobre los clústeres con varios nodos de nombres.

  • --hdfs-username es el nombre de usuario para conectarse a un clúster de HDFS con autenticación simple. Omite esta marca si te autenticas con Kerberos o si te conectas sin autenticación.

  • --hdfs-data-transfer-protection (opcional) es la configuración de calidad de protección (QOP) del lado del cliente para clústeres Kerberizados. El valor no puede ser más restrictivo que el valor de QOP del lado del servidor. Los valores válidos son: authentication, integrity y privacy.

Si te autenticas con Kerberos, incluye también las siguientes marcas:

  • --kerberos-config-file es la ruta a un archivo de configuración de Kerberos. Por ejemplo, --kerberos-config-file=/etc/krb5.conf.

  • --kerberos-user-principal es el principal de usuario de Kerberos que se va a usar. Por ejemplo, --kerberos-user-principal=user1.

  • --kerberos-keytab-file es la ruta a un archivo Keytab que contiene el principal de usuario especificado con la marca --kerberos-user-principal. Por ejemplo, --kerberos-keytab-file=/home/me/kerberos/user1.keytab.

  • --kerberos-service-principal es el nombre principal del servicio Kerberos que se va a usar, con el formato <primary>/<instance>. El dominio se asigna desde el archivo de configuración de Kerberos. Se ignora cualquier dominio proporcionado. Si no se especifica esta marca, el valor predeterminado es hdfs/<namenode_fqdn>, donde <namenode_fqdn> es el nombre de dominio completo especificado en el archivo de configuración.

    Por ejemplo, --kerberos-service-principal=hdfs/my-namenode.a.example.com.

La herramienta te guiará por los pasos necesarios para instalar los agentes. Este comando instala NUM_AGENTS agentes en tu máquina, asignados al nombre del grupo especificado como POOL_NAME, y autentica al agente con tus credenciales de gcloud. El nombre del grupo debe existir o se devolverá un error.

La marca --mount-directories es opcional, pero muy recomendable. Su valor es una lista separada por comas de los directorios del sistema de archivos a los que se debe conceder acceso al agente. Si se omite esta marca, se montará todo el sistema de archivos en el contenedor del agente. Consulta más información en la referencia de gcloud.

docker run

Antes de usar docker run para instalar agentes, sigue las instrucciones para instalar Docker.

El comando docker run instala un agente. Para aumentar el número de agentes de tu grupo, vuelve a ejecutar este comando tantas veces como sea necesario.

Las marcas de comando necesarias dependen del tipo de autenticación que utilices.

Kerberos

Para autenticarte en tu sistema de archivos mediante Kerberos, usa el siguiente comando:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="service_account.json" \
  --agent-pool=${AGENT_POOL_NAME} \
  --hdfs-namenode-uri=cluster-namenode \
  --kerberos-config-file=/etc/krb5.conf \
  --kerberos-user-principal=user \
  --kerberos-keytab-file=/path/to/folder.keytab

Donde:

  • --network=host debe omitirse si ejecutas más de un agente en este equipo.
  • --hdfs-namenode-uri: un esquema, un nodo de nombres y un puerto en formato URI que representa un clúster de HDFS. Por ejemplo:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

Usa HTTP o HTTPS para WebHDFS. Si no se proporciona ningún esquema, se asume que es RPC. Si no se indica ningún puerto, el valor predeterminado es 8020 para RPC, 9870 para HTTP y 9871 para HTTPS. Por ejemplo, la entrada my-namenode se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta más información sobre los clústeres con varios nodos de nombres.

  • --kerberos-config-file: ruta a un archivo de configuración de Kerberos. El valor predeterminado es /etc/krb5.conf.
  • --kerberos-user-principal: el principal de usuario de Kerberos.
  • --kerberos-keytab-file: ruta a un archivo Keytab que contiene el principal del usuario especificado con --kerberos-user-principal.
  • --kerberos-service-principal: nombre principal del servicio Kerberos que se va a usar, con el formato "servicio/instancia". El dominio se asigna desde el archivo de configuración de Kerberos. Se ignora cualquier dominio proporcionado. Si no se especifica esta marca, el valor predeterminado es hdfs/<namenode_fqdn>, donde fqdn es el nombre de dominio completo.

Autenticación simple

Para autenticarte en tu sistema de archivos mediante la autenticación simple, sigue estos pasos:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \
  --hdfs-username="${USERNAME}"

Donde:

  • --hdfs-username: nombre de usuario que se usará al conectarse a un clúster de HDFS mediante autenticación simple.
  • --hdfs-namenode-uri: un esquema, un nodo de nombres y un puerto en formato URI que representa un clúster de HDFS. Por ejemplo:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

Usa HTTP o HTTPS para WebHDFS. Si no se proporciona ningún esquema, se asume que es RPC. Si no se indica ningún puerto, el valor predeterminado es 8020 para RPC, 9870 para HTTP y 9871 para HTTPS. Por ejemplo, la entrada my-namenode se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta más información sobre los clústeres con varios nodos de nombres.

Sin autenticación

Para conectarte a tu sistema de archivos sin autenticación, sigue estos pasos:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \

Donde:

  • --hdfs-namenode-uri: un esquema, un nodo de nombres y un puerto en formato URI que representa un clúster de HDFS. Por ejemplo:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

Usa HTTP o HTTPS para WebHDFS. Si no se proporciona ningún esquema, se asume que es RPC. Si no se indica ningún puerto, el valor predeterminado es 8020 para RPC, 9870 para HTTP y 9871 para HTTPS. Por ejemplo, la entrada my-namenode se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta más información sobre los clústeres con varios nodos de nombres.

Opciones de transferencia

Las siguientes funciones del servicio de transferencia de Storage están disponibles para las transferencias de HDFS a Cloud Storage.

Los archivos transferidos desde HDFS no conservan sus metadatos.

Crear una transferencia

No incluyas información sensible, como información personal identificable (IPI) o datos de seguridad, en el nombre del trabajo de transferencia. Los nombres de recursos pueden propagarse a los nombres de otros recursos de Google Cloud y pueden exponerse a sistemas internos de Google fuera de tu proyecto.

El Servicio de transferencia de Storage ofrece varias interfaces para crear una transferencia.

Google Cloud consola

  1. Ve a la página Storage Transfer Service de la Google Cloud consola.

    Ir al Servicio de transferencia de Storage

  2. Haz clic en Crear tarea de transferencia. Se muestra la página Crear una tarea de transferencia.

  3. Seleccione Sistema de archivos distribuidos de Hadoop como Tipo de fuente. El destino debe ser Google Cloud Storage.

    Haz clic en Siguiente paso.

Configurar una base de datos de origen

  1. Especifica la información necesaria para esta transferencia:

    1. Selecciona el grupo de agentes que has configurado para esta transferencia.

    2. Introduce la ruta desde la que se va a transferir, en relación con el directorio raíz.

  2. Si quiere, puede especificar los filtros que quiera aplicar a los datos de origen.

  3. Haz clic en Siguiente paso.

Configurar el receptor

  1. En el campo Segmento o carpeta, introduce el nombre del segmento de destino y, opcionalmente, el de la carpeta. También puedes hacer clic en Examinar para seleccionar un segmento de la lista de segmentos de tu proyecto. Para crear un nuevo contenedor, haz clic en Icono de cubo Crear nuevo contenedor.

  2. Haz clic en Siguiente paso.

Programar la transferencia

Puedes programar la transferencia para que se ejecute una sola vez o configurar una transferencia periódica.

Haz clic en Siguiente paso.

Elegir la configuración de la transferencia

  1. En el campo Descripción, introduce una descripción de la transferencia. Como práctica recomendada, introduce una descripción significativa y única para poder distinguir los trabajos.

  2. En Opciones de metadatos, selecciona la clase de almacenamiento de Cloud Storage y si quieres guardar la hora de creación de cada objeto. Para obtener más información, consulta Conservación de metadatos.

  3. En Cuándo sobrescribir, seleccione una de las siguientes opciones:

    • Nunca: no sobrescribir los archivos de destino. Si ya existe un archivo con el mismo nombre, no se transferirá.

    • Si es diferente: sobrescribe los archivos de destino si el archivo de origen con el mismo nombre tiene valores de ETag o de suma de comprobación diferentes.

    • Siempre: siempre sobrescribe los archivos de destino cuando el archivo de origen tiene el mismo nombre, aunque sean idénticos.

  4. En Cuándo eliminar, selecciona una de las siguientes opciones:

    • Nunca: no elimina nunca los archivos del origen ni del destino.

    • Eliminar los archivos en el destino si tampoco están en el origen: si los archivos del segmento de Cloud Storage de destino no están en el origen, elimínelos del segmento de Cloud Storage.

      Esta opción asegura que el segmento de destino de Cloud Storage coincida exactamente con el de origen.

  5. Seleccione si quiere habilitar el registro de transferencias o las notificaciones de Pub/Sub.

Haz clic en Crear para crear la tarea de transferencia.

CLI de gcloud

Para crear una tarea de transferencia, usa el comando gcloud transfer jobs create. Al crear una tarea, se inicia la transferencia especificada, a menos que se indique una programación o un --do-not-run.

gcloud transfer jobs create \
  hdfs:///PATH/ gs://BUCKET_NAME/PATH/
  --source-agent-pool=AGENT_POOL_NAME

Donde:

  • PATH es una ruta absoluta desde la raíz del clúster de HDFS. El nombre y el puerto del nodo de nombres del clúster se configuran a nivel de agente, por lo que el comando de creación de la tarea solo necesita especificar la ruta (opcional) y el grupo de agentes.

  • --source-agent-pool especifica el grupo de agentes de origen que se usará para esta transferencia.

Entre las opciones adicionales se incluyen:

  • --do-not-run impide que el Servicio de transferencia de Storage ejecute el trabajo al enviar el comando. Para ejecutar el trabajo, actualízalo para añadir una programación o usa jobs run para iniciarlo manualmente.

  • --manifest-file especifica la ruta a un archivo CSV de Cloud Storage que contiene una lista de archivos que se van a transferir desde la fuente. Para obtener información sobre el formato del archivo de manifiesto, consulta el artículo Transferir archivos u objetos específicos mediante un manifiesto.

  • Información del trabajo: puedes especificar --name y --description.

  • Programación: especifica --schedule-starts, --schedule-repeats-every y --schedule-repeats-until, o --do-not-run.

  • Condiciones de los objetos: usa condiciones para determinar qué objetos se transfieren. Entre ellas se incluyen --include-prefixes y --exclude-prefixes, así como las condiciones basadas en el tiempo de --include-modified-[before | after]-[absolute | relative]. Si has especificado una carpeta con tu fuente, los filtros de prefijo se aplican a esa carpeta. Para obtener más información, consulta Filtrar objetos de origen por prefijo.

  • Opciones de transferencia: especifique si quiere sobrescribir los archivos de destino (--overwrite-when=different o always) y si quiere eliminar determinados archivos durante o después de la transferencia (--delete-from=destination-if-unique o source-after-transfer). También puede definir una clase de almacenamiento para los objetos transferidos (--custom-storage-class).

  • Notificaciones: configura las notificaciones de Pub/Sub para las transferencias con --notification-pubsub-topic, --notification-event-types y --notification-payload-format.

Para ver todas las opciones, ejecuta gcloud transfer jobs create --help o consulta la documentación de referencia de gcloud.

API REST

Para crear una transferencia desde una fuente HDFS mediante la API REST, crea un objeto JSON similar al siguiente ejemplo.

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  ...
  "transferSpec": {
    "source_agent_pool_name":"POOL_NAME",
    "hdfsDataSource": {
      "path": "/mount"
    },
    "gcsDataSink": {
      "bucketName": "SINK_NAME"
    },
    "transferOptions": {
      "deleteObjectsFromSourceAfterTransfer": false
    }
  }
}

Consulta la referencia de transferJobs.create para obtener información sobre los campos admitidos adicionales.

Clústeres con varios nodos de nombres

Los agentes del Servicio de transferencia de Storage solo se pueden configurar con un único nodo de nombres. Si tu clúster de HDFS está configurado con varios nodos de nombres ("alta disponibilidad") y se produce una conmutación por error que da como resultado un nuevo nodo de nombres principal, debes volver a instalar tus agentes con el nodo de nombres correcto.

Para eliminar los agentes antiguos, consulta Eliminar un agente.

Puedes obtener el namenode activo de tu clúster ejecutando el siguiente comando:

hdfs haadmin -getAllServiceState