Crie um conector sink do OSS para exportar dados de um tópico de origem no ApsaraMQ for Kafka para um objeto no Object Storage Service (OSS).
Pré-requisitos
Para mais informações, consulte Prerequisites.
Observações de uso
O conector particiona os dados com base no tempo de processamento do evento, e não no tempo de criação. Ao usar o particionamento por tempo, dados próximos a um limite de tempo podem ser entregues no diretório da próxima janela de tempo.
Tratamento de dados inválidos: ao configurar uma expressão JSONPath para o caminho de partição personalizado ou para o conteúdo do arquivo, se os dados recebidos não corresponderem à regra, o conector entregará esses dados inválidos no diretório
invalidRuleData/do bucket, de acordo com a política de lotes. Caso encontre esse diretório no seu bucket, verifique a expressão JSONPath e certifique-se de que o consumidor não esteja perdendo dados.A latência de ponta a ponta pode variar de segundos a minutos.
Caso a regra JSONPath configurada para o caminho de partição personalizado ou para o conteúdo do arquivo precise extrair dados do corpo da mensagem da origem Kafka, codifique o conteúdo no formato JSON na origem.
O conector grava dados no OSS em tempo real acrescentando-os a um objeto. Em um mesmo caminho de partição, o objeto visível mais recente ainda pode estar recebendo gravações e não está em seu estado final. Tenha cautela ao consumir esses dados.
Faturamento
As tarefas do conector são executadas no Function Compute. O processamento e a transmissão de dados são cobrados de acordo com as tarifas do Function Compute. Para mais informações, consulte Billing overview.
Etapa 1: Crie os recursos do serviço de destino
Crie um bucket no console do OSS. Para mais informações, consulte Create a bucket in the console.
Este exemplo usa um bucket chamado oss-sink-connector-bucket.
Etapa 2: Crie e inicie o conector sink do OSS
Acesse o console do ApsaraMQ for Kafka. Na página Overview, selecione uma região na seção Resource Distribution.
No painel de navegação à esquerda, escolha .
-
Na página Tasks, clique em Create Task.
-
Criação de tarefa
-
Na etapa Source, selecione Message Queue for Apache Kafka como o Data Provider. Configure os parâmetros a seguir e clique em Next.
Parâmetro
Descrição
Exemplo
Região
A região da instância de origem do Message Queue for Apache Kafka.
China (Beijing)
Instância do Kafka
A instância de origem do Message Queue for Apache Kafka.
alikafka_post-cn-jte3****
Tópico
O tópico a partir do qual as mensagens são consumidas.
demo-topic
Group ID
O grupo de consumidores da instância de origem.
-
Quick Create (recomendado): um Group ID no formato
GID_EVENTBRIDGE_xxxé criado automaticamente. -
Use Existing: selecione um Group ID existente. Não compartilhe este Group ID com outros serviços para evitar interrupções no consumo de mensagens.
Quick Create
Offset do consumidor
O offset a partir do qual o consumo de mensagens é iniciado.
-
Latest offset (latest)
-
Earliest offset (earliest)
Latest offset (latest)
Configuração de rede
O tipo de rede para roteamento de mensagens.
-
Basic Network
-
Self-managed Internet
Basic Network
VPC
Necessário apenas se a Configuração de rede estiver definida como Self-managed Internet.
vpc-bp17fapfdj0dwzjkd****
vSwitch
Necessário apenas se a Configuração de rede estiver definida como Self-managed Internet.
vsw-bp1gbjhj53hdjdkg****
Grupo de segurança
Necessário apenas se a Configuração de rede estiver definida como Self-managed Internet.
alikafka_pre-cn-7mz2****
Data Format
O formato de codificação para o conteúdo da mensagem. Recomendamos Json caso não haja requisitos específicos de codificação.
-
Json: codifica dados binários como um objeto JSON no payload usando UTF-8.
-
Text: codifica dados binários como uma string UTF-8 no payload. Este é o formato padrão.
-
Binary: codifica dados binários como uma string codificada em Base64 no payload.
Json
Messages
Parâmetro de Advanced configuration. O número máximo de mensagens por lote. O sistema envia uma solicitação quando a contagem acumulada de mensagens atinge esse valor. Valores válidos: 1 a 10.000.
100
Interval (Unit: Seconds)
Parâmetro de Advanced configuration. O intervalo, em segundos, no qual as mensagens são agregadas e enviadas para o sink. Valores válidos: 0 a 15. O valor 0 indica a entrega imediata das mensagens.
3
-
Na etapa Filtering, defina o Pattern Content para filtrar eventos. Para mais informações, consulte event pattern.
Na etapa Transformation, configure a transformação de dados para executar operações como divisão, mapeamento, enriquecimento e roteamento dinâmico. Para mais informações, consulte Use Function Compute to clean message data.
-
Na etapa Sink, selecione Object Storage Service como o Service Type, configure os parâmetros a seguir e clique em Save.
Parâmetro
Descrição
Exemplo
Bucket do OSS
O bucket do OSS criado.
Importante-
Certifique-se de que o bucket especificado exista e não seja excluído durante a execução da tarefa.
-
A classe de armazenamento do bucket deve ser Standard ou Infrequent Access (IA). Não há suporte para armazenamento de arquivamento.
-
Após a criação de uma tarefa de conector sink do OSS, o sistema gera um caminho de arquivo de sistema
.tmp/no diretório raiz do bucket. Não exclua esse caminho nem use os objetos do OSS contidos nele.
oss-sink-connector-bucket
Storage Path
a/b/c/a.txta/b/c/a.txt{millisecond Unix timestamp}_{8-character random string}A chave de um objeto do OSS é composta por um caminho e um nome. Por exemplo, se a chave do objeto fora/b/c/a.txt, o caminho éa/b/c/e o nome éa.txt. É possível personalizar o caminho de partição. O nome é gerado automaticamente pelo conector no formato:{millisecond Unix timestamp}_{8-character random string}.-
Ao deixar este campo em branco ou defini-lo como
/, o particionamento não é aplicado e os dados são salvos no diretório raiz do bucket. -
Há suporte a variáveis de tempo:
{yyyy},{MM},{dd}e{HH}representam ano, mês, dia e hora, respectivamente. Essas variáveis diferenciam letras maiúsculas de minúsculas. -
Há suporte a expressões JSONPath para personalizar o caminho, por exemplo,
{$.data.topic}e{$.data.partition}. As variáveis JSONPath devem ser expressões JSONPath válidas. Devido às restrições de caminho do OSS, os valores extraídos com JSONPath devem ser do tipointoustring. Esses valores devem conter apenas caracteres UTF-8 padrão e não podem incluir espaços,.., emojis,/ou\. Caso contrário, podem ocorrer exceções de gravação de dados. -
Há suporte a constantes.
NotaO particionamento ajuda a agrupar dados de forma lógica e evita problemas de desempenho causados pelo excesso de objetos pequenos em um único caminho.
O throughput do conector escala de acordo com o número de partições. Poucas partições podem causar baixo throughput e acúmulo de dados. Muitas partições podem levar à fragmentação de dados, ao aumento das operações de gravação e ao excesso de objetos pequenos. Considere as seguintes recomendações:
-
Kafka Source: há suporte a particionamento por tempo e por partição. Para aumentar o throughput, adicione mais partições do Kafka. Por exemplo:
prefix/{yyyy}/{MM}/{dd}/{HH}/{$.data.partition}/ -
Agrupamento de negócios: particiona os dados por um campo de negócio específico. O throughput é determinado pelo número de valores exclusivos desse campo. Por exemplo:
prefixV2/{$.data.body.field}/
Use prefixos constantes diferentes para tarefas distintas a fim de evitar que várias tarefas gravem no mesmo diretório, o que pode causar confusão de dados.
-
alikafka_post-cn-9dhsaassdd****/guide-oss-sink-topic/yyyy/MM/dd/HH
Batch aggregation object size
O tamanho de destino para a agregação de objetos, em MB. Valores válidos: 1 a 1.024.
Nota-
O conector grava dados em lotes de até 16 MB. Como resultado, o tamanho final do objeto pode exceder o valor configurado em até 16 MB.
-
Para cenários de alto tráfego, recomendamos definir o tamanho do objeto de agregação de lotes na casa das centenas de megabytes (por exemplo, 128 MB ou 512 MB) e a janela de tempo no nível de horas (por exemplo, 60 ou 120 minutos).
5
Batch aggregation time window
A janela de tempo para agregação, em minutos. Valores válidos: 1 a 1.440.
1
File Compression
-
No Compression Required: gera um objeto do OSS sem extensão de arquivo.
-
GZIP: gera um objeto com a extensão .gz.
-
Snappy: gera um objeto com a extensão .snappy.
-
Zstd: gera um objeto com a extensão .zstd.
Ao selecionar uma opção de compactação, o conector agrupa os dados em lotes com base no tamanho pré-compactação. Assim, o tamanho do objeto no OSS será menor que o Batch aggregation object size configurado. Após a descompactação, o tamanho se aproxima do valor configurado.
No Compression Required
File Content
-
Complete Data: o conector encapsula a mensagem original no protocolo CloudEvents. No exemplo a seguir, o campo
datacontém os dados da mensagem, e os demais campos são metadados adicionados pelo protocolo CloudEvents.{ "specversion": "1.0", "id": "8e215af8-ca18-4249-8645-f96c1026****", "source": "acs:alikafka", "type": "alikafka:Topic:Message", "subject": "acs:alikafka:alikafka_pre-cn-i7m2msb9****:topic:****", "datacontenttype": "application/json; charset=utf-8", "time": "2022-06-23T02:49:51.589Z", "aliyunaccountid": "182572506381****", "data": { "topic": "****", "partition": 7, "offset": 25, "timestamp": 1655952591589, "headers": { "headers": [], "isReadOnly": false }, "key": "keytest", "value": "hello kafka msg" } } -
Data Extraction: entrega apenas uma parte dos dados extraídos usando uma expressão JSONPath. Por exemplo, ao especificar
$.data, apenas o valor do campodataé entregue ao OSS.
Para reduzir os custos de armazenamento e melhorar a eficiência, use Data Extraction com a expressão
$.datapara entregar apenas a mensagem de origem original ao OSS, sem o encapsulamento do CloudEvents.Data Extraction
$.data -
-
-
Propriedades da tarefa
Configure a política de nova tentativa para entregas de eventos com falha e a forma de lidar com erros. Para mais informações, consulte Retries and dead-letter queues.
-
Retorne à página Tasks. Encontre a tarefa criada e clique em Enable na coluna Actions.
-
Na caixa de diálogo Note, leia a mensagem e clique em OK.
A tarefa leva de 30 a 60 segundos para iniciar. Monitore o progresso na coluna Status da página Tasks.
Etapa 3: Teste o conector sink do OSS
Na página Tasks, clique no tópico de origem na coluna Event Source da tarefa.
Na página de detalhes do tópico, clique em Send Test Message.
-
No painel Start to Send and Consume Message, configure o conteúdo da mensagem da seguinte forma e clique em OK.
Selecione a guia Console. No campo Message Key, insira
oss-sink-k2. No campo Message Content, insiraoss-sink-v2. Para Send to Specified Partition, selecione No. Na página Tasks, clique no bucket de destino na coluna Event Target da tarefa.
-
Na página do bucket, no painel de navegação à esquerda, escolha .
Diretório tmp: caminho de sistema do qual o conector depende. Não exclua nem use objetos do OSS neste caminho.
Diretório de arquivos de dados: os subdiretórios são gerados com base na regra de caminho de partição da tarefa, e os objetos de dados são carregados no diretório mais profundo.
Neste exemplo, o caminho é
/alikafka_<topic>/<partition>/2023/04/18/02/. Isso mostra que os subdiretórios são criados com base no nome do tópico, no número da partição e em uma estrutura de ano/mês/dia/hora. O diretório mais profundo contém objetos de dados como.oss_meta_fileepartition_3_of.... Na coluna Actions à direita do objeto, escolha .
-
Abra o arquivo baixado para visualizar o conteúdo da mensagem.
{"topic":"guide-oss-sink-topic","partition":0,"offset":0,"timestamp":1681378474218,"headers":{"headers":[],"isReadOnly":false},"key":"oss-sink-k2","value":"oss-sink-v2"} {"topic":"guide-oss-sink-topic","partition":0,"offset":1,"timestamp":1681378491498,"headers":{"headers":[],"isReadOnly":false},"key":"oss-sink-k2","value":"oss-sink-v2"} {"topic":"guide-oss-sink-topic","partition":0,"offset":2,"timestamp":1681378492515,"headers":{"headers":[],"isReadOnly":false},"key":"oss-sink-k2","value":"oss-sink-v2"}A saída contém várias mensagens, cada uma formatada como um objeto JSON em uma linha distinta.