העלאות מורכבות במקביל

אחת הדרכים להעלות קבצים גדולים נקראת העלאות מורכבות מקבילות. בהעלאה כזו, הקובץ מחולק ל-32 מקטעים לכל היותר ואת כל המקטעים מעלים במקביל לאובייקטים זמניים. לאחר מכן יוצרים מחדש את האובייקט הסופי מהאובייקטים הזמניים ומוחקים את האובייקטים הזמניים.

העלאות מורכבות מקבילות יכולות להיות מהירות משמעותית מהעלאה רגילה, בתנאי שמהירות הרשת ומהירות הכתיבה לדיסק לא מהוות גורם מגביל. יחד עם זאת, האובייקט הסופי שיאוחסן בקטגוריה יהיה אובייקט מורכב עם גיבוב crc32c בלבד (ללא גיבוב MD5). המשמעות היא שאם תורידו את האובייקט באמצעות אפליקציות של Python, תצטרכו להשתמש ב-crcmod כדי לבצע בדיקות תקינוּת. אפשר להשתמש בהעלאות מורכבות מקבילות רק כשהתנאים הבאים מתקיימים:

  • אם אתם לא צריכים שהאובייקטים שהעליתם יהיו עם גיבוב MD5.

  • אם google-crc32c או crcmod מותקנים אצל המשתמשים שצריכים להוריד את האובייקטים באמצעות Python, כולל משתמשי gsutil.

    לדוגמה, אם אתם משתמשים ב-Python כדי להעלות נכסי וידאו שמוצגים רק באפליקציית Java, אפשר להשתמש בהעלאות מורכבות מקבילות כי ב-Java יש הטמעות יעילות של CRC32C.

איך להשתמש בהעלאות מורכבות מקבילות בכלים שונים ובממשקי API

יכול להיות שההעלאות המקבילות של אובייקטים מורכבים מנוהלות בשבילכם באופן אוטומטי בהתאם לאינטראקציה שלכם עם Cloud Storage. בקטע הזה מתוארת ההתנהגות של העלאה מקבילה של קובץ מורכב בכלים שונים, ומובא הסבר איך אפשר לשנות את ההתנהגות.

המסוף

מסוף Google Cloud לא מבצע העלאות מורכבות מקבילות.

שורת הפקודה

כדי להגדיר איך ומתי הפקודה gcloud storage cp תבצע העלאות מורכבות מקבילות, משנים את המאפיינים הבאים:

  • storage/parallel_composite_upload_enabled: זהו המאפיין להפעלת העלאות מורכבות מקבילות. אם הערך שלו מוגדר ל-False, ההעלאות המורכבות המקבילות מושבתות. אם הוא מוגדר ל-True או ל-None, ההעלאות המורכבות המקבילות יופעלו לאובייקטים שעומדים בקריטריונים שמוגדרים במאפיינים האחרים. ערך ברירת המחדל הוא None.

  • storage/parallel_composite_upload_compatibility_check: זהו המאפיין שמפעיל את בדיקות האבטחה. אם הערך שלו הוא True, הפקודה gcloud storage תבצע העלאות מורכבות מקבילות רק כשכל התנאים הבאים מתקיימים:

    שימו לב: כדי לבדוק את התנאים האלה, ה-CLI של gcloud מאחזר את המטא-נתונים של קטגוריית היעד כחלק מפקודת ההעלאה.

    אם הערך שלו הוא False, הפקודה gcloud storage לא תבצע את הבדיקות. ערך ברירת המחדל הוא True.

  • storage/parallel_composite_upload_threshold: הגודל הכולל המינימלי של הקובץ לביצוע העלאה מורכבת מקבילה. הגדרת ברירת המחדל היא ‎150MiB.

  • storage/parallel_composite_upload_component_size: הגודל המקסימלי של כל אובייקט זמני. אם הקובץ הכולל גדול כל כך עד שנדרשים יותר מ-32 מקטעים בגודל הזה, המערכת מתעלמת מהמאפיין הזה.

  • storage/parallel_composite_upload_component_prefix: התחילית שמשמשת למתן שמות לאובייקטים זמניים. המאפיין הזה יכול להכיל נתיב מוחלט או נתיב יחסי לאובייקט הסופי. למידע נוסף, ראו תיאור של מאפיינים. ברירת המחדל לתחילית של השם היא הנתיב המוחלט /gcloud/tmp/parallel_composite_uploads/see_gcloud_storage_cp_help_for_details.

