Usar o Trino com o Dataproc


Trino (antigo Presto) é uma consulta SQL distribuída mecanismo projetado para consultar grandes conjuntos de dados distribuídos em um ou mais em fontes de dados heterogêneas. O Trino pode consultar dados Hive, MySQL, Kafka e outros dados fontes 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 seu cluster
  • Executar consultas a partir de um aplicativo Java que se comunica com o Serviço do Trino no cluster por meio do driver JDBC do Java para Trino.

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 torná-los 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 de aplicativo usando um túnel SSH ou o JDBC do Trino para o coordenador do Trino em execução no cluster, respectivamente
  • Verificar registros e monitorar o serviço Trino por meio da 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 o 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 seu 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.

    Criar um cluster do Dataproc

    Criar um cluster do Dataproc usando a sinalização optional-components (disponível a partir da versão 2.1 da imagem) para instalar a Componente opcional do Trino na cluster e a sinalização enable-component-gateway para ativar o o Gateway de Componentes, para permitir acessar a IU da Web do Trino no console do Google Cloud.

    1. Defina 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 sua 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 comando a seguir para importar os dados de táxi de BigQuery como arquivos CSV sem cabeçalhos no 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 backup dos arquivos CSV e Parquet em seu bucket do Cloud Storage.
      1. Crie a tabela externa do 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 Formato Parquet para melhorar o desempenho das consultas.
        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 CSV Hive no Tabela 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. 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 a partir da CLI do Trino ou de um aplicativo.

    Consultas da CLI do Trino

    Esta seção demonstra como consultar o conjunto de dados de táxi Hive Parquet usando o 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 o CLI do Trino, que se conecta ao servidor do Trino em execução no mestre nó.
      trino --catalog hive --schema default
      
    3. No prompt trino:default, verifique se o Trino consegue 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 x 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 por meio do driver JDBC do Trino para Java: 1: Faça o download do Driver JDBC do Java para Trino (em inglês). 1. Adicione uma dependência trino-jdbc ao pom.xml do Maven (em inglês).

    <dependency>
      <groupId>io.trino</groupId>
      <artifactId>trino-jdbc</artifactId>
      <version>376</version>
    </dependency>
    
    Exemplo de código 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/ no mestre do cluster. nós de trabalho.

    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 informações do ambiente de execução do cluster usando tabelas de ambiente de execução. Em uma sessão do Trino (do trino:default), execute a seguinte consulta para visualizar os dados da tabela do 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.

    Exclua 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.

    Excluir 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 armazenadas no bucket:
      gcloud storage rm gs://${BUCKET_NAME} --recursive