Transferencias de HDFS a Cloud Storage

El Servicio de transferencia de almacenamiento admite transferencias desde fuentes de sistemas de archivos distribuidos por Hadoop (HDFS) locales y en la nube.

Las transferencias desde HDFS deben usar Cloud Storage como destino.

Entre los casos de uso, se incluye migrar del almacenamiento local a Cloud Storage, archivar datos para liberar espacio de almacenamiento local, replicar datos en Google Cloud para la continuidad empresarial o transferir datos a Google Cloud para su análisis y procesamiento.

Configura permisos

Antes de crear una transferencia, debes 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 accediste a la consola de Google Cloud o la que se especifica cuando se realiza la autenticación en la CLI de "gcloud". La cuenta de usuario puede ser una cuenta de usuario normal o una cuenta de servicio administrada por el usuario.
La cuenta de servicio administrada por Google, también conocida como agente de servicio, que usa el Servicio de transferencia de almacenamiento. Por lo general, esta cuenta se identifica por su dirección de correo electrónico, que usa el formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.
La cuenta de agente de transferencia que proporciona permisos de Google Cloud para 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 administrada por el usuario para autenticarse.

Consulta Permisos de transferencia basados en agentes para obtener instrucciones.

Instala agentes en un grupo de agentes

Las transferencias basadas en agentes usan agentes de software para organizar las transferencias. Estos agentes se deben instalar en una o más máquinas con acceso al sistema de archivos. Los agentes deben tener acceso al nombre del nodo, a todos los nodos de datos, al servidor de administración de claves de Hadoop (KMS) y al centro de distribución de claves de Kerberos (KDC).

Los agentes de transferencia trabajan juntos en un grupo de agentes. Aumentar la cantidad de agentes puede mejorar el rendimiento general de la tarea, pero esto depende de varios factores.

  • Agregar más agentes puede ayudar, hasta aproximadamente la mitad de la cantidad de nodos en tu clúster de HDFS. Por ejemplo, con un clúster de 30 nodos, aumentar de 5 a 15 agentes debería mejorar el rendimiento, pero es poco probable que más de 15 agentes marquen una gran diferencia.

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

  • Los agentes adicionales suelen tener un mayor impacto en el rendimiento cuando una transferencia incluye una gran cantidad de archivos pequeños. El Servicio de transferencia de almacenamiento logra una alta productividad paralelizando las tareas de transferencia entre varios agentes. Cuantos más archivos haya en la carga de trabajo, más beneficios se obtendrán si se agregan más agentes.

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

Crea un grupo de agentes

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

Instalar agentes

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

Consola de Google Cloud

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

    Ir a los grupos de agentes

  2. Selecciona el grupo de agentes al que deseas agregar el agente nuevo.

  3. Haz clic en Instalar agente.

  4. Sigue las instrucciones que se muestran 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 más agentes mediante la CLI de gcloud, ejecuta 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 \

Aquí:

  • --hdfs-namenode-uri especifica un clúster de HDFS que incluye un esquema, un nombre de nodo 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 un esquema, suponemos que es RPC. Si no se proporciona un 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 nombres de nodos, especifica el nodo principal actual. Consulta Clústeres con varios nombres de nodos para obtener más información.

  • --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 ninguna autenticación.

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

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

  • --kerberos-config-file es la ruta de acceso 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 usará. Por ejemplo, --kerberos-user-principal=user1.

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

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

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

La herramienta te guía a través de los pasos necesarios para instalar los agentes. Con este comando, se instalan NUM_AGENTS agentes en tu máquina, asignados al nombre del grupo especificado como POOL_NAME, y autentica al agente con tus credenciales gcloud. El nombre del grupo debe existir o se mostrará un error.

La marca --mount-directories es opcional, pero se recomienda usarla. Su valor es una lista separada por comas de directorios en el sistema de archivos a los que se le otorgará acceso al agente. Si omites esta marca, se activará todo el sistema de archivos en el contenedor del agente. Consulta la referencia de gcloud para obtener más detalles.

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 la cantidad de agentes en tu grupo, vuelve a ejecutar este comando tantas veces como sea necesario.

Las marcas de comando requeridas dependen del tipo de autenticación que uses.

Kerberos

Para autenticar en tu sistema de archivos con 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

Aquí:

  • Se debe omitir --network=host si ejecutas más de un agente en esta máquina.
  • --hdfs-namenode-uri: Un esquema, un nombre de nodo 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 un esquema, suponemos que es RPC. Si no se proporciona un 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 nombres de nodos, especifica el nodo principal actual. Consulta Clústeres con varios nombres de nodos para obtener más información.

  • --kerberos-config-file: Es la ruta de acceso 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: Es la ruta de acceso a un archivo Keytab que contiene el usuario principal especificado con --kerberos-user-principal.
  • --kerberos-service-principal: Es el principal de servicio de Kerberos que se usará, del formato "service/instance". El dominio se asigna desde tu 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 completamente calificado.

Autenticación simple

Para autenticarte en tu sistema de archivos con 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}"

Aquí:

  • --hdfs-username: Es el nombre de usuario que se usará cuando te conectes a un clúster de HDFS con autenticación simple.
  • --hdfs-namenode-uri: Un esquema, un nombre de nodo 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 un esquema, suponemos que es RPC. Si no se proporciona 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 nombres de nodos, especifica el nodo principal actual. Consulta Clústeres con varios nombres de nodos para obtener más información.

