Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:Log Service (SLS)

Última atualização: Sep 22, 2026

Saiba como usar o conector do Log Service (SLS).

Contexto

Simple Log Service é um serviço de ponta a ponta para dados de log. Ele ajuda você a coletar, consumir, enviar, consultar e analisar dados de log de forma eficiente. Isso melhora a eficiência de O&M e permite processar grandes volumes de dados de log.

A tabela a seguir lista os recursos do conector SLS.

Categoria

Descrição

Tipos suportados

Tabela de source e tabela de destino

modo de execução

Apenas modo de streaming

Métricas específicas do conector

N/D

Formato de dados

N/D

Tipo de API

SQL, DataStream API e API yaml de ingestão de dados

Atualização ou exclusão de dados na tabela de destino

As tabelas de destino são apenas de adição (append-only); não atualize ou exclua dados.

Recursos

O conector source SLS lê diretamente os campos de atributos das mensagens. A tabela a seguir lista os campos suportados.

Parâmetro

Tipo

Descrição

__source__

STRING METADATA VIRTUAL

Origem da mensagem.

__topic__

STRING METADATA VIRTUAL

Tópico da mensagem.

__timestamp__

BIGINT METADATA VIRTUAL

Hora do log.

__tag__

MAP<VARCHAR, VARCHAR> METADATA VIRTUAL

Tag da mensagem.

Por exemplo, para o atributo "__tag__:__receive_time__":"1616742274", '__receive_time__' e '1616742274' são armazenados como um par chave-valor no mapa. Acesse o valor em SQL, use __tag__['__receive_time__'].

Pré-requisitos

Certifique-se de ter criado um projeto do Log Service e um Logstore. Para mais informações, acesse Crie um projeto e um Logstore.

Limitações

  • Apenas o Ververica Runtime (VVR) 11.1 e versões posteriores suportam o uso do SLS como source síncrono para ingestão de dados definida em yaml.

  • O conector SLS garante apenas a semântica at-least-once (pelo menos uma vez).

  • Não defina o source parallelism com um valor maior que o número de shards, pois isso desperdiça recursos. Além disso, para o Ververica Runtime (VVR) 8.0.5 e versões anteriores, uma alteração no número de shards pode fazer com que o recurso de failover automático falhe, impedindo o consumo de alguns shards.

SQL

Sintaxe

CREATE TABLE sls_table(
  a INT,
  b INT,
  c VARCHAR
) WITH (
  'connector' = 'sls',
  'endPoint' = '<yourEndPoint>',
  'project' = '<yourProjectName>',
  'logStore' = '<yourLogStoreName>',
  'accessId' = '${secret_values.ak_id}',
  'accessKey' = '${secret_values.ak_secret}'
);

