Presto mit Dataproc verwenden

Presto ist eine verteilte SQL-Abfrage-Engine für die Abfrage großer Datasets, die über eine oder mehrere heterogene Datenquellen verteilt sind. Presto kann Hive, MySQL, Kafka und andere Datenquellen über Connectors abfragen. In dieser Anleitung wird Folgendes erläutert:

  • Presto-Dienst in einem Dataproc-Cluster installieren
  • Öffentliche Daten über einen Presto-Client abfragen, der auf Ihrem lokalen Computer installiert ist und mit einem Presto-Dienst im Cluster kommuniziert
  • Abfragen mit einer Java-Anwendung ausführen, die über den Java-JDBC-Treiber für Presto mit dem Presto-Dienst im Cluster kommuniziert

Ziele

  1. Einen Dataproc-Cluster mit installiertem Presto erstellen

  2. Daten vorbereiten. In dieser Anleitung wird das öffentliche Dataset Chicago Taxi Trips verwendet, das in BigQuery verfügbar ist.

    1. Daten aus BigQuery extrahieren
    2. Daten in Cloud Storage als CSV-Dateien laden
    3. Daten transformieren:
      1. Daten als externe Hive-Tabelle zur Verfügung stellen, damit sie von Presto abgefragt werden können
      2. Daten aus dem CSV-Format in das Parquet-Format konvertieren, um die Abfrage zu beschleunigen
  3. Abfragen über die Presto-Befehlszeile oder Anwendungscode mit einem SSH-Tunnel bzw. Presto-JDBC-Treibern an den Presto-Koordinator senden, der im Cluster ausgeführt wird

  4. Über die Presto-Web-UI Logs ansehen und den Presto-Dienst im Blick behalten

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

Der Preisrechner kann eine Kostenschätzung anhand Ihrer voraussichtlichen Nutzung generieren. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

Erstellen Sie ein Google Cloud-Projekt und einen Cloud Storage-Bucket für die in dieser Anleitung verwendeten Daten, sofern noch nicht geschehen.

  1. Projekt einrichten

    1. Melden Sie sich bei Ihrem Google-Konto an.

      Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

    2. Wählen Sie in der Cloud Console auf der Seite für die Projektauswahl ein Cloud-Projekt aus oder erstellen Sie eines.

      Zur Projektauswahl

    3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

    4. Dataproc, Compute Engine, Cloud Storage, and BigQuery APIs aktivieren.

      Aktivieren Sie die APIs

    5. Installieren und initialisieren Sie das Cloud SDK.

  2. Cloud Storage-Bucket im Projekt für die in dieser Anleitung verwendeten Daten erstellen

    1. Wechseln Sie in der Cloud Console zum Cloud Storage-Browser.

      Zum Cloud Storage-Browser

    2. Klicken Sie auf Bucket erstellen.
    3. Geben Sie im Dialogfeld Bucket erstellen die folgenden Attribute an:
    4. Klicken Sie auf Erstellen.

Dataproc-Cluster erstellen

Erstellen Sie einen Dataproc-Cluster mit dem Flag optional-components (verfügbar ab Image-Version 1.3), um die optionale Komponente "Presto" auf dem Cluster zu installieren, und mit dem Flag enable-component-gateway, um Component Gateway zu aktivieren, damit Sie über die Cloud Console auf die Presto-Web-UI zugreifen können.

  1. Umgebungsvariablen festlegen:
    • PROJECT: Ihre Projekt-ID
    • BUCKET_NAME: Der Name des Cloud Storage-Buckets, den Sie unter Hinweise erstellt haben
    • REGION: Die Region, in der der Cluster für diese Anleitung erstellt wird, z. B. "us-west1"
    • WORKERS: Für diese Anleitung werden drei bis fünf Worker empfohlen.
    export PROJECT=project-id
    export WORKERS=number
    export REGION=region
    export BUCKET_NAME=bucket-name
    
  2. Führen Sie das gcloud-Befehlszeilentool auf Ihrem lokalen Computer aus, um den Cluster zu erstellen.
    gcloud beta dataproc clusters create presto-cluster \
        --project=${PROJECT} \
        --region=${REGION} \
        --num-workers=${WORKERS} \
        --scopes=cloud-platform \
        --optional-components=PRESTO \
        --image-version=1.3  \
        --enable-component-gateway
    

Daten vorbereiten

