חיבור ל-Apache Spark

חיבור של Apache Spark ב-BigQuery מאפשר למשתמשים לחבר את BigQuery ל-Managed Service for Apache Spark כדי להריץ פרוצדורות מאוחסנות ב-Apache Spark. אתם יכולים ליצור את החיבור הזה, לתת את ההרשאות הנדרשות לחשבון השירות שלו ולשתף את החיבור עם משתמשים.

לפני שמתחילים

שיקולים בקשר למיקום

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

במספר אזורים

צריך לציין משאבים ב- Google Cloud שנמצאים באותו אזור גיאוגרפי גדול:

  • חיבור ב-BigQuery במספר אזורים בארה"ב יכול להפנות ל-Spark History Server או ל-Dataproc Metastore בכל אזור באזור הגיאוגרפי של ארה"ב, כמו us-central1,‏ us-east4 או us-west2.

  • חיבור ב-BigQuery במספר אזורים באיחוד האירופי יכול להפנות לשרת Spark History או ל-Dataproc Metastore במדינות החברות באיחוד האירופי, כמו europe-north1 או europe-west3.

אזורים בודדים

חיבור באזור אחד יכול להפנות רק למשאבי Google Cloudבאותו אזור. לדוגמה, חיבור באזור היחיד us-east4 יכול להפנות רק לשרת Spark History או ל-Dataproc Metastore ב-us-east4.

יצירת חיבורים

בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית נתונים, לוחצים על הוספת נתונים.

    תיבת הדו-שיח Add data נפתחת.

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

    אפשר גם להזין Spark בשדה Search for data sources.

  4. בקטע Featured data sources, לוחצים על Apache Spark.

  5. לוחצים על כרטיס הפתרון Apache Spark: BigQuery Federation.

  6. בחלונית External data source, מזינים את הפרטים הבאים:

    • ברשימה Connection type, בוחרים באפשרות Apache Spark.

    • בשדה Connection ID, מזינים שם לחיבור, לדוגמה spark_connection.

    • ברשימה מיקום הנתונים, בוחרים אזור.

    אפשר ליצור חיבור באזורים ובמספר אזורים שתומכים ב-BigQuery. מידע נוסף זמין במאמר שיקולים לגבי מיקום.

  7. לוחצים על יצירת חיבור.

  8. לוחצים על מעבר לחיבור.

  9. בחלונית Connection info, מעתיקים את מזהה חשבון השירות כדי להשתמש בו בשלב הבא.

BQ

  1. בסביבה של שורת הפקודה, משתמשים בפקודה bq mk כדי ליצור חיבור:

    bq mk --connection --connection_type='SPARK' \
     --properties=PROPERTIES \
     --project_id=PROJECT_ID \
     --location=LOCATION
     CONNECTION_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫PROPERTIES: צמד מפתח/ערך שמספק פרמטרים ספציפיים לחיבור בפורמט JSON

      לדוגמה:

      --properties='{
      "metastoreServiceConfig": {"metastoreService": "METASTORE_SERVICE_NAME"},
      "sparkHistoryServerConfig": {"dataprocCluster": "MANAGED_SERVICE_FOR_APACHE_SPARK_CLUSTER_NAME"}
      }'
      

      מחליפים את מה שכתוב בשדות הבאים:

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud

    • ‫LOCATION: המיקום שבו רוצים לאחסן את החיבור, לדוגמה US

    • ‫CONNECTION_ID: מזהה החיבור, לדוגמה myconnection

      כשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בחלק האחרון של מזהה החיבור המלא שמוצג ב-Connection ID, לדוגמה projects/.../locations/.../connections/myconnection.

  2. מאחזרים ומעתיקים את מזהה חשבון השירות כי צריך אותו בשלב אחר:

    bq show --location=LOCATION --connection PROJECT_ID.LOCATION.CONNECTION_ID
    

    הפלט אמור להיראות כך:

    Connection myproject.us.myconnection
    
           name           type                    properties
    ---------------------- ------- ---------------------------------------------------
    myproject.us.myconnection  SPARK   {"serviceAccountId": "bqserver@example."}
    

במאמר ניהול חיבורים מוסבר איך מנהלים את החיבורים.

מתן גישה לחשבון השירות