Opções WITH

  • Gerais

    Parâmetro

    Descrição

    Tipo

    Obrigatório

    Padrão

    Observações

    connector

    Selecione o conector a ser usado.

    String

    Sim

    Nenhum

    Defina como sls.

    endPoint

    O endpoint do Log Service (SLS).

    String

    Sim

    Nenhum

    Especifique o endereço de acesso VPC do Log Service (SLS). Para mais informações, acesse Service endpoints.

    Nota
    • Por padrão, o Realtime Compute for Apache Flink não pode acesse a internet. Ative o acesso à internet a partir da sua Virtual Private cloud (VPC), use um NAT Gateway. Para mais informações, acesse How do I access the Internet?.

    • Recomendamos que você não acesse o SLS pela internet. Se for necessário, use HTTPS e ative a aceleração de transferência. Para mais informações, acesse Manage transfer acceleration.

    project

    O nome do projeto SLS.

    String

    Sim

    Nenhum

    N/D

    logStore

    O nome do Logstore ou MetricStore.

    String

    Sim

    Nenhum

    Os dados em um Logstore são consumidos da mesma forma que os dados em um MetricStore.

    accessId

    O accesskey ID da sua conta Alibaba cloud.

    String

    Sim

    Nenhum

    Para mais informações, acesse Obtain an accesskey pair.

    Importante

    Para evitar que seu par de accesskey seja exposto, recomendamos o uso de variáveis e especifique o accesskey ID e o accesskey secret. Para mais informações, acesse Project variables.

    accessKey

    O accesskey secret da sua conta Alibaba cloud.

    String

    Sim

    Nenhum

    akless.assume-role.role-name

    O nome da função RAM usada para acesse o SLS.

    String

    Não

    Nenhum

    Se accessId e accessKey não forem especificados, você deve especifique este parâmetro para acesse os recursos do SLS usando uma função RAM.

    A função RAM deve ser referenciada previamente em Access Security/RAM Roles.

    Nota

    Este parâmetro é compatível apenas com o VVR 11.9.0 e versões posteriores.

  • Específicos do source

    Parâmetro

    Descrição

    Tipo

    Obrigatório

    Padrão

    Observações

    enableNewSource

    Especifica se deve usar o novo source de dados que implementa a API FLIP-27.

    Boolean

    Não

    false

    O novo source pode se adaptar automaticamente às alterações de shard e distribuir os shards o mais uniformemente possível entre todas as subtarefas de source.

    Importante
    • Esta opção é compatível apenas com o VVR 8.0.9 e versões posteriores. O valor padrão é true para o VVR 11.1 e versões posteriores.

    • Se você alterar o valor desta opção, não poderá restaurar jobs a partir de um estado salve. Para retomar o consumo a partir de um offset histórico, primeiro inicie o job com a opção consumerGroup para registrar o progresso do consumo no grupo de consumidores do SLS. Em seguida, defina a opção consumeFromCheckpoint como true e reinicie o job sem estado.

    • Se um Logstore tiver shards somente leitura, algumas subtarefas podem continuar solicitando dados de outros shards após terminarem os seus. Isso pode causar uma carga de trabalho desequilibrada, afetando o desempenho. Para mitigar esse problema, ajuste o paralelismo, otimize a estratégia de agendamento ou mescle shards pequenos para reduzir o número de shards e simplificar a alocação de tarefas.

    shardDiscoveryIntervalMs

    O intervalo para descoberta dinâmica de shards.

    Long

    Não

    60000

    Defina esta opção com um valor negativo para desativar a descoberta dinâmica. Unidade: milissegundos.

    Nota
    • O valor deve ser maior ou igual a 60.000 milissegundos (1 minuto).

    • Esta opção só entra em vigor quando enableNewSource é defina como true.

    • Esta opção é compatível apenas com o VVR 8.0.9 e versões posteriores.

    startupMode

    O modo de inicialização para a tabela de source.

    String

    Não

    timestamp

    • timestamp (padrão): Consome logs a partir do horário de início especificado.

    • latest: Inicia o consumo de logs a partir do offset mais recente.

    • earliest: Inicia o consumo de logs a partir do offset mais antigo.

    • consumer_group: Inicia o consumo de logs a partir do offset registrado pelo grupo de consumidores. Se o grupo de consumidores não tiver registrado um offset de consumo para um shard, o consumo começa a partir do offset mais antigo.

    Importante
    • Para versões do VVR anteriores à 11.1, o valor consumer_group não é suportado. Você deve defina consumeFromCheckpoint como true. Nesse caso, o consumo de logs começa a partir do offset registrado pelo grupo de consumidores especificado, e a configuração do modo de inicialização não terá efeito.

    startTime

    O horário de início para o consumo de logs.

    String

    Não

    Horário atual

    O formato é yyyy-MM-dd hh:mm:ss.

    Isso só entra em vigor quando startupMode é defina como timestamp.

    Nota

    As opções startTime e stopTime são baseadas no atributo __receive_time__ no SLS, e não no atributo __timestamp__.

    stopTime

    O horário de término para o consumo de logs.

    String

    Não

    Nenhum

    O formato é yyyy-MM-dd hh:mm:ss.

    Nota
    • Esta opção é usada apenas para consumir logs históricos e deve ser defina com um horário no passado. Se você a defina com um horário futuro, o consumo poderá parar prematuramente se nenhum novo log for gravado, resultando em uma interrupção no fluxo de dados sem mensagens de erro.

    • Se quiser que o job Flink seja encerrado após todos os logs serem consumidos, você também deve defina exitAfterFinish como true.

    consumerGroup

    O nome do grupo de consumidores.

    String

    Não

    Nenhum

    Um grupo de consumidores registra o progresso do consumo. Você pode especifique um nome personalizado sem um formato fixo.

    Nota

    Jobs Flink diferentes devem usar grupos de consumidores diferentes. Se vários jobs Flink usarem o mesmo grupo de consumidores, não haverá coordenação entre eles e cada job consumirá todos os dados. Isso ocorre porque o Flink não usa o grupo de consumidores do SLS para atribuição de partições ao consumir dados do SLS. Como resultado, cada consumidor consome mensagens de forma independente, mesmo que compartilhem o mesmo grupo de consumidores.

    consumeFromCheckpoint

    Especifica se deve consumir a partir de um checkpoint do grupo de consumidores.

    String

    Não

    false

    • true: Você também deve especifique um grupo de consumidores. O programa Flink começa a consumir logs a partir do checkpoint salve no grupo de consumidores. Se o grupo de consumidores não tiver um checkpoint correspondente, o consumo começa a partir do valor de configuração startTime.

    • false (valor padrão): Não inicia o consumo de logs a partir do checkpoint salve para o grupo de consumidores especificado.

    Importante

    Este parâmetro não é mais suportado no VVR 11.1 e versões posteriores. Para essas versões, você deve defina a opção startupMode como consumer_group.

    maxRetries

    O número de tentativas após uma falha ao ler do SLS.

    String

    Não

    3

    N/D

    batchGetSize

    O número de grupos de logs a serem lidos em uma única solicitação.

    String

    Não

    100

    O valor de batchGetSize não pode exceder 1000. Caso contrário, um erro será relatado.

    exitAfterFinish

    Especifica se o job Flink é encerrado após todos os dados serem consumidos.

    String

    Não

    false

    • true: O programa Flink é encerrado após todos os dados serem consumidos.

    • false (padrão): O programa Flink não é encerrado após a conclusão do consumo de dados.

    query

    Importante

    Esta opção foi descontinuada no VVR 11.3, mas as versões posteriores permanecem compatíveis.

    A instrução de consulta para pré-processar dados antes do consumo.

    String

    Não

    Nenhum

    Use esta opção para filtrar dados do SLS antes que o Flink os consuma. Isso reduz custos e melhora a velocidade de processamento.

    Por exemplo, 'query' = '*| where request_method = ''GET''' indica que, antes de o Flink ler dados do SLS, ele primeiro corresponde aos dados onde o valor do campo request_method é 'GET'.

    Nota

    Esta opção usa a linguagem SPL do Log Service (SLS). Para mais informações, acesse SPL syntax.

    Importante
    • Esta opção é compatível apenas com o VVR 8.0.1 e versões posteriores.

    • Este recurso incorre em taxas do Log Service (SLS). Para mais informações, acesse Billing of Log Service.

    processor

    O nome do processador SLS para pré-processamento de dados. Se query e processor forem especificados, query terá precedência e processor será ignorado.

    String

    Não

    Nenhum

    Esta opção filtra dados do SLS antes que o Flink os consuma, o que reduz custos e melhora a velocidade de processamento. Recomendamos o uso de processor em vez de query.

    Por exemplo, 'processor' = 'test-filter-processor' indica que o processador SLS filtra os dados antes de o Flink lê-los do SLS.

    Nota

    Esta opção usa a linguagem SPL do Log Service (SLS). Para mais informações, acesse SPL syntax. Para obter informações sobre como crie ou atualize um processador SLS, acesse Manage processors.

    Importante

    Esta opção é compatível apenas com o VVR 11.3 e versões posteriores.

    Este recurso incorre em taxas do Log Service (SLS). Para mais informações, acesse Billing of Log Service.

    preserveRawBytes

    Especifica se deve buscar e preservar diretamente os bytes brutos transportados pelo SLS quando enableNewSource é defina como true.

    Boolean

    Não

    false

    Quando esta opção está ativada, os campos BINARY/VARBINARY leem o byte[] bruto diretamente, e os campos CHAR/VARCHAR constroem dados de string a partir dos bytes brutos. Outros campos ainda usam a lógica de conversão padrão. O comportamento é consistente com o do source antigo.

    Nota
    • Esta opção é compatível apenas com o VVR 11.8 e versões posteriores.

    • Esta opção só entra em vigor quando enableNewSource é defina como true.

  • Específicos do destino

    Parâmetro

    Descrição

    Tipo

    Obrigatório

    Padrão

    Observações

    topicField

    Especifica um campo cujo valor sobrescreve o atributo __topic__, que indica o tópico do log.

    String

    Não

    Nenhum

    O valor desta opção deve ser um campo existente na tabela.

    timeField

    Especifica um campo cujo valor sobrescreve o atributo __timestamp__, que indica a hora de gravação do log.

    String

    Não

    Horário atual

    O valor desta opção deve ser um campo INT existente na tabela. Se esta opção não for especificada, a hora atual será usada.

    sourceField

    Especifica um campo cujo valor sobrescreve o atributo __source__, que indica a origem do log, como o endereço IP da máquina que gerou o log.

    String

    Não

    Nenhum

    O valor desta opção deve ser um campo existente na tabela.

    partitionField

    Especifica um campo para particionamento. Um hash do valor deste campo determina qual shard recebe os dados, garantindo que registros com o mesmo hash vão para o mesmo shard.

    String

    Não

    Nenhum

    Se esta opção não for especificada, cada registro será gravado aleatoriamente em um shard disponível.

    buckets

    Se partitionField for especificado, esta opção defina o número de buckets para mapear valores de hash.

    String

    Não

    64

    O valor deve ser uma potência de 2 no intervalo [1, 256]. O número de buckets deve ser maior ou igual ao número de shards. Caso contrário, alguns shards podem não receber dados.

    flushIntervalMs

    O intervalo de gravação de dados.

    String

    Não

    2000

    Unidade: milissegundos.

    writeNullProperties

    Especifica se deve gravar valores nulos como strings vazias no SLS.

    Boolean

    Não

    true

    • true (valor padrão): Grava valores nulos no log como strings vazias.

    • false: Os campos avaliados como nulos não são gravados no log.

    Nota

    Esta opção é compatível apenas com o VVR 8.0.6 e versões posteriores.