כדי לשנות את המאפיינים האלה אפשר ליצור תצורה בעלת שם ולהחיל אותה בכל פקודה באמצעות הדגל --configuration ברמת הפרויקט או בכל הפקודות ב-CLI של gcloud באמצעות הפקודה gcloud config set.

כשמשתמשים ב-CLI של gcloud כדי לבצע העלאות מורכבות מקבילות לא נדרש עוד מקום בכונן מקומי. אם העלאה מורכבת מקבילה נכשלה לפני שהושלמה, מריצים שוב את הפקודה ב-CLI של gcloud כדי לנצל את ההעלאות שניתן להמשיך לאובייקטים הזמניים שנכשלו. האובייקטים הזמניים שהועלו לפני שההעלאה נכשלה, לא יועלו מחדש כשממשיכים את ההעלאה.

השמות של האובייקטים הזמניים נקבעים באופן הבא:

TEMPORARY_PREFIX/RANDOM_VALUE_HEX_DIGEST_COMPONENT_ID

כאשר:

  • TEMPORARY_PREFIX נקבע על ידי המאפיין storage/parallel_composite_upload_component_prefix.
  • RANDOM_VALUE הוא ערך מספרי אקראי.
  • HEX_DIGEST הוא גיבוב (hash) שנגזר מהשם של משאב המקור.
  • COMPONENT_ID הוא המספר הרציף של המקטע.

כעיקרון, האובייקטים הזמניים נמחקים בסוף העלאה מורכבת מקבילה. אבל, כדי שלא יישארו אובייקטים זמניים בסביבה, צריך לבדוק את סטטוס היציאה של הפקודה ב-CLI של gcloud ולמחוק באופן ידני את כל האובייקטים הזמניים שהועלו כחלק מהעלאה שבוטלה.

ספריות לקוח

Java

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Java API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

כדי לבצע העלאות מורכבות במקביל, צריך להגדיר את הערך AllowParallelCompositeUpload ל-true. לדוגמה:

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Node.js API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

ספריית הלקוח Node.js לא תומכת בהעלאות מורכבות מקבילות. במקום זאת, צריך להשתמש בהעלאות מרובות חלקים באמצעות API בפורמט XML.

Python

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Python API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

ספריית הלקוח Python לא תומכת בהעלאות מורכבות מקבילות. במקום זאת, צריך להשתמש בהעלאות מרובות חלקים באמצעות API בפורמט XML.

ממשקי API ל-REST

גם API בפורמט JSON וגם API בפורמט XML תומכים בהעלאה מקבילה של מקטעי אובייקטים והרכבה שלהם לאובייקט אחד באמצעות הפעולה compose.

כשמתכננים את הקוד להעלאות מורכבות מקבילות כדאי לקחת בחשבון את הנושאים הבאים:

  • הפעולה compose לא משפיעה על האובייקטים במקור.

    כלומר, אם אתם מתכוונים שהם ישמשו כאובייקטים זמניים, אתם צריכים למחוק אותם באופן מפורש בסיום הרכבת האובייקט השלם. אחרת, הם יישארו במקור ויחויבו בהתאם.

  • כדי להגן מפני שינויים באובייקטים במקור בין בקשות ההעלאה לבקשות ההרכבה, צריך לציין את מספר דור המצופה לכל אובייקט במקור.