כדי לאפשר לפרוצדורה מאוחסנת של Apache Spark לגשת למשאבים שלכם ב- Google Cloud, אתם צריכים לתת לחשבון השירות שמשויך לחיבור של הפרוצדורה המאוחסנת את הרשאות ה-IAM הנדרשות. לחלופין, אתם יכולים להשתמש בחשבון שירות בהתאמה אישית כדי לגשת לנתונים.

  • כדי לקרוא נתונים מ-BigQuery ולכתוב נתונים ל-BigQuery, צריך לתת לחשבון השירות את הרשאות ה-IAM הבאות:

    • ‫bigquery.tables.* בטבלאות ב-BigQuery
    • ‫bigquery.readsessions.* בפרויקט

    תפקיד ה-IAM‏ roles/bigquery.admin כולל את ההרשאות שחשבון השירות צריך כדי לקרוא נתונים מ-BigQuery ולכתוב נתונים ל-BigQuery.

  • כדי לקרוא ולכתוב נתונים מ-Cloud Storage ואליו, צריך לתת לחשבון השירות את ההרשאה storage.objects.* באובייקטים של Cloud Storage.

    תפקיד ה-IAM‏ roles/storage.objectAdmin כולל את ההרשאות שחשבון השירות צריך כדי לקרוא נתונים מ-Cloud Storage ולכתוב נתונים ל-Cloud Storage.

  • אם אתם מציינים את Dataproc Metastore כשאתם יוצרים חיבור, כדי ש-BigQuery יוכל לאחזר פרטים על הגדרת המטא-חנות, אתם צריכים לתת לחשבון השירות את ההרשאה metastore.services.get ב-Dataproc Metastore.

    התפקיד המוגדר מראש roles/metastore.metadataViewer כולל את ההרשאה שחשבון השירות צריך כדי לאחזר פרטים על ההגדרות של המטא-נתונים.

    אתם גם צריכים לתת לחשבון השירות את התפקיד roles/storage.objectAdmin בקטגוריה של Cloud Storage, כדי שהפרוצדורה המאוחסנת תוכל לגשת לספריית המחסן של Hive ב-Dataproc Metastore (hive.metastore.warehouse.dir). אם הפרוצדורה המאוחסנת מבצעת פעולות במטא-נתונים, יכול להיות שתצטרכו לתת הרשאות נוספות. במאמר תפקידים והרשאות מוגדרים מראש ב-Dataproc Metastore תוכלו לקרוא מידע נוסף על התפקידים וההרשאות ב-IAM ב-Dataproc Metastore.

  • אם אתם מציינים שרת היסטוריה קבוע של Managed Service for Apache Spark כשאתם יוצרים חיבור, אתם צריכים להקצות לחשבון השירות את התפקידים הבאים:

    • התפקיד roles/dataproc.viewer בשרת ההיסטוריה הקבוע של Managed Service for Apache Spark, שמכיל את ההרשאה dataproc.clusters.get.
    • התפקיד roles/storage.objectAdmin בקטגוריה של Cloud Storage שאתם מציינים במאפיין spark:spark.history.fs.logDirectory כשאתם יוצרים את Managed Service for Apache Spark Persistent History Server.

    מידע נוסף זמין במאמרים שרת היסטוריה קבוע ב-Managed Service for Apache Spark ותפקידים והרשאות ב-Managed Service for Apache Spark.

שיתוף חיבורים עם משתמשים

כדי לאפשר למשתמשים לשלוח שאילתות לגבי נתונים ולנהל חיבורים, אתם יכולים להקצות את התפקידים הבאים:

  • ‫roles/bigquery.connectionUser: מאפשרת למשתמשים להשתמש בחיבורים כדי להתחבר למקורות נתונים חיצוניים ולהריץ עליהם שאילתות.

  • ‫roles/bigquery.connectionAdmin: מאפשר למשתמשים לנהל חיבורים.

במאמר תפקידים והרשאות מוגדרים מראש תוכלו לקרוא מידע נוסף על תפקידים והרשאות של IAM ב-BigQuery.

בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

    החיבורים מופיעים בפרויקט בקבוצה שנקראת Connections.

  2. בחלונית הימנית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. לוחצים על הפרויקט, לוחצים על Connections ובוחרים חיבור.

  4. בחלונית פרטים, לוחצים על שיתוף כדי לשתף חיבור. לאחר מכן מבצעים את הפעולות הבאות:

    1. בתיבת הדו-שיח Connection permissions, משתפים את החיבור עם חשבונות משתמשים אחרים על ידי הוספה או עריכה של חשבונות משתמשים.

    2. לוחצים על Save.

BQ

אי אפשר לשתף חיבור באמצעות כלי שורת הפקודה של BigQuery. כדי לשתף חיבור, משתמשים במסוף Google Cloud או ב-BigQuery Connections API.

API

משתמשים בשיטה projects.locations.connections.setIAM בקטע של מאמרי העזרה של BigQuery Connections REST API, ומספקים מופע של המשאב policy.

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Java API.

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

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

המאמרים הבאים