Mapeamentos de tipo

Tipo Flink

Tipo SLS

BOOLEAN

STRING

VARBINARY

VARCHAR

TINYINT

INTEGER

BIGINT

FLOAT

DOUBLE

DECIMAL

Ingestão de dados (Beta)

Limitações

Este recurso é compatível apenas com as versões 11.1 e posteriores do Realtime Compute for Apache Flink.

Sintaxe

source:
   type: sls
   name: SLS Source
   endpoint: <endpoint>
   project: <project>
   logstore: <logstore>
   accessId: <accessId>
   accessKey: <accessKey>

Parâmetros

Parâmetro

Descrição

Tipo

Obrigatório

Padrão

Observações

type

O tipo do source de dados.

String

Sim

Nenhum

O valor deve ser sls.

endpoint

O endpoint do Log Service (SLS).

String

Sim

Nenhum

O endereço de acesso VPC do Log Service (SLS). Para mais informações, acesse Service Endpoints.

Nota
  • Por padrão, o Realtime Compute for Apache Flink não pode acesse a internet. Use um NAT Gateway para ative a comunicação entre sua Virtual Private cloud (VPC) e a internet. Para mais informações, acesse How can I access the internet?.

  • Não recomendamos acesse o Log Service (SLS) pela internet. Se for necessário, use HTTPS e ative transfer acceleration para o SLS.

