Menggunakan Trino dengan Dataproc

Trino (sebelumnya Presto) adalah mesin kueri SQL terdistribusi yang dirancang untuk membuat kueri set data besar yang didistribusikan melalui satu atau beberapa sumber data heterogen. Trino dapat membuat kueri Hive, MySQL, Kafka, dan sumber data lainnya melalui konektor. Tutorial ini menunjukkan kepada Anda cara:

  • Menginstal layanan Trino di cluster Dataproc
  • Membuat kueri data publik dari klien Trino yang diinstal di komputer lokal Anda yang berkomunikasi dengan layanan Trino di cluster Anda
  • Jalankan kueri dari aplikasi Java yang berkomunikasi dengan layanan Trino di cluster Anda melalui driver JDBC Java Trino.

Membuat cluster Dataproc

Buat cluster Dataproc menggunakan flag optional-components (tersedia di versi image 2.1 dan yang lebih baru) untuk menginstal komponen opsional Trino di cluster dan flag enable-component-gateway untuk mengaktifkan Component Gateway agar Anda dapat mengakses UI Web Trino dari konsol Google Cloud .

  1. Tetapkan variabel lingkungan:
    • PROJECT: project ID Anda
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda buat di Sebelum memulai
    • REGION: region tempat cluster yang digunakan dalam tutorial ini akan dibuat, misalnya, "us-west1"
    • PEKERJA: 3 - 5 pekerja direkomendasikan untuk tutorial ini
    export PROJECT=project-id
    export WORKERS=number
    export REGION=region
    export BUCKET_NAME=bucket-name
    
  2. Jalankan Google Cloud CLI di komputer lokal Anda untuk membuat cluster.
    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
    

Menyiapkan data

Ekspor set data bigquery-public-data chicago_taxi_trips ke Cloud Storage sebagai file CSV, lalu buat tabel eksternal Hive untuk mereferensikan data.

  1. Di mesin lokal Anda, jalankan perintah berikut untuk mengimpor data taksi dari BigQuery sebagai file CSV tanpa header ke bucket Cloud Storage yang Anda buat di Sebelum memulai.
    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. Buat tabel eksternal Hive yang didukung oleh file CSV dan Parquet di bucket Cloud Storage Anda.
    1. Buat tabel eksternal 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. Verifikasi pembuatan tabel eksternal Hive.
      gcloud dataproc jobs submit hive \
          --cluster trino-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
      
    3. Buat tabel eksternal Hive lain chicago_taxi_trips_parquet dengan kolom yang sama, tetapi dengan data yang disimpan dalam format Parquet untuk performa kueri yang lebih baik.
      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. Muat data dari tabel CSV Hive ke tabel 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. Pastikan data dimuat dengan benar.
      gcloud dataproc jobs submit hive \
          --cluster trino-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_parquet;"
      

Menjalankan kueri

Anda dapat menjalankan kueri secara lokal dari Trino CLI atau dari aplikasi.

Kueri Trino CLI

Bagian ini menunjukkan cara mengkueri set data taksi Hive Parquet menggunakan Trino CLI.

  1. Jalankan perintah berikut di mesin lokal Anda untuk melakukan SSH ke node master cluster Anda. Terminal lokal akan berhenti merespons selama eksekusi perintah.
    gcloud compute ssh trino-cluster-m
    
  2. Di jendela terminal SSH pada node master cluster Anda, jalankan CLI Trino, yang terhubung ke server Trino yang berjalan di node master.
    trino --catalog hive --schema default
    
  3. Pada perintah trino:default, pastikan Trino dapat menemukan tabel Hive.
    show tables;
    
    Table
    ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
     chicago_taxi_trips_csv
     chicago_taxi_trips_parquet
    (2 rows)
    
  4. Jalankan kueri dari perintah trino:default, dan bandingkan performa kueri data Parquet versus CSV.
    • Kueri data 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]
    • Kueri data 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]

Kueri aplikasi Java

Untuk menjalankan kueri dari aplikasi Java melalui driver JDBC Java Trino: 1. Download driver JDBC Java Trino. 1. Tambahkan dependensi trino-jdbc di pom.xml Maven.

<dependency>
  <groupId>io.trino</groupId>
  <artifactId>trino-jdbc</artifactId>
  <version>376</version>
</dependency>
Contoh kode 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();
    }
  }
}

Logging dan pemantauan

Logging

Log Trino berada di /var/log/trino/ pada node master dan worker cluster.

UI Web

Lihat Melihat dan Mengakses URL Component Gateway untuk membuka UI Web Trino yang berjalan di node master cluster di browser lokal Anda.

Pemantauan

Trino mengekspos informasi runtime cluster melalui tabel runtime. Dalam sesi Trino (dari prompt trino:default), jalankan kueri berikut untuk melihat data tabel runtime:

select * FROM system.runtime.nodes;