Utiliser Presto avec Dataproc

Presto est un moteur de requêtes SQL distribué conçu pour interroger des ensembles de données volumineux répartis entre une ou plusieurs sources de données hétérogènes. Presto peut interroger Hive, Kafka, MySQL et d'autres sources de données par le biais de connecteurs. Ce tutoriel vous explique comment :

  • installer le service Presto sur un cluster Dataproc ;
  • interroger les données publiques d'un client Presto installé sur votre machine locale qui communique avec un service Presto sur votre cluster ;
  • exécuter des requêtes à partir d'une application Java qui communique avec le service Presto sur votre cluster par le biais du pilote Java JDBC de Presto.

Objectifs

  1. Créez un cluster Dataproc sur lequel Presto est installé.

  2. Vous allez ensuite préparer les données. Ce tutoriel utilise l'ensemble de données public sur les trajets des taxis de Chicago, disponible dans BigQuery.

    1. Extrayez les données de BigQuery.
    2. Chargez les données dans Cloud Storage sous forme de fichiers CSV.
    3. Transformez les données :
      1. Présentez les données sous forme d'une table externe Hive pour rendre les données interrogeables par Presto.
      2. Convertissez les données du format CSV au format Parquet pour accélérer les requêtes.
  3. Envoyez des requêtes depuis la CLI Presto ou le code d'application au coordinateur Presto s'exécutant sur le cluster, à l'aide d'un tunnel SSH ou du pilote JDBC de Presto, respectivement.

  4. Vous allez consulter les journaux et surveiller le service Presto par l'intermédiaire de l'interface utilisateur Web de Presto.

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

Utilisez le Simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Si vous ne l'avez pas déjà fait, créez un projet Google Cloud et un bucket Cloud Storage pour stocker les données utilisées dans ce tutoriel.

  1. Configurer le projet

    1. Connectez-vous à votre compte Google.

      Si vous n'en possédez pas déjà un, vous devez en créer un.

    2. Dans Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Cloud.

      Accéder à la page de sélection du projet

    3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

    4. Activer les API Dataproc, Compute Engine, Cloud Storage, and BigQuery.

      Activer les API

    5. Installez et initialisez le SDK Cloud.

  2. Créer un bucket Cloud Storage dans votre projet pour stocker les données utilisées dans ce tutoriel

    1. Dans Cloud Console, accédez à la page Navigateur Cloud Storage.

      Accéder au navigateur Cloud Storage

    2. Cliquez sur Créer un bucket.
    3. Dans la boîte de dialogue Créer un bucket, spécifiez les attributs suivants :
    4. Cliquez sur Créer.

Créer un cluster Dataproc

Créez un cluster Dataproc en utilisant l'option optional-components (disponible sur les versions d'image 1.3 et ultérieures) pour installer le composant facultatif Presto sur le cluster, et en utilisant l'option enable-component-gateway pour activer la Passerelle des composants et ainsi vous permettre d'accéder à l'interface utilisateur Web de Presto depuis Cloud Console.

  1. Définissez les variables d'environnement :
    • PROJECT : ID du projet
    • BUCKET_NAME : nom du bucket Cloud Storage créé à la section Avant de commencer
    • REGION : région dans laquelle le cluster utilisé dans ce tutoriel sera créé (par exemple, "us-west1")
    • WORKERS : trois à cinq nœuds de calcul sont recommandés pour ce tutoriel
    export PROJECT=project-id
    export WORKERS=number
    export REGION=region
    export BUCKET_NAME=bucket-name
    
  2. Exécutez l'outil de ligne de commande gcloud sur votre machine locale pour créer le cluster.
    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
    

Préparer les données