accessId

O accesskey ID da sua conta Alibaba cloud.

String

Sim

Nenhum

Para mais informações, acesse How do I view the accesskey ID and accesskey secret information?.

Importante

Para evitar que suas informações de accesskey sejam expostas, recomendamos o uso de uma variável de projeto e especifique o valor do accesskey. Para mais informações, acesse Project variables.

accessKey

O accesskey secret da sua conta Alibaba cloud.

String

Sim

Nenhum

project

O nome do projeto do Log Service (SLS).

String

Sim

Nenhum

Nenhum

logStore

O nome do Logstore ou Metricstore do SLS.

String

Sim

Nenhum

Os dados em um Logstore são consumidos da mesma forma que os dados em um Metricstore.

schema.inference.strategy

A estratégia de inferência de schema.

String

Não

continuous

  • continuous: Realiza a inferência de schema para cada registro de dados. Se os schemas forem incompatíveis, um schema mais amplo é inferido e um evento de alteração de schema é gerado.

  • static: Realiza a inferência de schema apenas uma vez quando o job é iniciado. Os dados subsequentes são analisados com base no schema inicial, e nenhum evento de alteração de schema é gerado.

maxPreFetchLogGroups

O número máximo de grupos de logs a serem lidos de cada shard para a inferência de schema inicial.