Sin autorización

Para conectarte a tu sistema de archivos sin autenticación, haz lo siguiente:

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 \

Aquí:

  • --hdfs-namenode-uri: Un esquema, un nombre de nodo 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 un esquema, suponemos que es RPC. Si no se proporciona 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 nombres de nodos, especifica el nodo principal actual. Consulta Clústeres con varios nombres de nodos para obtener más información.

Opciones de transferencia

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

Los archivos transferidos desde HDFS no retienen sus metadatos.

Crear una transferencia

No incluyas información sensible, como información de identificación personal (PII) ni datos de seguridad en el nombre de la tarea de transferencia. Los nombres de los recursos se pueden propagar 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 almacenamiento proporciona varias interfaces a través de las cuales crear una transferencia.

Consola de Google Cloud

  1. Ve a la página Servicio de transferencia de almacenamiento en la consola de Google Cloud.

    Ir al Servicio de transferencia de almacenamiento

  2. Haz clic en Crear trabajo de transferencia. Se muestra la página Crea un trabajo de transferencia.

  3. Selecciona Sistema de archivos distribuido de Hadoop como el Tipo de fuente. El destino debe ser Google Cloud Storage.

    Haz clic en Próximo paso.

Configura la fuente

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

    1. Selecciona el grupo de agentes que configuraste para esta transferencia.

    2. Ingresa la ruta de acceso desde la que deseas transferir, en relación con el directorio raíz.

  2. De manera opcional, especifica los filtros que se aplicarán a los datos de origen.

  3. Haz clic en Próximo paso.

Configura tu sink

  1. En el campo Bucket o carpeta, ingresa el bucket de destino y el nombre de la carpeta (opcional) o haz clic en Explorar para seleccionar un bucket de una lista de buckets existentes en tu proyecto actual. Para crear un bucket nuevo, haz clic en Ícono de bucket Crear bucket nuevo.

  2. Haz clic en Próximo paso.

Programa la transferencia

Puedes programar la transferencia para que se ejecute solo una vez o configurar una transferencia recurrente.

Haz clic en Próximo paso.

Elige la configuración de transferencia

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

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

  3. En Cuándo reemplazar, selecciona una de las siguientes opciones:

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

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

    • Siempre: Siempre escribe archivos de destino cuando el archivo de origen tiene el mismo nombre, incluso si son idénticos.

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

    • Nunca: Nunca borres archivos de origen o de destino.

    • Borra los archivos del destino si no están también en el origen: Si los archivos en el bucket de Cloud Storage de destino no están también en el origen, borra los archivos del bucket de Cloud Storage.

      Esta opción garantiza que el bucket de destino de Cloud Storage coincida exactamente con tu fuente.

  5. Selecciona si deseas habilitar el registro de transferencias o las notificaciones de Pub/Sub.

Haz clic en Crear para crear el trabajo de transferencia.

gcloud CLI

Para crear un nuevo trabajo de transferencia, usa el comando gcloud transfer jobs create. La creación de un trabajo nuevo inicia la transferencia especificada, a menos que se especifique un programa o --do-not-run.

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

Aquí:

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

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

Las opciones adicionales incluyen:

  • --do-not-run evita que el Servicio de transferencia de almacenamiento ejecute el trabajo cuando se envía el comando. Si deseas ejecutar el trabajo, actualízalo para agregar una programación o usa jobs run a fin de iniciarlo de forma manual.

  • --manifest-file especifica la ruta a un archivo CSV en Cloud Storage, que contiene una lista de archivos para transferir de tu fuente. Para formatear archivos de manifiesto, consulta Transfiere archivos o objetos específicos con un manifiesto.

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

  • Programa: Especifica --schedule-starts, --schedule-repeats-every, y --schedule-repeats-until o --do-not-run.

  • Condiciones de objetos: Usa condiciones para determinar qué objetos se transfieren. Estos incluyen --include-prefixes y --exclude-prefixes, y las condiciones basadas en el tiempo en --include-modified-[before | after]-[absolute | relative]. Si especificaste una carpeta con tu fuente, los filtros de prefijo son relativos a esa carpeta. Consulta Filtra objetos de origen por prefijo para obtener más información.

  • Opciones de transferencia: Especifica si deseas reemplazar los archivos de destino (--overwrite-when=different o always) y si deseas borrar ciertos archivos durante o después de la transferencia (--delete-from=destination-if-unique o source-after-transfer). De manera opcional, puedes configurar una clase de almacenamiento en los objetos transferidos (--custom-storage-class).

  • Notificaciones: Configura las notificaciones de Pub/Sub para 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 de REST

Para crear una transferencia desde una fuente de HDFS con la API de 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 detalles sobre los campos compatibles adicionales.

Clústeres con varios nombres de nodos

Los agentes del Servicio de transferencia de almacenamiento solo se pueden configurar con un solo nodo de nombres. Si tu clúster de HDFS está configurado con varios nombres de nodos ("alta disponibilidad") y hay un evento de conmutación por error que genera un nuevo nombre de nodo principal, debes reinstalar tus agentes con el nombre de nodo correcto.

Para borrar los agentes anteriores, consulta Cómo borrar un agente.

Para recuperar el nombre activo de tu clúster, ejecuta lo siguiente:

hdfs haadmin -getAllServiceState