Usar o Trino com o Dataproc


O Trino (antigo Presto) é um mecanismo de consulta SQL distribuído projetado para consultar grandes conjuntos de dados distribuídos em uma ou mais fontes de dados heterogêneas. O Trino pode consultar Hive, MySQL, Kafka e outras fontes de dados por meio de conectores. Neste tutorial, mostramos como fazer as seguintes tarefas:

  • Instalar o serviço Trino em um cluster do Dataproc
  • Consulte dados públicos de um cliente Trino instalado na máquina local que se comunica com um serviço do Trino no cluster.
  • Execute consultas em um aplicativo Java que se comunica com o serviço do Trino no seu cluster por meio do driver JDBC do Trino para Java.

Objetivos

  • Criar um cluster do Dataproc com o Trino instalado
  • Preparar dados. Este tutorial usa o conjunto de dados público Chicago Taxi Trips, disponível no BigQuery.
    1. Extrair os dados do BigQuery
    2. Carregar os dados no Cloud Storage como arquivos CSV
    3. Transformar dados:
      1. Expor os dados como uma tabela externa Hive para tornar os dados consultáveis pelo Trino
      2. Converter os dados do formato CSV para o formato Parquet para agilizar as consultas
  • Enviar a CLI do Trino ou consultas de código do aplicativo usando um túnel SSH ou um driver JDBC do Trino, respectivamente, para o coordenador do Trino em execução no cluster
  • Verifique os registros e monitore o serviço do Trino pela interface da Web do Trino.
  • Custos

    Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

    Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

    Antes de começar

    Se você ainda não tiver feito isso, crie um projeto do Google Cloud e um bucket do Cloud Storage para armazenar os dados usados neste tutorial. 1. Como configurar seu projeto
    1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
    2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

      Acessar o seletor de projetos

    3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

    4. Ative as APIs Dataproc, Compute Engine, Cloud Storage, and BigQuery.

      Ative as APIs

    5. Instale a CLI do Google Cloud.
    6. Para inicializar a CLI gcloud, execute o seguinte comando:

      gcloud init
    7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

      Acessar o seletor de projetos

    8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

    9. Ative as APIs Dataproc, Compute Engine, Cloud Storage, and BigQuery.

      Ative as APIs

    10. Instale a CLI do Google Cloud.
    11. Para inicializar a CLI gcloud, execute o seguinte comando:

      gcloud init
    1. Como criar um bucket do Cloud Storage no projeto para armazenar os dados usados neste tutorial.
    1. No console do Cloud, acesse a página Buckets do Cloud Storage.

      Acessar a página "Buckets"

    2. Clique em Criar bucket.
    3. Na página Criar um bucket, insira as informações do seu bucket. Para ir à próxima etapa, clique em Continuar.
    4. Clique em Criar.

    Crie um cluster do Dataproc:

    Crie um cluster do Dataproc usando a sinalização optional-components (disponível na versão de imagem 2.1 e mais recentes) para instalar o componente opcional Treino no cluster e a sinalização enable-component-gateway para ativar o Gateway de componentes e permitir o acesso à interface da Web do Trino no console do Google Cloud.

    1. Defina as variáveis de ambiente:
      • PROJECT: ID do projeto
      • BUCKET_NAME: o nome do bucket do Cloud Storage que você criou em Antes de começar
      • REGION: região onde o cluster usado neste tutorial será criado, por exemplo, "us-west1"
      • WORKERS: 3 a 5 workers são recomendados para este tutorial
      export PROJECT=project-id
      export WORKERS=number
      export REGION=region
      export BUCKET_NAME=bucket-name
      
    2. Execute a Google Cloud CLI na máquina local para criar o 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
      

    Preparar dados

    Exporte o conjunto de dados bigquery-public-data chicago_taxi_trips para o Cloud Storage como arquivos CSV e crie uma tabela externa Hive para fazer referência aos dados.

    1. Na máquina local, execute o seguinte comando para importar os dados de táxi do BigQuery como arquivos CSV sem cabeçalhos para o bucket do Cloud Storage criado em Antes de começar.
      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. Crie tabelas externas do Hive com suporte dos arquivos CSV e Parquet no bucket do Cloud Storage.
      1. Crie a tabela externa 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. Verifique a criação da tabela externa Hive.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
        
      3. Crie outra tabela externa Hive chicago_taxi_trips_parquet com as mesmas colunas, mas com dados armazenados no formato Parquet para melhorar o desempenho da consulta.
        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. Carregue os dados da tabela Hive CSV na tabela Hive Parquet.
        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. Verifique se os dados foram carregados corretamente.
        gcloud dataproc jobs submit hive \
            --cluster trino-cluster \
            --region=${REGION} \
            --execute "SELECT COUNT(*) FROM chicago_taxi_trips_parquet;"
        

    Executar consultas

    É possível executar consultas localmente na CLI Trino ou em um aplicativo.

    Consultas da CLI do Trino

    Nesta seção, demonstramos como consultar o conjunto de dados de táxi Hive Parquet usando a CLI do Trino.

    1. Execute o seguinte comando na máquina local para SSH no nó mestre do cluster. O terminal local deixará de responder durante a execução do comando.
      gcloud compute ssh trino-cluster-m
      
    2. Na janela do terminal SSH no nó mestre do cluster, execute a CLI Trino, que se conecta ao servidor do Trino em execução no nó mestre.
      trino --catalog hive --schema default
      
    3. No prompt trino:default, verifique se o Trino pode encontrar as tabelas do Hive.
      show tables;
      
      Table
      ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
       chicago_taxi_trips_csv
       chicago_taxi_trips_parquet
      (2 rows)
      
    4. Execute consultas a partir do prompt trino:default e compare o desempenho da consulta de dados Parquet e CSV.
      • Consulta de dados 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]
      • Consulta de dados 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]

    Consultas de aplicativos Java

    Para executar consultas de um aplicativo Java usando o driver JDBC do Trino para Java: 1. Faça o download do driver JDBC do Trino Java. 1. Adicione uma dependência trino-jdbc no pom.xml do Maven.

    <dependency>
      <groupId>io.trino</groupId>
      <artifactId>trino-jdbc</artifactId>
      <version>376</version>
    </dependency>
    
    Código de amostra do 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();
        }
      }
    }
    

    Geração de registros e monitoramento

    Geração de registros

    Os registros do Trino estão localizados em /var/log/trino/ nos nós mestre e de trabalho do cluster.

    IU da Web

    Consulte Como visualizar e acessar URLs do Gateway de componentes para abrir a interface da Web do Trino em execução no nó mestre do cluster no navegador local.

    Monitoramento

    O Trino expõe as informações do ambiente de execução do cluster usando tabelas de ambiente de execução. Em um prompt de sessão do Trino (do trino:default), execute a seguinte consulta para visualizar os dados da tabela de ambiente de execução:

    select * FROM system.runtime.nodes;
    

    Limpar

    Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.

    Excluir o projeto

    O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

    Para excluir o projeto, faça o seguinte:

    1. No Console do Google Cloud, acesse a página Gerenciar recursos.

      Acessar "Gerenciar recursos"

    2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
    3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

    Exclua o cluster

    • Para excluir o cluster:
      gcloud dataproc clusters delete --project=${PROJECT} trino-cluster \
          --region=${REGION}
      

    Excluir o bucket

    • Para excluir o bucket do Cloud Storage criado em Antes de começar, incluindo os arquivos de dados armazenados no bucket:
      gsutil -m rm -r gs://${BUCKET_NAME}