Integer

Não

50

Antes de o job ler e processar dados, o conector pré-consome um número especificado de grupos de logs de cada shard para inicializar as informações de schema.

shardDiscoveryIntervalMs

O intervalo, em milissegundos, para descobrir dinamicamente alterações de shard.

Long

Não

60000

Defina este parâmetro com um valor negativo para desativar a descoberta dinâmica.

Nota

O valor deve ser maior ou igual a 60.000 milissegundos (1 minuto).

startupMode

O modo de inicialização.

String

Não

Nenhum

  • timestamp (padrão): Consome logs a partir de um timestamp específico.

  • latest: Consome logs a partir do offset mais recente.

  • earliest: Consome logs a partir do offset mais antigo.

  • consumer_group: Consome logs a partir do offset registrado no grupo de consumidores. Se nenhum offset for registrado para um shard, o consumo começa a partir do offset mais antigo.

startTime

O horário de início para o consumo de logs.

String

Não

Horário atual

O formato é yyyy-MM-dd HH:mm:ss.

Este parâmetro só entra em vigor quando startupMode é defina como timestamp.

Nota

Os parâmetros startTime e stopTime são baseados no atributo __receive_time__ no Log Service (SLS), e não no atributo __timestamp__.

stopTime

O horário de término para o consumo de logs.

String

Não

Nenhum

O formato é yyyy-MM-dd HH:mm:ss.

Nota

Se quiser que o job Flink seja encerrado após todos os logs serem consumidos, você também deve defina exitAfterFinish=true.

consumerGroup

O nome do grupo de consumidores.

String

Não

Nenhum

Um grupo de consumidores registra o progresso do consumo. Você pode especifique qualquer nome personalizado.

batchGetSize

O número de grupos de logs a serem lidos por solicitação.

Integer

Não

100

O valor de batchGetSize não pode exceder 1.000. Caso contrário, ocorrerá um erro.

maxRetries

O número de tentativas se a leitura do Log Service (SLS) falhar.

Integer

Não

3

Nenhum

exitAfterFinish

Especifica se o job Flink é encerrado após todos os dados serem consumidos.

Boolean

Não

false

  • true: O job Flink é encerrado após todos os dados serem consumidos.

  • false (padrão): O job Flink não é encerrado após todos os dados serem consumidos.

query

A instrução de pré-processamento para consumir dados do Log Service (SLS).

String

Não

Nenhum

Use este parâmetro para filtrar dados no Log Service (SLS) antes do consumo para economizar custos e melhorar a velocidade de processamento.

Por exemplo, 'query' = '*| where request_method = ''GET''' filtra dados onde o campo request_method é 'GET' antes de os dados serem lidos pelo Flink.

Nota

A consulta deve usar a sintaxe SPL do Log Service. Para mais informações, acesse SPL syntax.

Importante
  • Para obter informações sobre as regiões onde este recurso está disponível no Log Service (SLS), acesse Consume logs based on rules.

  • Este recurso está em Beta e é gratuito. Você poderá ser cobrado por este recurso no futuro. Para mais informações, acesse Pricing.

compressType

O tipo de compressão para o Log Service (SLS).

String

Não

Nenhum

Os tipos de compressão suportados incluem:

  • lz4

  • deflate

  • zstd

timeZone

O fuso horário para startTime e stopTime.

String

Não

Nenhum

Por padrão, nenhum deslocamento é adicionado.

regionId

A região onde o Log Service (SLS) está implantado.

String

Não

Nenhum

Para mais informações, acesse Supported regions.

signVersion

A versão da assinatura da solicitação para o Log Service (SLS).

String

Não

Nenhum

Para mais informações, acesse Request signatures.

shardModDivisor

O divisor usado ao ler de shards do Logstore.

Int

Não

-1

Para mais informações, acesse Shards.

shardModRemainder

O resto usado ao ler de shards do Logstore.

Int

Não

-1

Para mais informações, acesse Shards.

metadata.list

As colunas de metadados a serem passadas para jobs downstream.

String

Não

Nenhum

Os campos de metadados disponíveis incluem __source__, __topic__, __timestamp__ e __tag__. Separe vários campos com uma vírgula.

decode.table-id.fields

