Transferencia de HDFS a Cloud Storage

El Servicio de transferencia de almacenamiento admite transferencias desde fuentes en la nube y del sistema de archivos distribuidos de Hadoop (HDFS) local.

Las transferencias desde HDFS deben usar Cloud Storage como destino.

Los casos de uso 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 en Google Cloud para la continuidad del negocio o la transferencia de datos a Google Cloud para su análisis y procesamiento.

Configura permisos

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

La cuenta de usuario que se usa para crear la transferencia. Esta es la cuenta con la que se accedió a la consola de Google Cloud o la cuenta que se especifica cuando se autentica 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 el 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 del 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 deben instalarse 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 datanode, al servidor de administración de claves (KMS) de Hadoop y al centro de distribución de claves (KDC) de Kerberos.

Los agentes de transferencia trabajan en conjunto en un grupo de agentes. El aumento de la cantidad de agentes puede incrementar el rendimiento general de los trabajos, 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 no haga una gran diferencia.

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

  • Los agentes adicionales tienden a 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 capacidad de procesamiento mediante la paralelización de las tareas de transferencia entre varios agentes. Cuantos más archivos haya en la carga de trabajo, más beneficios será agregar más agentes.

No incluyas información sensible, como información de identificación personal (PII) o datos de seguridad en el nombre del grupo de agentes o el prefijo de ID del 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 del proyecto.

Crea un grupo de agentes

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

Instalar agentes

Instala agentes en el grupo de agentes. Usa tu cuenta de agente de transferencia para realizar 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.

gcloud CLI

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 HDFS que incluye un esquema, un nodo de nombre y un puerto en formato de URI. Por ejemplo:

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

    Usa HTTP o HTTPS para WebHDFS. Si no se proporciona un esquema, suponemos 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 my-namenode de entrada se convierte en rpc://my-namenode:8020.

    Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta Clústeres con varios nodos de nombre para obtener más información.

  • --hdfs-username es el nombre de usuario para conectarse a un clúster de HDFS con una autenticación simple. Omite esta marca si 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 cliente para clústeres kerberizados. 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 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 la 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 la principal de usuario especificada 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á, con el formato <primary>/<instance>. El dominio se asigna a partir de 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>, en el que <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 es muy recomendable. Su valor es una lista de directorios separados por comas en el sistema de archivos al que se le otorga acceso al agente. Si omites esta marca, se activa 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 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 estás ejecutando más de un agente en esta máquina.
  • --hdfs-namenode-uri: Es un esquema, un nodo de nombre y un puerto, en formato de 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 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 my-namenode de entrada se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta Clústeres con varios nodos de nombre para obtener más información.

  • --kerberos-config-file: Ruta a un archivo de configuración de Kerberos. El valor predeterminado es /etc/krb5.conf.
  • --kerberos-user-principal: La principal del usuario de Kerberos.
  • --kerberos-keytab-file: Ruta de acceso a un archivo Keytab que contiene la principal de usuario especificada con --kerberos-user-principal.
  • --kerberos-service-principal: Es el principal del servicio de Kerberos que se usará, con el formato “servicio/instancia”. El dominio se asigna a partir de 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>, en el que fqdn es el nombre de dominio completamente calificado.

Autenticación simple

Para autenticarte en tu sistema de archivos mediante la autenticación simple, 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 \
  --hdfs-username="${USERNAME}"

Aquí:

  • --hdfs-username: Es el nombre de usuario que se usará cuando se conecte a un clúster de HDFS con una autenticación simple.
  • --hdfs-namenode-uri: Es un esquema, un nodo de nombre y un puerto, en formato de 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 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 my-namenode de entrada se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta Clústeres con varios nodos de nombre para obtener más información.

Sin autenticació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: Es un esquema, un nodo de nombre y un puerto, en formato de 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 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 my-namenode de entrada se convierte en rpc://my-namenode:8020.

Si tu clúster está configurado con varios namenodes, especifica el nodo principal actual. Consulta Clústeres con varios nodos de nombre para obtener más información.

Opciones de transferencia

Las siguientes funciones del Servicio de transferencia de almacenamiento están disponibles para 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 de identificación personal (PII) o datos de seguridad, en el nombre de tu 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 del proyecto.

El Servicio de transferencia de almacenamiento proporciona múltiples interfaces para 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. En Tipo de fuente, selecciona Hadoop Distributed File System. El destino debe ser Google Cloud Storage.

    Haz clic en Próximo paso.

Configura la fuente

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

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

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

  2. De manera opcional, especifica cualquier filtro para aplicar a los datos de origen.

  3. Haz clic en Próximo paso.

Configura tu receptor

  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.

Programar la transferencia

Puedes programar tu transferencia para que se ejecute una sola 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 Preservación de metadatos para obtener más detalles.

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

    • Never: No reemplace 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 transferencia 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 nodo y el puerto del clúster se configuran a nivel del agente, por lo que el comando de creación del trabajo solo necesita 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 relacionados con esa carpeta. Consulta Filtra los objetos de origen por prefijo para obtener más información.

  • Opciones de transferencia: Especifica si se deben reemplazar los archivos de destino (--overwrite-when=different o always) y si se deben borrar ciertos archivos durante o después de la transferencia (--delete-from=destination-if-unique o source-after-transfer). De forma opcional, establece 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 único nombre de nodo. Si el clúster de HDFS está configurado con varios nodos de nombre ("alta disponibilidad") y hay un evento de conmutación por error que genera un nodo de nombre principal nuevo, debes volver a instalar tus agentes con el nombre del nodo correcto.

Para borrar los agentes anteriores, consulta Borra un agente.

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

hdfs haadmin -getAllServiceState