Exportieren Sie das bigquery-public-data-Dataset chicago_taxi_trips als CSV-Dateien in Cloud Storage und erstellen Sie dann eine externe Hive-Tabelle, um auf die Daten zu verweisen.

  1. Führen Sie den folgenden Befehl auf Ihrem lokalen Computer aus, um die Taxidaten aus BigQuery als CSV-Dateien ohne Header in den Cloud Storage-Bucket zu importieren, den Sie unter Vorbereitung erstellt haben.
    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. Erstellen Sie externe Hive-Tabellen, die von den CSV- und Parquet-Dateien im Cloud Storage-Bucket unterstützt werden.
    1. Erstellen Sie die externe Hive-Tabelle chicago_taxi_trips_csv.
      gcloud dataproc jobs submit hive \
          --cluster presto-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. Prüfen Sie die Erstellung der externen Hive-Tabelle.
      gcloud dataproc jobs submit hive \
          --cluster presto-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
      
    3. Erstellen Sie eine weitere externe Hive-Tabelle chicago_taxi_trips_parquet mit denselben Spalten, aber mit Daten im Parquet-Format, um die Abfrageleistung zu verbessern.
      gcloud dataproc jobs submit hive \
          --cluster presto-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. Laden Sie die Daten aus der Hive-CSV-Tabelle in die Hive Parquet-Tabelle.
      gcloud dataproc jobs submit hive \
          --cluster presto-cluster \
          --region=${REGION} \
          --execute "
              INSERT OVERWRITE TABLE chicago_taxi_trips_parquet
              SELECT * FROM chicago_taxi_trips_csv;"
      
    5. Prüfen Sie, ob die Daten korrekt geladen wurden.
      gcloud dataproc jobs submit hive \
          --cluster presto-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_parquet;"
      

Abfragen ausführen

Sie können Abfragen lokal über die Presto-Befehlszeile oder über eine Anwendung ausführen.

Abfragen über die Presto-Befehlszeile

In diesem Abschnitt wird gezeigt, wie Sie das Hive Parquet-Taxi-Dataset mithilfe der Presto-Befehlszeile abfragen.

  1. Führen Sie den folgenden Befehl auf Ihrem lokalen Computer aus, um eine SSH-Verbindung zum Masterknoten des Clusters herzustellen. Das lokale Terminal reagiert während der Ausführung des Befehls nicht mehr.
    gcloud compute ssh presto-cluster-m
    
  2. Führen Sie im SSH-Terminalfenster auf dem Masterknoten des Clusters die Presto-Befehlszeile aus, die eine Verbindung zum Presto-Server herstellt, der auf dem Masterknoten ausgeführt wird.
    presto --catalog hive --schema default
    
  3. Prüfen Sie an der Eingabeaufforderung presto:default, ob Presto die Hive-Tabellen finden kann.
    show tables;
    
    Table
    ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
     chicago_taxi_trips_csv
     chicago_taxi_trips_parquet
    (2 rows)
    
  4. Führen Sie Abfragen an der Eingabeaufforderung presto:default aus und vergleichen Sie die Leistung von Parquet-Datenabfragen mit CSV-Datenabfragen.
    • Parquet-Datenabfrage
      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-Datenabfrage
      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-Anwendungsabfragen

So führen Sie Abfragen mit einer Java-Anwendung über den Java-JDBC-Treiber für Presto aus:

  1. Laden Sie den Java-JDBC-Treiber für Presto herunter.

  2. Fügen Sie eine presto-jdbc-Abhängigkeit in die Maven-pom.xml ein.

    <dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>0.206</version>
    </dependency>
    

Java-Beispielcode

package dataproc.codelab.presto;

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 PrestoQuery {
  private static final String URL = "jdbc:presto://presto-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 und Monitoring

Logging

Die Presto-Logs befinden sich auf den Master- und Worker-Knoten des Clusters unter /var/log/presto/.

Web-UI

Unter Komponenten-Gateway-URLs ansehen und auf diese zugreifen erfahren Sie, wie Sie die auf dem Masterknoten des Clusters ausgeführte Presto-Web-UI in Ihrem lokalen Browser öffnen.

Überwachung

Presto stellt Informationen zur Clusterlaufzeit über Laufzeittabellen bereit. Führen Sie in einer Presto-Sitzung an der Eingabeaufforderung presto:default die folgende Abfrage aus, um die Daten der Laufzeittabelle anzuzeigen:

select * FROM system.runtime.nodes;

Bereinigen

Nachdem Sie diese Anleitung für Cloud Dataproc abgeschlossen haben, können Sie die in Google Cloud erstellten Ressourcen bereinigen, damit diese keine kostenpflichtigen Kontingente verbrauchen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen oder deaktivieren.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite "Ressourcen verwalten"

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen .
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Cluster löschen

  • So löschen Sie den Cluster:
    gcloud dataproc clusters delete --project=${PROJECT} presto-cluster \
        --region=${REGION}
    

Bucket löschen

  • So löschen Sie den Cloud Storage-Bucket, den Sie unter Hinweise erstellt haben, einschließlich der im Bucket gespeicherten Datendateien:
    gsutil -m rm -r gs://${BUCKET_NAME}