Especifica campos cujos valores são usados para gerar um Table ID ao analisar dados de log do Log Service (SLS).

String

Não

Nenhum

Separe vários campos com vírgula (,). Por exemplo, se o registro de log SLS upstream for {"col0":"a", "col1":"b", "col2":"c"}, os resultados para diferentes configurações de parâmetros são os seguintes:

Configuração

Table ID

Nenhum

Todas as mensagens são Project.Logstore

col0

a

col0,col1

a.b

col0,col1,col2

a.b.c

Nota

Este parâmetro é compatível com as versões 11.6 e posteriores do Realtime Compute for Apache Flink.

fixed-types

Especifica os tipos de dados para campos específicos ao analisar dados de log do Log Service (SLS).

String

Não

Nenhum

Ao analisar dados, especifique os tipos para campos específicos. Use uma vírgula , para separar várias definições de campo. Por exemplo, id BIGINT, name VARCHAR(10) especifique o tipo do campo id como BIGINT e o tipo do campo name como VARCHAR(10).

Nota

Este parâmetro é compatível com as versões 11.6 e posteriores do Realtime Compute for Apache Flink.

timestamp-format.standard

O formato para campos de timestamp nos dados de log do Log Service (SLS).

String

Não

SQL

Valores válidos:

  • SQL: Analisa timestamps de entrada no formato yyyy-MM-dd HH:mm:ss.s{precision} (por exemplo, 2020-12-30 12:13:14.123) e os retorna no mesmo formato.

  • ISO-8601: Analisa timestamps de entrada no formato yyyy-MM-ddTHH:mm:ss.s{precision} (por exemplo, 2020-12-30T12:13:14.123) e os retorna no mesmo formato.

Nota

Este parâmetro é compatível com as versões 11.6 e posteriores do Realtime Compute for Apache Flink.

ingestion.ignore-errors

Especifica se deve ignorar erros que ocorrem durante a análise de dados.

Boolean

Não

false

Nota

Este parâmetro é compatível com as versões 11.6 e posteriores do Realtime Compute for Apache Flink.

ingestion.error-tolerance.max-count

Se ingestion.ignore-errors estiver ativado, o job falhará quando o número acumulado de erros exceder este valor.

Integer

Não

-1

Este parâmetro só entra em vigor quando ingestion.ignore-errors está ativado. O valor padrão de -1 significa que o job ignora todas as exceções de análise.

Nota

Este parâmetro é compatível com as versões 11.6 e posteriores do Realtime Compute for Apache Flink.

Reutilizar um catálogo existente

A partir da versão 11.5 do Realtime Compute for Apache Flink, você pode referenciar um Catálogo SLS integrado criado na página Data Management em jobs de ingestão de dados Flink CDC. Isso evita a necessidade de especifique manualmente as propriedades de conexão.

source:
  type: sls
  using.built-in-catalog: sls_catalog

Atualmente, os jobs de ingestão de dados podem reutilizar automaticamente os seguintes parâmetros do Catálogo SLS integrado:

  • endpoint

  • project

  • accessId

  • accessKey

Para substituir esses parâmetros reutilizados automaticamente, defina-os explicitamente na configuração yaml. Os parâmetros defina no arquivo yaml têm precedência.

Mapeamento de tipo de dados

Se fixed-types não estiver configurado, o seguinte mapeamento de tipo de dados se aplica:

Tipo SLS

Tipo CDC

STRING

STRING

Se fixed-types estiver configurado, o sistema analisa os dados usando os tipos especificados.

