Subidas compuestas paralelas

Una estrategia para subir archivos de gran tamaño se denomina subidas compuestas paralelas. En este tipo de subida, un archivo se divide en hasta 32 fragmentos, los fragmentos se suben en paralelo a objetos temporales, el objeto final se vuelve a crear con los objetos temporales y los objetos temporales se eliminan.

Las subidas compuestas paralelas pueden ser significativamente más rápidas si la velocidad de la red y del disco no son factores limitantes. Sin embargo, el objeto final almacenado en tu contenedor es un objeto compuesto, que solo tiene un hash crc32c y no un hash MD5. Por lo tanto, debes usar crcmod para realizar comprobaciones de integridad al descargar el objeto con aplicaciones Python. Solo debes realizar subidas compuestas paralelas si se cumplen las siguientes condiciones:

  • No es necesario que los objetos subidos tengan un hash MD5.

  • Cualquier usuario de Python, incluidos los usuarios de gsutil, que necesite descargar tus objetos tiene instalado google-crc32c o crcmod.

    Por ejemplo, si usas Python para subir recursos de vídeo que solo se sirven con una aplicación Java, las subidas compuestas paralelas son una buena opción porque hay implementaciones de CRC32C eficientes disponibles en Java.

Cómo usan las herramientas y las APIs las subidas compuestas paralelas

En función de cómo interactúes con Cloud Storage, las subidas compuestas paralelas se pueden gestionar automáticamente en tu nombre. En esta sección se describe el comportamiento de la subida compuesta paralela de diferentes herramientas y se proporciona información sobre cómo puedes modificar el comportamiento.

Consola

La consola Google Cloud no realiza subidas compuestas paralelas.

Línea de comandos

Puedes configurar cómo y cuándo realiza gcloud storage cp las subidas compuestas paralelas modificando las siguientes propiedades:

  • storage/parallel_composite_upload_enabled: propiedad para habilitar las subidas de elementos compuestos en paralelo. Si es False, inhabilita las subidas compuestas paralelas. Si True o None, realiza subidas compuestas paralelas de los objetos que cumplan los criterios definidos en las otras propiedades. El valor predeterminado es None.

  • storage/parallel_composite_upload_compatibility_check: propiedad para activar o desactivar las comprobaciones de seguridad. Si es True, gcloud storage solo realiza cargas compuestas paralelas cuando se cumplen todas las condiciones siguientes:

    Ten en cuenta que, para comprobar estas condiciones, la CLI de gcloud recupera los metadatos del bucket de destino como parte del comando de subida.

    Si False, gcloud storage no realiza ninguna comprobación. El ajuste predeterminado es True.

  • storage/parallel_composite_upload_threshold: tamaño total mínimo del archivo para realizar una subida compuesta paralela. El valor predeterminado es 150 MiB.

  • storage/parallel_composite_upload_component_size: tamaño máximo de cada objeto temporal. La propiedad se ignora si el tamaño total del archivo es tan grande que requeriría más de 32 fragmentos con este tamaño.

  • storage/parallel_composite_upload_component_prefix: prefijo usado al asignar nombres a objetos temporales. Esta propiedad se puede definir como una ruta absoluta o como una ruta relativa al objeto final. Consulta la descripción de la propiedad para obtener más información. El prefijo predeterminado es la ruta absoluta /gcloud/tmp/parallel_composite_uploads/see_gcloud_storage_cp_help_for_details.

Puedes modificar estas propiedades creando una configuración con nombre y aplicándola en cada comando con la marca --configuration de todo el proyecto o en todos los comandos de la CLI de gcloud con el comando gcloud config set.

No se necesita espacio adicional en el disco local cuando se usa la interfaz de línea de comandos gcloud para realizar subidas compuestas paralelas. Si una subida compuesta paralela falla antes de la composición, vuelve a ejecutar el comando de la CLI de gcloud para aprovechar las subidas reanudables de los objetos temporales que han fallado. Los objetos temporales que se hayan subido correctamente antes del fallo no se volverán a subir cuando reanudes la subida.

Los objetos temporales se denominan de la siguiente manera:

TEMPORARY_PREFIX/RANDOM_VALUE_HEX_DIGEST_COMPONENT_ID

Donde:

  • TEMPORARY_PREFIX se controla mediante la propiedad storage/parallel_composite_upload_component_prefix.
  • RANDOM_VALUE es un valor numérico aleatorio.
  • HEX_DIGEST es un hash derivado del nombre del recurso de origen.
  • COMPONENT_ID es el número secuencial del componente.

Por lo general, los objetos temporales se eliminan al final de una subida compuesta paralela, pero, para evitar que queden objetos temporales, debes comprobar el estado de salida del comando de la CLI de gcloud y eliminar manualmente los objetos temporales que se hayan subido como parte de una subida cancelada.

Bibliotecas de cliente

Java

Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

Puedes realizar subidas compuestas paralelas configurando AllowParallelCompositeUpload en true. Por ejemplo:

import com.google.cloud.storage.transfermanager.ParallelUploadConfig;
import com.google.cloud.storage.transfermanager.TransferManager;
import com.google.cloud.storage.transfermanager.TransferManagerConfig;
import com.google.cloud.storage.transfermanager.UploadResult;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;

class AllowParallelCompositeUpload {

  public static void parallelCompositeUploadAllowed(String bucketName, List<Path> files)
      throws IOException {
    TransferManager transferManager =
        TransferManagerConfig.newBuilder()
            .setAllowParallelCompositeUpload(true)
            .build()
            .getService();
    ParallelUploadConfig parallelUploadConfig =
        ParallelUploadConfig.newBuilder().setBucketName(bucketName).build();
    List<UploadResult> results =
        transferManager.uploadFiles(files, parallelUploadConfig).getUploadResults();
    for (UploadResult result : results) {
      System.out.println(
          "Upload for "
              + result.getInput().getName()
              + " completed with status "
              + result.getStatus());
    }
  }
}

Node.js

Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

La biblioteca de cliente de Node.js no admite subidas compuestas paralelas. En su lugar, utiliza las subidas multiparte de la API XML.

Python

Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

La biblioteca de cliente de Python no admite subidas compuestas paralelas. En su lugar, utiliza las subidas multiparte de la API XML.

APIs REST

Tanto la API JSON como la API XML permiten subir fragmentos de objetos en paralelo y volver a combinarlos en un solo objeto mediante la operación compose.

Ten en cuenta lo siguiente al diseñar código para cargas compuestas paralelas:

  • Cuando se usa la operación compose, los objetos de origen no se ven afectados por el proceso de composición.

    Esto significa que, si se supone que son temporales, debes eliminarlos explícitamente una vez que hayas completado la composición correctamente. De lo contrario, los objetos de origen permanecerán en tu contenedor y se te facturarán en consecuencia.

  • Para protegerse frente a los cambios en los objetos de origen entre las solicitudes de subida y de composición, debe proporcionar un número de generación esperado para cada origen.