Coral é uma biblioteca para analisar, processar e reescrever visualizações definidas no Hive Metastore e compartilhá-las em vários mecanismos de execução. Ele executa traduções SQL para permitir visualizações expressas em HiveQL (e potencialmente outras linguagens) para serem acessíveis em mecanismos como Trino (anteriormente PrestoSQL), Apache Spark e Apache Pig. Coral não apenas traduz definições de visão entre diferentes dialetos SQL/não SQL, mas também reescreve expressões para produzir semanticamente equivalentes, levando em consideração a semântica da linguagem ou motor de destino. Por exemplo, ele compõe automaticamente novas expressões internas que são equivalentes a cada expressão interna no definição de exibição de origem. Além disso, integra-se com Transport UDFs para habilitar a tradução e execução de funções definidas pelo usuário (UDFs) no Hive, Trino, Spark e Pig.Coral está em desenvolvimento ativo. Atualmente, estamos procurando expandir o conjunto de APIs de linguagem de visualização de entrada além do HiveQL, e implementação de algoritmos de reescrita de consulta para governança de dados e otimização de consulta.
- Participe da discussão com a comunidade no Slack aqui!
Coral consiste nos seguintes módulos:
- Coral-Hive: Converte definições de visualizações do Hive com UDFs para o plano lógico de visualização equivalente;
- Coral-Trino: Converte o plano lógico de visualização em Trino (anteriormente PrestoSQL) SQL e vice-versa;
- Coral-Spark: Converte o plano lógico de exibição em Spark SQL;
- Coral-Pig: Converte o plano lógico de visualização para Pig-latin;
- Coral-Schema: Deriva o esquema Avro de visão usando o plano lógico de visão e os esquemas Avro de entrada de tabelas base;
- Coral-Spark-Plan: Converte as strings do plano Spark em um plano lógico equivalente (em andamento);
- Coral-Service: Serviço que expõe APIs REST que permitem que os usuários interajam com o Coral (consulte Coral-as-a-Service para obter mais detalhes).
Clone the repository:
git clone https://github.com/linkedin/coral.git
Build:
./gradlew clean build
The project is under active development and we welcome contributions of different forms. Please see the Contribution Agreement.
- Coral: A SQL translation, analysis, and rewrite engine for modern data lakehouses, LinkedIn Engineering Blog, 12/10/2020.
- Coral & Transport UDFs: Building Blocks of a Postmodern Data Warehouse, Tech-talk, Facebook HQ, 2/28/2020.
- Transport: Towards Logical Independence Using Translatable Portable UDFs, LinkedIn Engineering Blog, 11/14/2018.
- Dali Views: Functions as a Service for Big Data, LinkedIn Engineering Blog, 11/9/2017.
Coral-as-a-Service ou simplesmente Coral Service é um serviço que expõe APIs REST que permitem que os usuários interajam com o Coral sem necessariamente vir de um mecanismo de computação. Atualmente, o serviço oferece suporte a uma API para tradução de consulta entre diferentes dialetos e outra para interagir com um Hive Metastore local para criar bancos de dados, tabelas e exibições de exemplo para que possam ser referenciados na API de tradução. O serviço pode ser usado em dois modos: modo Hive Metastore remoto e modo Hive Metastore local. O modo remoto usa um Hive Metastore existente (já implantado) para resolver tabelas e exibições, enquanto o modo local cria um Hive Metastore incorporado vazio para que os usuários possam adicionar suas próprias definições de tabela e exibição.
Uma API POST que recebe o corpo da solicitação JSON contendo os seguintes parâmetros e retorna a consulta traduzida:
fromLanguage
: Input dialect (e.g., spark, trino, hive -- see below for supported inputs)toLanguage
: Output dialect (e.g., spark, trino, hive -- see below for supported outputs)query
: SQL query to translate between two dialects
Uma API POST que usa uma instrução SQL para criar um banco de dados/tabela/visualização no metastore local (observação: este endpoint só está disponível com Coral Service no modo metastore local).
- Clone Coral repo
git clone https://github.com/linkedin/coral.git
- No diretório raiz do Coral, acesse o módulo coral-service
cd coral-service
- Build
../gradlew clean build
- Run
../gradlew bootRun --args='--spring.profiles.active=localMetastore'
Fluxo de trabalho de exemplo usando metastore local:
- Crie um banco de dados chamado
db1
no metastore local usando o endpoint /api/catalog-ops/execute
curl --header "Content-Type: application/json" \
--request POST \
--data "CREATE DATABASE IF NOT EXISTS db1" \
http://localhost:8080/api/catalog-ops/execute
Creation successful
- Crie uma tabela chamada
airport
dentro dedb1
no metastore local usando o endpoint /api/catalog-ops/execute
curl --header "Content-Type: application/json" \
--request POST \
--data "CREATE TABLE IF NOT EXISTS db1.airport(name string, country string, area_code int, code string, datepartition string)" \
http://localhost:8080/api/catalog-ops/execute
Creation successful
- Traduza uma consulta em
db1.airport
no metastore local usando o endpoint /api/translations/translate
curl --header "Content-Type: application/json" \
--request POST \
--data '{
"fromLanguage":"hive",
"toLanguage":"trino",
"query":"SELECT * FROM db1.airport"
}' \
http://localhost:8080/api/translations/translate
O resultado da tradução é:
Original query in hive: SELECT * FROM db1.airport
Translated to trino:
SELECT "name", "country", "area_code", "code", "datepartition"
FROM "db1"."airport"
- Adicione o arquivo keytab do cliente Kerberos a
coral-service/src/main/resources
- Appropriately replace all instances of
SET_ME
incoral-service/src/main/resources/hive.properties
- Run
../gradlew bootRun
- Translate a query on existing table/view in remote metastore using the /translate endpoint
- Hive to Trino
- Hive to Spark
- Trino to Spark
Observação: durante as traduções de Trino para Spark, as exibições referenciadas em consultas são consideradas definidas no HiveQL e, portanto, não podem ser usadas ao traduzir uma exibição de Trino. Atualmente, apenas referenciar tabelas base é suportado em consultas Trino. Este caminho de tradução é atualmente um POC e pode precisar de mais melhorias.