Inferência e evolução de schema

  • Pré-consumo de dados de shard e inicialização de schema

    O conector SLS mantém o schema do Logstore do qual está lendo. Antes de ler dados do Logstore, o conector pré-consome até maxPreFetchLogGroups grupos de logs de cada shard. Ele analisa o schema de cada entrada de log e os mescla para inicializar o schema da tabela. Um evento de crie tabela é então gerado com base neste schema inicial antes que o consumo de dados comece.

    Nota

    Para cada shard, o conector tenta consumir dados a partir de uma hora antes do horário atual para analisar o schema do log.

  • Informações de chave primária

    Os logs do Log Service (SLS) não contêm informações de chave primária. Adicione manualmente uma chave primária à tabela usando regras de transformação:

    transform:
      - source-table: <project>.<logstore>
        projection: *
        primary-keys: key1, key2
  • Inferência de schema e alterações de schema

    Após o schema ser inicializado, se schema.inference.strategy for defina como static, o conector SLS analisa cada entrada de log com base no schema inicial e não gera eventos de alteração de schema. Se schema.inference.strategy for defina como continuous, o conector analisa cada entrada de log, infere as colunas físicas e as compara com o schema atual. Se o schema inferido for inconsistente com o schema atual, os schemas são mesclados de acordo com as seguintes regras:

    • Se as colunas físicas inferidas contiverem campos que não estão no schema atual, o conector adiciona esses campos ao schema e gera um evento para adicionar colunas anuláveis.

    • Se as colunas físicas inferidas não contiverem campos que existem no schema atual, o conector retém esses campos, preenche seus dados com NULL e não gera um evento de exclua coluna.

    O conector SLS infere o tipo de dados de todos os campos em cada entrada de log como String. Atualmente, há suporte apenas para a adição de novas colunas. O conector anexa novas colunas ao final do schema e as defina como anuláveis.

Exemplos de código

  • SQL para tabelas de source e destino

    CREATE TEMPORARY TABLE sls_input(
      `time` BIGINT,
      url STRING,
      dt STRING,
      float_field FLOAT,
      double_field DOUBLE,
      boolean_field BOOLEAN,
      `__topic__` STRING METADATA VIRTUAL,
      `__source__` STRING METADATA VIRTUAL,
      `__timestamp__` STRING METADATA VIRTUAL,
       __tag__ MAP<VARCHAR, VARCHAR> METADATA VIRTUAL,
      proctime as PROCTIME()
    ) WITH (
      'connector' = 'sls',
      'endpoint' ='cn-hangzhou-intranet.log.aliyuncs.com',
      'accessId' = '${secret_values.ak_id}',
      'accessKey' = '${secret_values.ak_secret}',
      'starttime' = '2023-08-30 00:00:00',
      'project' ='sls-test',
      'logstore' ='sls-input'
    );
    
    CREATE TEMPORARY TABLE sls_sink(
      `time` BIGINT,
      url STRING,
      dt STRING,
      float_field FLOAT,
      double_field DOUBLE,
      boolean_field BOOLEAN,
      `__topic__` STRING,
      `__source__` STRING,
      `__timestamp__` BIGINT ,
      receive_time BIGINT
    ) WITH (
      'connector' = 'sls',
      'endpoint' ='cn-hangzhou-intranet.log.aliyuncs.com',
      'accessId' = '${ak_id}',
      'accessKey' = '${ak_secret}',
      'project' ='sls-test',
      'logstore' ='sls-output'
    );
    
    INSERT INTO sls_sink
    SELECT 
     `time`,
      url,
      dt,
      float_field,
      double_field,
      boolean_field,
      `__topic__` ,
      `__source__` ,
      `__timestamp__` ,
      cast(__tag__['__receive_time__'] as bigint) as receive_time
    FROM sls_input; 
  • Ingestão de dados com um source de dados SLS

    Use o SLS como source de dados para ingerir dados em tempo real em sistemas downstream suportados. Por exemplo, a configuração a seguir defina um job de ingestão de dados que grava dados de um logstore em um data lake no formato Paimon no Data Lake Formation (DLF). O job infere automaticamente o schema da tabela de destino e suporta a evolução do schema em tempo de execução.

source:
  type: sls
  name: SLS Source
  endpoint: ${endpoint}
  project: test_project
  logstore: test_log
  accessId: ${accessId}
  accessKey: ${accessKey}
   
# Add a primary key to the table.
transform:
  - source-table: \.*.\.*
    projection: \*
    primary-keys: id
    
# Route all data from test_project.test_log to the test_database.inventory table.
route:
  - source-table: test_project.test_log
    sink-table: test_database.inventory

sink:
  type: paimon
  catalog.properties.metastore: rest
  catalog.properties.uri: dlf_uri
  catalog.properties.warehouse: your_warehouse
  catalog.properties.token.provider: dlf
  # (Optional) Enable deletion vectors to improve read performance.
  table.properties.deletion-vectors.enabled: true

DataStream API

Importante

Para ler ou gravar dados com a DataStream API, use um conector DataStream. Para mais informações, acesse Usage of DataStream connectors.