Exportez l'ensemble de données bigquery-public-data chicago_taxi_trips vers Cloud Storage sous forme de fichiers CSV, puis créez une table externe Hive pour référencer les données.

  1. Sur votre ordinateur local, exécutez la commande suivante pour importer les données relatives aux taxis issues de BigQuery sous forme de fichiers CSV sans en-têtes dans le bucket Cloud Storage créé à la section Avant de commencer.
    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. Créez des tables externes Hive sauvegardées sous forme de fichiers CSV et Parquet dans le bucket Cloud Storage.
    1. Créez la table externe Hive 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. Vérifiez que la table externe Hive a été créée.
      gcloud dataproc jobs submit hive \
          --cluster presto-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
      
    3. Créez une autre table externe Hive chicago_taxi_trips_parquet comportant les mêmes colonnes, mais avec des données stockées au format Parquet pour de meilleures performances d'interrogation.
      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. Chargez les données issues de la table CSV Hive dans la table Parquet Hive.
      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. Vérifiez que les données ont été chargées correctement.
      gcloud dataproc jobs submit hive \
          --cluster presto-cluster \
          --region=${REGION} \
          --execute "SELECT COUNT(*) FROM chicago_taxi_trips_parquet;"
      

Exécuter des requêtes

Vous pouvez exécuter des requêtes localement à partir de la CLI Presto ou d'une application.

Requêtes depuis la CLI Presto

Cette section explique comment interroger l'ensemble de données Parquet Hive relatives aux taxis à l'aide de la CLI Presto.

  1. Exécutez la commande suivante sur votre ordinateur local pour vous connecter en SSH au nœud maître de votre cluster. Le terminal local cessera de répondre pendant l'exécution de la commande.
    gcloud compute ssh presto-cluster-m
    
  2. Dans la fenêtre de terminal SSH du nœud maître de votre cluster, exécutez la CLI Presto, qui se connecte au serveur Presto s'exécutant sur le nœud maître.
    presto --catalog hive --schema default
    
  3. Lorsque l'invite presto:default s'affiche, vérifiez que Presto a accès aux tables Hive.
    show tables;
    
    Table
    ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
     chicago_taxi_trips_csv
     chicago_taxi_trips_parquet
    (2 rows)
    
  4. Exécutez les requêtes depuis l'invite presto:default, et comparez les performances d'interrogation des données Parquet par rapport aux données CSV.
    • Requête de données 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]
    • Requête de données 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]

Requêtes depuis une application Java

Pour exécuter des requêtes depuis une application Java par le biais du pilote Java JDBC de Presto :

  1. Téléchargez le pilote Java JDBC de Presto.

  2. Ajoutez une dépendance presto-jdbc dans le fichier Maven pom.xml.

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

Exemple de code Java

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();
    }
  }
}

Journalisation et surveillance

Logging

Les journaux Presto se trouvent sous /var/log/presto/ sur les nœuds maîtres et les nœuds de calcul du cluster.

UI Web

Consultez la section Afficher les URL de la passerelle des composants et y accéder pour ouvrir l'interface utilisateur Web de Presto s'exécutant sur le nœud maître du cluster dans votre navigateur local.

Monitoring

Presto présente les informations d'exécution du cluster dans des tables d'exécution. Dans une invite de session Presto (depuis presto:default), exécutez la requête suivante pour afficher les données des tables d'exécution :

select * FROM system.runtime.nodes;

Nettoyer

Une fois que vous avez terminé le tutoriel sur l'utilisation de Presto avec Cloud Dataproc, vous pouvez nettoyer les ressources que vous avez créées sur Google Cloud afin qu'elles ne prennent pas de quota et qu'elles ne vous soient plus facturées. Dans les sections suivantes, nous allons voir comment supprimer ou désactiver ces ressources.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer le cluster

  • Pour supprimer le cluster :
    gcloud dataproc clusters delete --project=${PROJECT} presto-cluster \
        --region=${REGION}
    

Supprimer le bucket

  • Pour supprimer le bucket Cloud Storage créé à la section Avant de commencer, y compris les fichiers de données stockés dans le bucket :
    gsutil -m rm -r gs://${BUCKET_NAME}