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 |
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 parallelismcom 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 defailoverautomá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.
ImportantePara 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.NotaEste 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 é
truepara 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
consumerGrouppara registrar o progresso do consumo no grupo de consumidores do SLS. Em seguida, defina a opçãoconsumeFromCheckpointcomotruee 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 comotrue. -
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
consumeFromCheckpointcomotrue. 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 comotimestamp.NotaAs opções
startTimeestopTimesã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
exitAfterFinishcomotrue.
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.
NotaJobs 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.
ImportanteEste parâmetro não é mais suportado no VVR 11.1 e versões posteriores. Para essas versões, você deve defina a opção
startupModecomoconsumer_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
batchGetSizenã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
ImportanteEsta 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 camporequest_methodé 'GET'.NotaEsta 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
queryeprocessorforem especificados,queryterá precedência eprocessorserá 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
processorem vez dequery.Por exemplo,
'processor' = 'test-filter-processor'indica que o processador SLS filtra os dados antes de o Flink lê-los do SLS.NotaEsta 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.
ImportanteEsta 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 comotrue.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 comotrue.
-
-
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
INTexistente 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
partitionFieldfor 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.
NotaEsta 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 |
||||||||||
|
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
|
||||||||||
|
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 |
|
||||||||||
|
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 |
|
||||||||||
|
startTime |
O horário de início para o consumo de logs. |
String |
Não |
Horário atual |
O formato é Este parâmetro só entra em vigor quando Nota
Os parâmetros |
||||||||||
|
stopTime |
O horário de término para o consumo de logs. |
String |
Não |
Nenhum |
O formato é Nota
Se quiser que o job Flink seja encerrado após todos os logs serem consumidos, você também deve defina |
||||||||||
|
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 |
|
||||||||||
|
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, Nota
A consulta deve usar a sintaxe SPL do Log Service. Para mais informações, acesse SPL syntax. Importante
|
||||||||||
|
compressType |
O tipo de compressão para o Log Service (SLS). |
String |
Não |
Nenhum |
Os tipos de compressão suportados incluem:
|
||||||||||
|
timeZone |
O fuso horário para |
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 |
||||||||||
|
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
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 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:
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 |
Integer |
Não |
-1 |
Este parâmetro só entra em vigor quando 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é
maxPreFetchLogGroupsgrupos 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.NotaPara 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 comocontinuous, 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
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>