Linhagem externa¶
A linhagem externa estende a linhagem nativa do Snowflake para incluir fontes de dados e destinos externos, assim você tem uma visibilidade dos fluxos de dados em todo o seu ecossistema de dados. Ela captura a linhagem de ferramentas ETL e bancos de dados de origem externos para criar uma exibição unificada da movimentação dos dados por seu pipeline.
OpenLineage é um padrão aberto para capturar e compartilhar informações de linhagem de dados por diversas ferramentas e plataformas de dados. O Snowflake aproveita essa estrutura aceitando eventos compatíveis com OpenLineage por meio de um ponto de extremidade REST. Ferramentas externas, como dbt e Apache Airflow, podem usar o ponto de extremidade para enviar metadados de linhagem ao Snowflake, que depois incorpora essas informações no gráfico de linhagem nativo exibido no Snowsight.
- Ponto de extremidade REST da linhagem externa
/api/v2/lineage/external-lineage
- URL base do Snowflake para pontos de extremidade REST
https://<account_identifier>.snowflakecomputing.com
Em que
account-identifieré o identificador da sua conta Snowflake. Você pode usar o formato do nome ou do localizador da conta como identificador da sua conta.Por exemplo, se o identificador da sua conta é
myorg-dev_account, o URL base do ponto de extremidade da linhagem externa é:https://myorg-dev_account.snowflakecomputing.com
Fluxo de trabalho da linhagem externa¶
A implementação da linhagem externa para uma ferramenta de dados consiste nas seguintes tarefas:
Conceder os privilégios necessários ao usuário que está se autenticando no ponto de extremidade da linhagem externa.
Configurar sua ferramenta de dados para enviar eventos de OpenLineage ao ponto de extremidade REST do Snowflake.
Escolher um método de autenticação que funcione com as APIs REST do Snowflake e, em seguida, configurar sua ferramenta de dados para usá-lo na autenticação de suas solicitações para o ponto de extremidade da linhagem externa.
Use sua ferramenta de dados como de costume. Os eventos de OpenLineage são enviados ao Snowflake automaticamente e aparecem no gráfico da linhagem nativa no Snowsight.
Se quiser testar o ponto de extremidade da linhagem externa antes de configurar uma ferramenta de dados para emitir eventos de OpenLineage, consulte Enviar solicitações manuais para estabelecer a linhagem.
Visualizar sua linhagem de dados¶
Para visualizar a linhagem de dados no Snowsight, conclua as seguintes etapas:
Faça login no Snowsight com o privilégios necessários.
No menu de navegação, selecione Catalog » Database Explorer e, em seguida, selecione um objeto com suporte como uma tabela ou exibição.
Selecione a guia Lineage.
Quando uma ferramenta de dados envia informações de linhagem ao Snowflake, os objetos externos aparecem no gráfico de linhagem do Snowsight e são rotulados como um nó externo. Por exemplo:
Você pode selecionar um objeto externo ou a linha que conecta os objetos para obter informações adicionais, da mesma forma que na linhagem nativa.
Conceder privilégios do Snowflake¶
Depois que uma solicitação REST é autenticada, o Snowflake verifica se o usuário associado à solicitação tem autorização para usar a linhagem externa. O usuário associado à solicitação deve ter uma função que tenha recebido o privilégio INGEST LINEAGE na conta.
Por exemplo, suponha que você queira que as solicitações enviadas pelo usuário do serviço dbt_integration_user apareçam na linhagem do Snowsight. Como administrador, execute os seguintes comandos para criar uma função dedicada, conceder a ela o privilégio necessário e, em seguida, conceder a função ao usuário:
CREATE ROLE dbt_lineage_role;
GRANT INGEST LINEAGE ON ACCOUNT TO ROLE dbt_lineage_role;
GRANT ROLE dbt_lineage_role TO USER dbt_integration_user;
Configurar sua ferramenta de dados¶
Nota
Qualquer ferramenta de dados com uma integração de OpenLineage pode ser configurada para enviar dados de linhagem ao Snowflake. Para obter uma lista completa das ferramentas que têm uma integração, consulte Integrações de OpenLineage.
As seções a seguir apresentam instruções básicas para usar a linhagem externa com o dbt e o Apache AirFlow.
Configurar o dbt para enviar dados de linhagem ao Snowflake¶
Nota
A configuração do dbt para emitir eventos de OpenLineage não é uma exclusividade do Snowflake. A única coisa específica do Snowflake é o ponto de extremidade e o URL base da linhagem externa.
As etapas a seguir descrevem a configuração mínima necessária para definir seu ambiente dbt. Consulte a documentação sobre OpenLineage do dbt e a especificação de OpenLineage para configurar a integração entre OpenLineage e dbt.
Instale a integração entre OpenLineage e dbt:
pip3 install openlineage-dbt
Defina as variáveis de transporte para especificar o URL base, o ponto de extremidade e o token de segurança da linhagem externa.
Por exemplo, se o identificador da sua conta é
MYORG-DEV_ACCOUNT, defina o seguinte código no arquivo de configuração YAML:transport: type: http url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com endpoint: /api/v2/lineage/external-lineage auth: type: api_key apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken... compression: gzip
Substitua os comandos
dbtpordbt-ol. Por exemplo, altere o comandodbt runparadbt-ol run.Esses comandos
dbt-olsão exigidos pela integração entre OpenLineage e dbt e não são exclusivos do Snowflake.
Para obter mais informações sobre as integrações entre OpenLineage e dbt, incluindo outros métodos de definição de variáveis, consulte a documentação sobre OpenLineage do dbt.
Configurar o Airflow para enviar dados de linhagem ao Snowflake¶
Nota
A configuração do Apache Airflow para emitir eventos de OpenLineage não é uma exclusividade do Snowflake. A única coisa específica do Snowflake é o ponto de extremidade e o URL base da linhagem externa.
As etapas a seguir descrevem a configuração mínima necessária para definir seu ambiente Airflow para a versão 2.7 ou superior, que é a versão preferida para OpenLineage. Consulte a documentação sobreOpenLineage do Airflow e a especificação de OpenLineage para configurar a integração entre OpenLineage e Airflow.
Instale a integração de OpenLineage do Airflow para a versão 2.7 ou superior:
pip install apache-airflow-providers-openlineage
Se você usa uma versão mais antiga do Airflow, instale o
openlineage-airflow.Defina as variáveis de transporte para especificar o URL base, o ponto de extremidade e o token de segurança da linhagem externa.
Por exemplo, se o identificador da sua conta é
MYORG-DEV_ACCOUNT, defina o seguinte código no arquivo de configuração YAML:transport: type: http url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com endpoint: /api/v2/lineage/external-lineage auth: type: api_key apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken... compression: gzip
Para obter mais informações sobre as integrações entre OpenLineage e Airflow, incluindo outros métodos de definição de variáveis, consulte a documentação sobre OpenLineage do Airflow.
Escolher um método de autenticação¶
O Snowflake oferece vários métodos para autenticar solicitações para um ponto de extremidade REST do Snowflake, como aquele usado pela linhagem externa. Para obter uma lista completa dos métodos de autenticação, consulte Autenticando o Snowflake REST APIs com Snowflake.
Depois de selecionar seu método de autenticação preferido, você deverá gerar um token de segurança para um usuário específico. O token é usado para associar um usuário à solicitação REST para que o Snowflake possa autenticar o usuário e verificar se ele tem autorização para usar a linhagem externa.
Depois de associar com sucesso um usuário a um token de segurança no Snowflake, você precisará configurar sua ferramenta de dados para autenticar suas solicitações com esse token. Por exemplo, se você usa um arquivo de configuração YAML para definir as variáveis de transporte para OpenLineage, use o código a seguir para especificar o token de segurança que é enviado no cabeçalho da solicitação:
transport:
auth:
type: api_key
apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
Para outros métodos de especificação de token de segurança, consulte a documentação sobre OpenLineage da sua ferramenta de dados.
Enviar solicitações manuais para estabelecer a linhagem¶
A linhagem externa funciona aceitando cargas úteis JSON em conformidade com a especificação de OpenLineage para eventos COMPLETE. Quando integrada a uma ferramenta de dados, a ferramenta emite os eventos COMPLETE. No entanto, você também pode construir um evento COMPLETE e, em seguida, enviá-lo ao ponto de extremidade usando qualquer ferramenta ou linguagem que possa enviar solicitações POST a um ponto de extremidade.
Uma solicitação válida consiste no método, URL base e ponto de extremidade a seguir:
POST https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Em que account_identifier é o identificador da sua conta Snowflake.
O seguinte exemplo mostra como usar o curl para enviar informações de linhagem à linhagem externa:
curl -i -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLsecuritytoken..." \
-H "Accept: application/json" \
-H "User-Agent: myApplicationName/1.0" \
-H "X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT" \
-d "@request_body.json" \
"https://MYORG-DEV_ACCOUNT.snowflakecomputing.com/api/v2/lineage/external-lineage"
Em que request_body.json está em conformidade com a especificação de OpenLineage para eventos COMPLETE. Para obter mais informações sobre a carga útil JSON, consulte Requisitos de carga útil.
Requisitos de carga útil¶
Quando você envia a carga útil JSON em uma solicitação manual para o ponto de extremidade da linhagem externa, a carga útil deve atender aos seguintes requisitos:
Estar em conformidade com a especificação de OpenLineage.
Ser um evento COMPLETE. Ou seja, a propriedade
eventTypedeve serCOMPLETE. Outros tipos de eventos são ignorados.As propriedades
inputseoutputsdevem ser uma combinação de objetos Snowflake e externos. Não é possível usar a linhagem externa para estabelecer uma linhagem entre dois objetos externos ou entre dois objetos Snowflake. Se ambas as propriedades especificarem o mesmo tipo de objeto (Snowflake ou externo), a solicitação retornará o código de status HTTP 404.Incluir as seguintes propriedades:
inputsoutputseventTypeeventTimejob
Se preferir, inclua a propriedade
run, que é útil na identificação do trabalho. A carga útil pode conter propriedades adicionais, mas o Snowflake as ignora.
Exemplo de carga útil mínima¶
O exemplo a seguir mostra uma carga útil mínima que você pode enviar ao ponto de extremidade da linhagem externa:
{
"eventType": "COMPLETE",
"eventTime": "2025-03-12T06:51:12.000Z",
"job": {"namespace": "exampleNamespace", "name": "exampleJob"},
"run": {"runId": "123e4567-e89b-12d3-a456-426614174000"},
"producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
"inputs": [{"namespace": "snowflake://AXORG-AX_TEST_PP8", "name": "OL_TEST.OL_TEST_SCH.TEST_DEMO"}],
"outputs": [{"namespace": "postgres://localhost:5432", "name": "PDB.SCH.OUTPUT"}]
}
Especificando os tipos de objeto¶
Na matriz outputs da carga útil, você pode usar o campo facets para especificar o tipo do objeto, que pode ser qualquer cadeia de caracteres definida pelo usuário. Por exemplo, o seguinte trecho da carga útil especifica que o objeto é do tipo VIEW:
"outputs": [
{
"namespace": "postgres://db.company.com:5432",
"name": "db.schema.view",
"facets": {"datasetType": {"datasetType": "VIEW"}},
},
],
Se você não especificar um campo facets, o tipo de objeto será definido como o padrão External Node.
Especificando várias entradas¶
Se uma carga útil incluir mais de uma entrada, a linhagem resultante mostrará a saída como um objeto downstream de ambas as entradas. Por exemplo, se uma carga útil tiver uma entrada A e B junto com uma saída C, a linhagem mostrará tanto A-C quanto B-C.
Enviar solicitações para remover a linhagem¶
Você pode enviar uma solicitação DELETE ao ponto de extremidade da linhagem externa para remover a linhagem estabelecida entre um objeto Snowflake e um objeto externo.
Para separar a linhagem entre o objeto de origem e o objeto de destino, use parâmetros de consulta URL para especificar os detalhes sobre os dois objetos.
Para separar a linhagem entre um objeto e todos os respectivos objetos downstream, especifique o objeto de origem sem especificar um objeto de destino.
Para remover um objeto de destino do gráfico de linhagem, independentemente de quantos objetos estejam acima dele, especifique o objeto de destino sem especificar um objeto de origem.
Uma solicitação válida para remover a linhagem consiste no método, no URL base e no ponto de extremidade a seguir:
DELETE https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Parâmetro de consulta |
Descrição |
|---|---|
|
Namespace do conjunto de dados de origem. |
|
Nome totalmente qualificado do conjunto de dados de origem. |
|
Tipo do conjunto de dados de origem (por exemplo, TABLE, VIEW, DATASET). Por padrão, o valor deve ser o nó externo. Se você inseriu um valor no campo |
|
Namespace do conjunto de dados de destino. |
|
Nome totalmente qualificado do conjunto de dados de destino. |
|
Tipo do conjunto de dados de destino (por exemplo, TABLE, VIEW, DATASET). Por padrão, o valor deve ser o nó externo. Se você inseriu um valor no campo |
Controle de acesso para remoção de linhagem¶
O usuário que envia uma solicitação para remover a linhagem entre objetos deve ter o privilégio DELETE LINEAGE na conta.
Limitações e considerações¶
Um objeto Snowflake deve ser INPUT ou OUTPUT de um evento COMPLETE. Ou seja, a linhagem externa não ingere eventos de linhagem quando nem os dados de entrada nem os dados de saída são um objeto Snowflake.
O Snowflake não oferece suporte a OpenLineage versão 2.
O período de retenção para eventos de linhagem externa é de um ano.
O Snowflake reconhece apenas eventos de linhagem COMPLETE. Todos os outros eventos emitidos por uma ferramenta de dados são ignorados.
A linhagem de fontes externas não aparece na saída da função GET_LINEAGE.
A linhagem externa não oferece suporte à linhagem de colunas.
O nome totalmente qualificado de um conjunto de dados, ou seja, a entrada ou a saída, não pode exceder 1.000 caracteres.
Não é possível armazenar mais de 10.000 eventos na mesma conta. Se atingir esse limite, você terá que excluir eventos antes de adicionar novos.