חיבור ל-Apache Spark

בתור אדמינים ב-BigQuery, אתם יכולים ליצור חיבור כדי לאפשר למנתחי נתונים להפעיל פרוצדורות מאוחסנות עבור Apache Spark.

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

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

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

במספר אזורים

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

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

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

אזורים יחידים

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

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

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

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית Explorer, לוחצים על Add data.

    תיבת הדו-שיח הוספת נתונים נפתחת.

  3. בחלונית Filter By, בקטע Data Source Type, בוחרים באפשרות Business Applications.

    אפשרות אחרת היא להזין Spark בשדה חיפוש מקורות נתונים.

  4. בקטע מקורות נתונים מומלצים, לוחצים על Apache Spark.

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

  6. בחלונית מקור נתונים חיצוני, מזינים את הפרטים הבאים:

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

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

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

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

    • אופציונלי: ברשימה Metastore service, בוחרים באפשרות Dataproc Metastore.

    • אופציונלי: בשדה History server cluster (אשכול שרת היסטוריה), מזינים Dataproc Persistent History Server (שרת היסטוריה מתמשך של Dataproc).

  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": "DATAPROC_CLUSTER_NAME"}
      }'
      

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

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

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

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

      כשמציגים את פרטי החיבור במסוף Google Cloud , מזהה החיבור הוא הערך בקטע האחרון של מזהה החיבור המלא שמוצג במזהה החיבור – לדוגמה, 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.iam.gserviceaccount.com"}
    

מידע על ניהול חיבורים זמין במאמר ניהול חיבורים.

הענקת גישה לחשבון השירות

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

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

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

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

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

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

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

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

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

  • אם מציינים שרת היסטוריה מתמשך של Dataproc כשיוצרים חיבור, צריך להקצות לחשבון השירות את התפקידים הבאים:

    • התפקיד roles/dataproc.viewer בשרת ההיסטוריה המתמשך של Dataproc שכולל את ההרשאה dataproc.clusters.get.
    • תפקיד roles/storage.objectAdmin בדלי Cloud Storage שאתם מציינים עבור הנכס spark:spark.history.fs.logDirectory כשאתם יוצרים את שרת ההיסטוריה המתמשך של Dataproc.

    מידע נוסף זמין במאמרים Dataproc Persistent History Server ותפקידים והרשאות ב-Dataproc.

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

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

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

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

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

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

המסוף

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

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

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

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

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

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

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

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

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

BQ

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

API

משתמשים בשיטה projects.locations.connections.setIAM בקטע BigQuery Connections API בארכיטקטורת 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");
    }
  }
}

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