Use o Trino com o Dataproc

O Trino (anteriormente Presto) é um motor de consultas SQL distribuído concebido para consultar grandes conjuntos de dados distribuídos por uma ou mais origens de dados heterogéneas. O Trino pode consultar o Hive, o MySQL, o Kafka e outras origens de dados através de conetores. Este tutorial mostra como:

  • Instale o serviço Trino num cluster do Dataproc
  • Consultar dados públicos a partir de um cliente Trino instalado na sua máquina local que comunica com um serviço Trino no seu cluster
  • Execute consultas a partir de uma aplicação Java que comunica com o serviço Trino no seu cluster através do controlador JDBC Java do Trino.

Objetivos

  • Crie um cluster do Dataproc com o Trino instalado
  • Prepare os dados. Este tutorial usa o conjunto de dados público Chicago Taxi Trips, disponível no BigQuery.
    1. Extraia os dados do BigQuery
    2. Carregue os dados no Cloud Storage como ficheiros CSV
    3. Transformar dados:
      1. Exponha os dados como uma tabela externa do Hive para que os dados possam ser consultados pelo Trino
      2. Converta os dados do formato CSV para o formato Parquet para tornar as consultas mais rápidas
  • Envie consultas de código de aplicação ou CLI do Trino através de um túnel SSH ou do controlador JDBC do Trino, respetivamente, para o coordenador do Trino em execução no cluster
  • Verifique os registos e monitorize o serviço Trino através da IU Web do Trino
  • Custos

    Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

    Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

    Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

    Antes de começar

    Se ainda não o fez, crie um Google Cloud projeto e um contentor do Cloud Storage para armazenar os dados usados neste tutorial. 1. Configurar o seu projeto
    1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
    2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

      Go to project selector

    3. Verify that billing is enabled for your Google Cloud project.

    4. Enable the Dataproc, Compute Engine, Cloud Storage, and BigQuery APIs.

      Roles required to enable APIs

      To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the APIs

    5. Install the Google Cloud CLI.

    6. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

    7. Para inicializar a CLI gcloud, execute o seguinte comando:

      gcloud init
    8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

      Go to project selector

    9. Verify that billing is enabled for your Google Cloud project.

    10. Enable the Dataproc, Compute Engine, Cloud Storage, and BigQuery APIs.

      Roles required to enable APIs

      To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the APIs

    11. Install the Google Cloud CLI.

    12. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

    13. Para inicializar a CLI gcloud, execute o seguinte comando:

      gcloud init
    14. 1. Criar um contentor do Cloud Storage no seu projeto para armazenar os dados usados neste tutorial.
      1. In the Google Cloud console, go to the Cloud Storage Buckets page.

        Go to Buckets

      2. Click Create.
      3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
        1. In the Get started section, do the following:
          • Enter a globally unique name that meets the bucket naming requirements.
          • To add a bucket label, expand the Labels section (), click Add label, and specify a key and a value for your label.
        2. In the Choose where to store your data section, do the following:
          1. Select a Location type.
          2. Choose a location where your bucket's data is permanently stored from the Location type drop-down menu.
          3. To set up cross-bucket replication, select Add cross-bucket replication via Storage Transfer Service and follow these steps:

            Set up cross-bucket replication

            1. In the Bucket menu, select a bucket.
            2. In the Replication settings section, click Configure to configure settings for the replication job.

              The Configure cross-bucket replication pane appears.

              • To filter objects to replicate by object name prefix, enter a prefix that you want to include or exclude objects from, then click Add a prefix.
              • To set a storage class for the replicated objects, select a storage class from the Storage class menu. If you skip this step, the replicated objects will use the destination bucket's storage class by default.
              • Click Done.
        3. In the Choose how to store your data section, do the following:
          1. Select a default storage class for the bucket or Autoclass for automatic storage class management of your bucket's data.
          2. To enable hierarchical namespace, in the Optimize storage for data-intensive workloads section, select Enable hierarchical namespace on this bucket.
        4. In the Choose how to control access to objects section, select whether or not your bucket enforces public access prevention, and select an access control method for your bucket's objects.
        5. In the Choose how to protect object data section, do the following:
          • Select any of the options under Data protection that you want to set for your bucket.
            • To enable soft delete, click the Soft delete policy (For data recovery) checkbox, and specify the number of days you want to retain objects after deletion.
            • To set Object Versioning, click the Object versioning (For version control) checkbox, and specify the maximum number of versions per object and the number of days after which the noncurrent versions expire.
            • To enable the retention policy on objects and buckets, click the Retention (For compliance) checkbox, and then do the following:
              • To enable Object Retention Lock, click the Enable object retention checkbox.
              • To enable Bucket Lock, click the Set bucket retention policy checkbox, and choose a unit of time and a length of time for your retention period.
          • To choose how your object data will be encrypted, expand the Data encryption section (), and select a Data encryption method.
      4. Click Create.

      Crie um cluster do Dataproc

      Crie um cluster do Dataproc com a flag optional-components (disponível na versão 2.1 e posterior da imagem) para instalar o componente opcional do Trino no cluster e a flag enable-component-gateway para ativar o Component Gateway, o que lhe permite aceder à IU Web do Trino a partir da Google Cloud consola.

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

      Prepare os dados

      Exporte o conjunto de dados bigquery-public-data chicago_taxi_trips para o Cloud Storage como ficheiros CSV e, em seguida, crie uma tabela externa do Hive para referenciar os dados.

      1. Na sua máquina local, execute o seguinte comando para importar os dados de táxi do BigQuery como ficheiros CSV sem cabeçalhos para o contentor do Cloud Storage que criou 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 base nos ficheiros CSV e Parquet no seu contentor 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 do Hive.
          gcloud dataproc jobs submit hive \
              --cluster trino-cluster \
              --region=${REGION} \
              --execute "SELECT COUNT(*) FROM chicago_taxi_trips_csv;"
          
        3. Crie outra tabela externa do Hive chicago_taxi_trips_parquet com as mesmas colunas, mas com dados armazenados no formato Parquet para um melhor 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 do Hive para a tabela Parquet do 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

      Pode executar consultas localmente a partir da CLI do Trino ou de uma aplicação.

      Consultas da CLI do Trino

      Esta secção demonstra como consultar o conjunto de dados de táxis do Hive Parquet através da CLI do Trino.

      1. Execute o seguinte comando na sua máquina local para estabelecer uma ligação SSH ao nó principal do cluster. O terminal local deixa de responder durante a execução do comando.
        gcloud compute ssh trino-cluster-m
        
      2. Na janela do terminal SSH no nó principal do cluster, execute a CLI do Trino, que se liga ao servidor Trino em execução no nó principal.
        trino --catalog hive --schema default
        
      3. No comando 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 comando trino:default e compare o desempenho da consulta de dados Parquet com dados 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 aplicações Java

      Para executar consultas a partir de uma aplicação Java através do controlador JDBC Java do Trino: 1. Transfira o controlador JDBC Java do Trino. 1. Adicione uma dependência trino-jdbc no ficheiro Maven pom.xml.

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

      Registo e monitorização

      Registo

      Os registos do Trino encontram-se em /var/log/trino/ nos nós principais e de trabalho do cluster.

      IU da Web

      Consulte o artigo Ver e aceder aos URLs do gateway de componentes para abrir a IU Web do Trino em execução no nó principal do cluster no seu navegador local.

      Monitorização

      O Trino expõe informações de tempo de execução do cluster através de tabelas de tempo de execução. Numa sessão do Trino (a partir do comando trino:default), execute a seguinte consulta para ver os dados da tabela de tempo de execução:

      select * FROM system.runtime.nodes;
      

      Limpar

      Depois de concluir o tutorial, pode limpar os recursos que criou para que deixem de usar a quota e incorrer em custos. As secções seguintes descrevem como eliminar ou desativar estes recursos.

      Elimine o projeto

      A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.

      Para eliminar o projeto:

      1. In the Google Cloud console, go to the Manage resources page.

        Go to Manage resources

      2. In the project list, select the project that you want to delete, and then click Delete.
      3. In the dialog, type the project ID, and then click Shut down to delete the project.

      Elimine o cluster

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

      Elimine o contentor

      • Para eliminar o contentor do Cloud Storage que criou em Antes de começar, incluindo os ficheiros de dados armazenados no contentor:
        gcloud storage rm gs://${BUCKET_NAME} --recursive