Se você usar uma versão do VVR anterior à 8.0.10, seu job poderá falhar ao iniciar devido à falta de dependências. Para resolver esse problema, adicione o uber-JAR correspondente como uma dependência adicional.

Ler do SLS

O Realtime Compute for Apache Flink fornece a classe SlsSourceFunction, uma implementação de SourceFunction, para ler dados do Simple Log Service (SLS). O exemplo a seguir lê dados do SLS.

public class SlsDataStreamSource {

    public static void main(String[] args) throws Exception {
        // Sets up the streaming execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // Creates an SLS source and prints the data to the console.
        env.addSource(createSlsSource())
                .map(SlsDataStreamSource::convertMessages)
                .print();
        env.execute("SLS Stream Source");
    }

    private static SlsSourceFunction createSlsSource() {
        SLSAccessInfo accessInfo = new SLSAccessInfo();
        accessInfo.setEndpoint("yourEndpoint");
        accessInfo.setProjectName("yourProject");
        accessInfo.setLogstore("yourLogStore");
        accessInfo.setAccessId("yourAccessId");
        accessInfo.setAccessKey("yourAccessKey");

        // The batch get size is required.
        accessInfo.setBatchGetSize(10);

        // Optional parameters
        accessInfo.setConsumerGroup("yourConsumerGroup");
        accessInfo.setMaxRetries(3);

        // Start time for consumption, set to the current time.
        int startInSec = (int) (new Date().getTime() / 1000);

        // Stop time for consumption, where -1 means never stop.
        int stopInSec = -1;

        return new SlsSourceFunction(accessInfo, startInSec, stopInSec);
    }

    private static List<String> convertMessages(SourceRecord input) {
        List<String> res = new ArrayList<>();
        for (FastLogGroup logGroup : input.getLogGroups()) {
            int logsCount = logGroup.getLogsCount();
            for (int i = 0; i < logsCount; i++) {
                FastLog log = logGroup.getLogs(i);
                int fieldCount = log.getContentsCount();
                for (int idx = 0; idx < fieldCount; idx++) {
                    FastLogContent f = log.getContents(idx);
                    res.add(String.format("key: %s, value: %s", f.getKey(), f.getValue()));
                }
            }
        }
        return res;
    }
}

Gravar no SLS

O Realtime Compute for Apache Flink fornece a classe SLSOutputFormat, uma implementação de OutputFormat, para gravar dados no SLS. O exemplo a seguir grava dados no SLS.

public class SlsDataStreamSink {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.fromSequence(0, 100)
                .map((MapFunction<Long, SinkRecord>) aLong -> getSinkRecord(aLong))
                .addSink(createSlsSink())
                .name(SlsDataStreamSink.class.getSimpleName());
        env.execute("SLS Stream Sink");
    }

    private static OutputFormatSinkFunction createSlsSink() {
        Configuration conf = new Configuration();
        conf.setString(SLSOptions.ENDPOINT, "yourEndpoint");
        conf.setString(SLSOptions.PROJECT, "yourProject");
        conf.setString(SLSOptions.LOGSTORE, "yourLogStore");
        conf.setString(SLSOptions.ACCESS_ID, "yourAccessId");
        conf.setString(SLSOptions.ACCESS_KEY, "yourAccessKey");
        SLSOutputFormat outputFormat = new SLSOutputFormat(conf);
        return new OutputFormatSinkFunction<>(outputFormat);
    }

    private static SinkRecord getSinkRecord(Long seed) {
        SinkRecord record = new SinkRecord();
        LogItem logItem = new LogItem((int) (System.currentTimeMillis() / 1000));
        logItem.PushBack("level", "info");
        logItem.PushBack("name", String.valueOf(seed));
        logItem.PushBack("message", "it's a test message for " + seed.toString());
        record.setContent(logItem);
        return record;
    }

}

XML

O SLS DataStream connector está disponível no repositório central do Maven.

<dependency>
    <groupId>com.alibaba.ververica</groupId>
    <artifactId>ververica-connector-sls</artifactId>
    <version>${vvr-version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-format-common</artifactId>
        </exclusion>
    </exclusions>
</dependency>

FAQ

How to resolve a TaskManager OOM (java.lang.OutOfMemoryError: Java heap space) when restoring a failed Flink program?