Cargas compuestas paralelas

Una estrategia para cargar archivos grandes se denomina carga compuesta paralela. En esta carga, se divide un archivo en hasta 32 fragmentos, los fragmentos se suben en paralelo a objetos temporales, el objeto final se vuelve a crear mediante los objetos temporales y, luego, se borran los objetos temporales.

Las cargas compuestas paralelas pueden ser mucho más rápidas si la velocidad de la red y el disco no son factores limitantes. Sin embargo, el objeto final almacenado en el bucket es un objeto compuesto, que solo tiene un hash crc32c y no un hash MD5. Como resultado, debes usar crcmod para realizar verificaciones de integridad cuando descargas el objeto con aplicaciones de Python. Solo debes realizar cargas compuestas paralelas si se aplica lo siguiente:

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

    Por ejemplo, si usas Python para subir elementos de video que solo entrega una aplicación de Java, las cargas compuestas paralelas son una buena opción porque hay implementaciones eficientes de CRC32C disponibles en Java.

  • No necesitas que los objetos subidos tengan un hash MD5.

Cómo las herramientas y las API usan las cargas compuestas paralelas

Según cómo interactúes con Cloud Storage, las cargas compuestas paralelas pueden administrarse de forma automática en tu nombre. En esta sección, se describe el comportamiento de carga compuesto en paralelo para diferentes herramientas y se proporciona información sobre cómo puedes modificar el comportamiento.

Console

La consola de Google Cloud no realiza cargas compuestas paralelas.

Línea de comandos

Puedes configurar cómo y cuándo gcloud storage cp realiza cargas compuestas paralelas si modificas las siguientes propiedades:

  • storage/parallel_composite_upload_enabled: propiedad para habilitar las cargas compuestas paralelas. Si es False, inhabilita las cargas compuestas paralelas. Si es True o None, realiza cargas compuestas paralelas para los objetos que cumplen con los criterios definidos en las otras propiedades. La configuración predeterminada es None.

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

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

    Si es False, gcloud storage no realiza ninguna verificación. La configuración predeterminada es True.

  • storage/parallel_composite_upload_threshold: Es el tamaño total mínimo del archivo para realizar una carga compuesta paralela. La configuración predeterminada es de 150 MiB.

  • storage/parallel_composite_upload_component_size: Es el 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 en este tamaño

  • storage/parallel_composite_upload_component_prefix: Es el prefijo que se usa para nombrar objetos temporales. Esta propiedad se puede establecer como una ruta de acceso absoluta o como una ruta de acceso relativa al objeto final. Consulta la descripción de la propiedad para obtener más información. El prefijo predeterminado es la ruta de acceso absoluta /gcloud/tmp/parallel_composite_uploads/see_gcloud_storage_cp_help_for_details.

Puedes modificar estas propiedades si creas una configuración con nombre y aplicas la configuración por comando usando la marca --configuration de todo el proyecto o para todos los comandos de gcloud CLI con el comando gcloud config set.

No se requiere espacio en el disco local adicional cuando se usa gcloud CLI para realizar cargas compuestas paralelas. Si una carga compuesta paralela falla antes de la composición, ejecuta el comando de gcloud CLI de nuevo para aprovechar las cargas reanudables de los objetos temporales que fallaron. Cualquier objeto temporal que se haya subido de forma correcta antes de la falla, no volverá a subirse cuando reanudes la carga.

Los objetos temporales reciben un nombre de la siguiente manera:

TEMPORARY_PREFIX/RANDOM_VALUE_HEX_DIGEST_COMPONENT_ID

Donde:

  • La propiedad storage/parallel_composite_upload_component_prefix controla TEMPORARY_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 borran al final de una carga compuesta paralela. Sin embargo, para evitar que queden objetos temporales, debes verificar el estado de salida del comando de gcloud CLI y borrar de forma manual los objetos temporales que se subieron como parte de cualquier carga anulada.

API de REST

La API de JSON y la API de XML admiten que subas fragmentos de objetos en paralelo y los vuelvas a combinar en un solo objeto usando la operación compose.

Ten en cuenta lo siguiente cuando diseñes 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 están destinados a ser temporales, debes borrarlos de forma explícita una vez que hayas completado con éxito la composición. Si no lo haces, los objetos de origen permanecerán en el bucket y se facturarán en consecuencia.

  • Para estar protegidos de los cambios a los objetos de origen entre las solicitudes de carga y de composición, debes proporcionar un número de generación esperado para cada origen.

Bibliotecas cliente

Java

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

Puedes realizar cargas compuestas paralelas si configuras AllowParallelCompositeUpload como 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

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

La biblioteca cliente de Node.js no admite cargas compuestas paralelas. En cambio, usa Cargas multiparte de la API de XML.

Python

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

La biblioteca cliente de Python no admite cargas compuestas paralelas. En cambio, usa Cargas multiparte de la API de XML.