שימוש ב-Trino עם Managed Service for Apache Spark

Trino (לשעבר Presto) הוא מנוע מבוזר לשאילתות SQL שנועד להריץ שאילתות על מערכי נתונים גדולים שמפוזרים על פני מקורות נתונים הטרוגניים. ‫Trino יכול לשלוח שאילתות ל-Hive, ל-MySQL, ל-Kafka ולמקורות נתונים אחרים באמצעות מחברים. המדריך הזה מסביר איך:

  • התקנה של שירות Trino באשכול Managed Service for Apache Spark
  • שאילתת נתונים ציבוריים מלקוח Trino שמותקן במחשב המקומי ומתקשר עם שירות Trino באשכול
  • הפעלת שאילתות מאפליקציית Java שמתקשרת עם שירות Trino באשכול באמצעות מנהל ההתקן Trino Java JDBC.

מטרות

  • יצירת אשכול Managed Service for Apache Spark עם Trino מותקן
  • הכנת הנתונים. במדריך הזה נעשה שימוש במערך הנתונים הציבורי Chicago Taxi Trips, שזמין ב-BigQuery.
    1. שליפת הנתונים מ-BigQuery
    2. טוענים את הנתונים ל-Cloud Storage כקובצי CSV
    3. שינוי נתונים:
      1. חשיפת הנתונים כטבלה חיצונית של Hive כדי לאפשר ל-Trino לבצע שאילתות על הנתונים
      2. המרת הנתונים מפורמט CSV לפורמט Parquet כדי להאיץ את השאילתות
  • שליחת שאילתות של קוד אפליקציה או Trino CLI באמצעות מנהרת SSH או מנהל התקן Trino JDBC, בהתאמה, אל רכיב ה-coordinator של Trino שפועל באשכול
  • בדיקת היומנים ומעקב אחרי שירות Trino דרך ממשק האינטרנט של Trino
  • עלויות

    במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

    כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

    משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

    אם עדיין לא עשיתם את זה, צרו Google Cloud פרויקט וקטגוריה ב-Cloud Storage כדי לאחסן את הנתונים שמשמשים במדריך הזה. 1. הגדרת הפרויקט
    1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
    2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

      Go to project selector

    3. Verify that billing is enabled for your Google Cloud project.

    4. Enable the Dataproc, Compute Engine, Cloud Storage, and BigQuery APIs.

      Roles required to enable APIs

      To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the APIs

    5. התקינו את ה-CLI של Google Cloud.

    6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

      gcloud init
    8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

      Go to project selector

    9. Verify that billing is enabled for your Google Cloud project.

    10. Enable the Dataproc, Compute Engine, Cloud Storage, and BigQuery APIs.

      Roles required to enable APIs

      To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the APIs

    11. התקינו את ה-CLI של Google Cloud.

    12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

      gcloud init
    ‫1. יצירת קטגוריה ב-Cloud Storage בפרויקט שלכם כדי לאחסן את הנתונים שמשמשים במדריך הזה.
    1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

      כניסה לדף Buckets

    2. לוחצים על יצירה.
    3. ממלאים את פרטי הקטגוריה בדף Create a bucket. כדי לעבור לשלב הבא לוחצים על Continue.
      1. בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:
      2. בקטע Choose where to store your data, מבצעים את הפעולות הבאות:
        1. בוחרים סוג מיקום.
        2. בתפריט הנפתח Location type, בוחרים מיקום שבו יישמרו נתוני הקטגוריה באופן קבוע.
        3. כדי להגדיר שכפול בין מאגרי מידע, בוחרים באפשרות הוספת שכפול בין מאגרי מידע באמצעות Storage Transfer Service ופועלים לפי השלבים הבאים:

          הגדרה של רפליקציה בין מאגרי מידע

          1. בתפריט Bucket, בוחרים באפשרות הרצויה.
          2. בקטע הגדרות השכפול, לוחצים על הגדרה כדי להגדיר את ההגדרות של משימת השכפול.

            מופיעה החלונית Configure cross-bucket replication.

            • כדי לסנן אובייקטים לשכפול לפי קידומת של שם האובייקט, מזינים קידומת שרוצים לכלול או להחריג אובייקטים ממנה, ואז לוחצים על הוספת קידומת.
            • כדי להגדיר סוג אחסון לאובייקטים המשוכפלים, בוחרים סוג אחסון בתפריט סוג אחסון. אם מדלגים על השלב הזה, האובייקטים המשוכפלים ישתמשו בסוג האחסון של קטגוריית היעד כברירת מחדל.
            • לוחצים על סיום.
      3. בקטע Choose how to store your data, מבצעים את הפעולות הבאות:
        1. בוחרים default storage class לקטגוריה או Autoclass לניהול אוטומטי של סוג האחסון (storage class) של נתוני הקטגוריה.
        2. כדי להפעיל מרחב שמות היררכי, בקטע Optimize storage for data-intensive workloads, בוחרים באפשרות Enable hierarchical namespace on this bucket.
      4. בקטע Choose how to control access to objects, בוחרים אם הקטגוריה אוכפת public access prevention או לא, ואז בוחרים שיטת בקרת גישה לאובייקטים של הקטגוריה.
      5. בקטע Choose how to protect object data, מבצעים את הפעולות הבאות:
        • בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
          • כדי להפעיל מחיקה עם יכולת שחזור, מסמנים את התיבה מדיניות מחיקה עם יכולת שחזור (לשחזור נתונים) ומציינים את מספר הימים שבהם רוצים לשמור אובייקטים אחרי המחיקה.
          • כדי להגדיר ניהול גרסאות של אובייקטים, מסמנים את התיבה ניהול גרסאות של אובייקטים (לשליטה בגרסאות) ומציינים את מספר הגרסאות המקסימלי לכל אובייקט ואת מספר הימים שאחריהם הגרסאות הלא עדכניות יפוגו.
          • כדי להפעיל את מדיניות שמירת הנתונים על אובייקטים וקטגוריות, לוחצים על תיבת הסימון שמירת נתונים (לצורך תאימות), ואז מבצעים את הפעולות הבאות:
            • כדי להפעיל את הנעילה של שמירת אובייקטים, מסמנים את התיבה הפעלת שמירת אובייקטים.
            • כדי להפעיל את נעילת הקטגוריה, מסמנים את תיבת הסימון הגדרת מדיניות שמירת נתונים בקטגוריה ובוחרים יחידת זמן ואת משך הזמן של תקופת השמירה.
        • כדי לבחור איך להצפין את נתוני האובייקט, מרחיבים את הקטע Data encryption () ובוחרים Data encryption method.
    4. לוחצים על יצירה.

    יצירת אשכול Managed Service for Apache Spark

    יוצרים אשכול של שירות מנוהל ל-Apache Spark באמצעות הדגל optional-components (זמין בגרסה 2.1 ואילך של התמונה) כדי להתקין את רכיב Trino האופציונלי באשכול, והדגל enable-component-gateway כדי להפעיל את Component Gateway ולאפשר גישה לממשק המשתמש האינטרנטי של Trino ממסוף Google Cloud .

    1. הגדרה של משתני סביבה:
      • PROJECT: מזהה הפרויקט
      • BUCKET_NAME: השם של קטגוריית Cloud Storage שיצרתם בקטע לפני שמתחילים
      • REGION: region האזור שבו ייווצר האשכול שמשמש במדריך הזה, לדוגמה, us-west1
      • עובדים: מומלץ להשתמש ב-3 עד 5 עובדים במדריך הזה
      export PROJECT=project-id
      export WORKERS=number
      export REGION=region
      export BUCKET_NAME=bucket-name
      
    2. מריצים את Google Cloud CLI במחשב המקומי כדי ליצור את האשכול.
      gcloud beta dataproc clusters create trino-cluster \
          --project=${PROJECT} \
          --region=${REGION} \
          --num-workers=${WORKERS} \
          --scopes=cloud-platform \
          --optional-components=TRINO \
          --image-version=2.1  \
          --enable-component-gateway
      

    הכנת הנתונים

    מייצאים את מערך הנתונים bigquery-public-data chicago_taxi_trips ל-Cloud Storage כקובצי CSV, ואז יוצרים טבלה חיצונית של Hive כדי להפנות לנתונים.

    1. במחשב המקומי, מריצים את הפקודה הבאה כדי לייבא את נתוני המוניות מ-BigQuery כקובצי CSV ללא כותרות לקטגוריית Cloud Storage שיצרתם בשלב לפני שמתחילים.
      bq --location=us extract --destination_format=CSV \
           --field_delimiter=',' --print_header=false \
             "bigquery-public-data:chicago_taxi_trips.taxi_trips" \
             gs://${BUCKET_NAME}/chicago_taxi_trips/csv/shard-*.csv
      
    2. יוצרים טבלאות חיצוניות של Hive שמגובות על ידי קובצי ה-CSV ו-Parquet בקטגוריה של Cloud Storage.
      1. יוצרים את הטבלה החיצונית של Hive‏ chicago_taxi_trips_csv.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "
                CREATE EXTERNAL TABLE chicago_taxi_trips_csv(
                  unique_key   STRING,
                  taxi_id  STRING,
                  trip_start_timestamp  TIMESTAMP,
                  trip_end_timestamp  TIMESTAMP,
                  trip_seconds  INT,
                  trip_miles   FLOAT,
                  pickup_census_tract  INT,
                  dropoff_census_tract  INT,
                  pickup_community_area  INT,
                  dropoff_community_area  INT,
                  fare  FLOAT,
                  tips  FLOAT,
                  tolls  FLOAT,
                  extras  FLOAT,
                  trip_total  FLOAT,
                  payment_type  STRING,
                  company  STRING,
                  pickup_latitude  FLOAT,
                  pickup_longitude  FLOAT,
                  pickup_location  STRING,
                  dropoff_latitude  FLOAT,
                  dropoff_longitude  FLOAT,
                  dropoff_location  STRING)
                ROW FORMAT DELIMITED
                FIELDS TERMINATED BY ','
                STORED AS TEXTFILE
                location 'gs://${BUCKET_NAME}/chicago_taxi_trips/csv/';"
        
      2. בודקים את יצירת הטבלה החיצונית של Hive.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
        
      3. יוצרים עוד טבלה חיצונית של Hive‏ chicago_taxi_trips_parquet עם אותן עמודות, אבל עם נתונים שמאוחסנים בפורמט Parquet כדי לשפר את הביצועים של השאילתות.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "
                CREATE EXTERNAL TABLE chicago_taxi_trips_parquet(
                  unique_key   STRING,
                  taxi_id  STRING,
                  trip_start_timestamp  TIMESTAMP,
                  trip_end_timestamp  TIMESTAMP,
                  trip_seconds  INT,
                  trip_miles   FLOAT,
                  pickup_census_tract  INT,
                  dropoff_census_tract  INT,
                  pickup_community_area  INT,
                  dropoff_community_area  INT,
                  fare  FLOAT,
                  tips  FLOAT,
                  tolls  FLOAT,
                  extras  FLOAT,
                  trip_total  FLOAT,
                  payment_type  STRING,
                  company  STRING,
                  pickup_latitude  FLOAT,
                  pickup_longitude  FLOAT,
                  pickup_location  STRING,
                  dropoff_latitude  FLOAT,
                  dropoff_longitude  FLOAT,
                  dropoff_location  STRING)
                STORED AS PARQUET
                location 'gs://${BUCKET_NAME}/chicago_taxi_trips/parquet/';"
        
      4. טוענים את הנתונים מטבלת ה-CSV של Hive לטבלת ה-Parquet של Hive.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "
                INSERT OVERWRITE TABLE chicago_taxi_trips_parquet
                SELECT * FROM chicago_taxi_trips_csv;"
        
      5. מוודאים שהנתונים נטענו בצורה תקינה.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "SELECT COUNT(*) FROM chicago_taxi_trips_parquet;"
        

    הרצת שאילתות

    אפשר להריץ שאילתות באופן מקומי מ-Trino CLI או מאפליקציה.

    שאילתות ב-Trino CLI

    בקטע הזה נדגים איך לשלוח שאילתות למערך הנתונים של מוניות בפורמט Hive Parquet באמצעות Trino CLI.

    1. מריצים את הפקודה הבאה במחשב המקומי כדי להתחבר ל-SSH לצומת הראשי של האשכול: הטרמינל המקומי יפסיק להגיב במהלך הביצוע של הפקודה.
      gcloud compute ssh trino-cluster-m
      
    2. בחלון הטרמינל של SSH בצומת הראשי של האשכול, מריצים את Trino CLI, שמתחבר לשרת Trino שפועל בצומת הראשי.
      trino --catalog hive --schema default
      
    3. בהנחיה trino:default, מוודאים ש-Trino יכול למצוא את טבלאות Hive.
      show tables;
      
      Table
      ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
       chicago_taxi_trips_csv
       chicago_taxi_trips_parquet
      (2 rows)
      
    4. מריצים שאילתות מההנחיה trino:default ומשווים בין הביצועים של שאילתות על נתוני Parquet לעומת נתוני CSV.
      • שאילתת נתונים בפורמט Parquet
        select count(*) from chicago_taxi_trips_parquet where trip_miles > 50;
        
         _col0
        ‐‐‐‐‐‐‐‐
         117957
        (1 row)
        Query 20180928_171735_00006_2sz8c, FINISHED, 3 nodes Splits: 308 total, 308 done (100.00%) 0:16 [113M rows, 297MB] [6.91M rows/s, 18.2MB/s]
      • שאילתת נתונים של קובץ CSV
        select count(*) from chicago_taxi_trips_csv where trip_miles > 50;
        
        _col0
        ‐‐‐‐‐‐‐‐
         117957
        (1 row)
        Query 20180928_171936_00009_2sz8c, FINISHED, 3 nodes Splits: 881 total, 881 done (100.00%) 0:47 [113M rows, 41.5GB] [2.42M rows/s, 911MB/s]

    שאילתות של אפליקציות Java

    כדי להריץ שאילתות מאפליקציית Java באמצעות מנהל ההתקנים של Trino Java JDBC: ‫1. מורידים את מנהל ההתקן Trino Java JDBC. 1. מוסיפים תלות ב-trino-jdbc ב-Maven pom.xml.

    <dependency>
      <groupId>io.trino</groupId>
      <artifactId>trino-jdbc</artifactId>
      <version>376</version>
    </dependency>
    
    דוגמה לקוד Java
    package dataproc.codelab.trino;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    public class TrinoQuery {
      private static final String URL = "jdbc:trino://trino-cluster-m:8080/hive/default";
      private static final String SOCKS_PROXY = "localhost:1080";
      private static final String USER = "user";
      private static final String QUERY =
          "select count(*) as count from chicago_taxi_trips_parquet where trip_miles > 50";
      public static void main(String[] args) {
        try {
          Properties properties = new Properties();
          properties.setProperty("user", USER);
          properties.setProperty("socksProxy", SOCKS_PROXY);
          Connection connection = DriverManager.getConnection(URL, properties);
          try (Statement stmt = connection.createStatement()) {
            ResultSet rs = stmt.executeQuery(QUERY);
            while (rs.next()) {
              int count = rs.getInt("count");
              System.out.println("The number of long trips: " + count);
            }
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }

    רישום ביומן ומעקב

    רישום ביומן

    היומנים של Trino נמצאים בנתיב /var/log/trino/ בצמתי ה-master וה-worker של האשכול.

    ממשק משתמש באינטרנט

    כדי לפתוח את ממשק המשתמש באינטרנט של Trino שפועל בצומת הראשי של האשכול בדפדפן המקומי, אפשר לעיין במאמר בנושא הצגה וגישה לכתובות URL של שער רכיבים.

    מעקב

    ‫Trino חושף מידע על זמן הריצה של האשכול באמצעות טבלאות זמן ריצה. בסשן Trino (מההנחיה trino:default), מריצים את השאילתה הבאה כדי לראות את נתוני הטבלה בזמן הריצה:

    select * FROM system.runtime.nodes;
    

    הסרת המשאבים

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

    מחיקת הפרויקט

    הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

    כדי למחוק את הפרויקט:

    1. במסוף Google Cloud , נכנסים לדף Manage resources.

      כניסה לדף Manage resources

    2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
    3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

    מחיקת האשכול

    • כדי למחוק את האשכול:
      gcloud dataproc clusters delete --project=${PROJECT} trino-cluster \
          --region=${REGION}
      

    מחיקת הקטגוריה

    • כדי למחוק את קטגוריה של Cloud Storage שיצרתם בקטע לפני שמתחילים, כולל קובצי הנתונים שמאוחסנים בקטגוריה:
      gcloud storage rm gs://${BUCKET_NAME} --recursive