Копирование между двумя сегментами облачного хранилища Google с использованием Java

#java #google-cloud-platform #google-cloud-storage

#java #google-облачная платформа #google-облачное хранилище

Вопрос:

Для копирования между двумя сегментами облачного хранилища Google необходим эквивалент приведенной ниже команды из Java SDK

 gsutil cp gs://bucket-name/filename gs://bucket-name
  

У меня есть 2 варианта использования одного из приведенных ниже. Эксперты, можете ли вы предложить, есть ли какой-либо лучший подход?

  1. Java.lang.Runtime.exec()

  2. Java.lang.ProcessBuilder

Комментарии:

1. Вы могли бы просто использовать API-интерфейсы Java GCS.

2. Существует ли точный эквивалент для приведенной выше команды gsutil?

Ответ №1:

Как указано в документации, вы можете использовать клиентскую библиотеку Java для копирования объектов между сегментами в качестве прямой альтернативы команде

 gsutil cp gs://SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME gs://DESTINATION_BUCKET_NAME/NAME_OF_COPY
  

Это пример кода, и вы можете проверить и загрузить полный пример проекта с github, пожалуйста, проверьте файл readme, чтобы узнать, какие зависимости необходимы

 import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class CopyObject {
  public static void copyObject(
      String projectId, String sourceBucketName, String objectName, String targetBucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of the bucket the original object is in
    // String sourceBucketName = "your-source-bucket";

    // The ID of the GCS object to copy
    // String objectName = "your-object-name";

    // The ID of the bucket to copy the object to
    // String targetBucketName = "target-object-bucket"

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Blob blob = storage.get(sourceBucketName, objectName);

    // This keeps the original name, you could also do
    // copyTo(targetBucketName, "target-object-name") to change the name
    blob.copyTo(targetBucketName);

    System.out.println(
        "Copied object "
              objectName
              " from bucket "
              sourceBucketName
              " to "
              targetBucketName);
  }
}
  

Ответ №2:

Если 1) вы хотите, чтобы имена больших двоичных объектов (файлов) внутри сегментов оставались неизменными, и 2) У вас есть несколько (> 100) файлов для копирования, лучший способ сделать это — использовать задание переноса.

Эта работа выполняется Google на собственном оборудовании, и это намного быстрее, чем копирование файлов по одному из одного сегмента в другой, потому что они могут взаимодействовать с базовым хранилищем.

Взгляните на предоставленный Google пример кода Java для задания переноса и документацию API.