Saída do Azure Stream Analytics para o Azure Cosmos DB
O Azure Stream Analytics pode gerar dados no formato JSON para o Azure Cosmos DB. Ele permite o arquivamento de dados e consultas de baixa latência em dados JSON não estruturados. Este artigo aborda algumas práticas recomendadas para implementar essa configuração (Stream Analytics para Cosmos DB). Se você não estiver familiarizado com o Azure Cosmos DB, consulte a documentação do Azure Cosmos DB para começar.
Nota
- Neste momento, o Stream Analytics suporta a ligação ao Azure Cosmos DB apenas através da API SQL. Outras APIs do Azure Cosmos DB ainda não são suportadas. Se você apontar o Stream Analytics para contas do Azure Cosmos DB criadas com outras APIs, os dados podem não estar armazenados corretamente.
- Recomendamos que você defina seu trabalho para o nível de compatibilidade 1.2 ao usar o Azure Cosmos DB como saída.
Noções básicas do Azure Cosmos DB como destino de saída
A saída do Azure Cosmos DB no Stream Analytics permite gravar os resultados do processamento de fluxo como saída JSON em seus contêineres do Azure Cosmos DB. O Stream Analytics não cria contêineres em seu banco de dados. Em vez disso, requer que você os crie previamente. Em seguida, você pode controlar os custos de cobrança dos contêineres do Azure Cosmos DB. Você também pode ajustar o desempenho, a consistência e a capacidade de seus contêineres diretamente usando as APIs do Azure Cosmos DB. As seções a seguir detalham algumas das opções de contêiner para o Azure Cosmos DB.
Ajustando consistência, disponibilidade e latência
Para corresponder aos requisitos do seu aplicativo, o Azure Cosmos DB permite ajustar o banco de dados e os contêineres e fazer compensações entre consistência, disponibilidade, latência e taxa de transferência.
Dependendo dos níveis de consistência de leitura de que seu cenário precisa em relação à latência de leitura e gravação, você pode escolher um nível de consistência em sua conta de banco de dados. Você pode melhorar a taxa de transferência ampliando as Unidades de Solicitação (RUs) no contêiner. Também por padrão, o Azure Cosmos DB habilita a indexação síncrona em cada operação CRUD para seu contêiner. Essa opção é outra útil para controlar o desempenho de gravação/leitura no Azure Cosmos DB. Para obter mais informações, consulte o artigo Alterar o banco de dados e os níveis de consistência da consulta.
Upserts do Stream Analytics
A integração do Stream Analytics com o Azure Cosmos DB permite inserir ou atualizar registros em seu contêiner com base em uma determinada coluna de ID do Documento. Esta operação também é chamada de upsert. O Stream Analytics usa uma abordagem otimista de atualização. As atualizações acontecem apenas quando uma inserção falha com um conflito de ID de documento.
Com o nível de compatibilidade 1.0, o Stream Analytics executa essa atualização como uma operação PATCH, portanto, permite atualizações parciais do documento. O Stream Analytics adiciona novas propriedades ou substitui uma propriedade existente de forma incremental. No entanto, as alterações nos valores das propriedades da matriz em seu documento JSON resultam na substituição de toda a matriz. Ou seja, a matriz não é mesclada.
Com a versão 1.2, o comportamento de upsert é modificado para inserir ou substituir o documento. A seção posterior sobre o nível de compatibilidade 1.2 descreve melhor esse comportamento.
Se o documento JSON de entrada tiver um campo de ID existente, esse campo será usado automaticamente como a coluna ID do Documento no Azure Cosmos DB. Quaisquer gravações subsequentes são tratadas como tal, levando a uma destas situações:
- IDs exclusivos levam à inserção.
- IDs duplicados e ID de documento definidos como ID levam ao upsert.
- IDs duplicados e ID de documento não definidos levam a erro, após o primeiro documento.
Se você quiser salvar todos os documentos, incluindo aqueles que têm uma ID duplicada, renomeie o campo ID em sua consulta (usando a palavra-chave AS ). Permita que o Azure Cosmos DB crie o campo ID ou substitua a ID pelo valor de outra coluna (usando a palavra-chave AS ou a configuração ID do documento).
Particionamento de dados no Azure Cosmos DB
O Azure Cosmos DB dimensiona automaticamente partições com base na sua carga de trabalho. Portanto, recomendamos que você use contêineres ilimitados para particionar seus dados. Quando o Stream Analytics grava em contêineres ilimitados, ele usa tantos gravadores paralelos quanto a etapa de consulta anterior ou o esquema de particionamento de entrada.
Nota
O Azure Stream Analytics suporta apenas contentores ilimitados com chaves de partição no nível superior. Por exemplo, /region
é suportado. Não há suporte para chaves de partição aninhadas (por exemplo, /region/name
) .
Dependendo da sua escolha de chave de partição, poderá receber este aviso:
CosmosDB Output contains multiple rows and just one row per partition key. If the output latency is higher than expected, consider choosing a partition key that contains at least several hundred records per partition key.
É importante escolher uma propriedade de chave de partição que tenha muitos valores distintos e que permita distribuir sua carga de trabalho uniformemente entre esses valores. Como um artefato natural de particionamento, as solicitações que envolvem a mesma chave de partição são limitadas pela taxa de transferência máxima de uma única partição.
O tamanho de armazenamento para documentos que pertencem ao mesmo valor de chave de partição é limitado a 20 GB (o limite de tamanho de partição física é de 50 GB). Uma chave de partição ideal é aquela que aparece frequentemente como um filtro em suas consultas e tem cardinalidade suficiente para garantir que sua solução seja escalável.
As chaves de partição usadas para consultas do Stream Analytics e do Azure Cosmos DB não precisam ser idênticas. Topologias totalmente paralelas recomendam o uso da chave de partição de entrada, , como a chave de partição da consulta do Stream Analytics, PartitionId
mas essa pode não ser a escolha recomendada para a chave de partição de um contêiner do Azure Cosmos DB.
Uma chave de partição também é o limite para transações em procedimentos armazenados e gatilhos para o Azure Cosmos DB. Você deve escolher a chave de partição para que os documentos que ocorrem juntos em transações compartilhem o mesmo valor de chave de partição. O artigo Particionamento no Azure Cosmos DB fornece mais detalhes sobre como escolher uma chave de partição.
Para contêineres fixos do Azure Cosmos DB, o Stream Analytics não permite aumentar ou diminuir a escala depois que eles estiverem cheios. Eles têm um limite superior de 10 GB e 10.000 RU/s de taxa de transferência. Para migrar os dados de um contêiner fixo para um contêiner ilimitado (por exemplo, um com pelo menos 1.000 RU/s e uma chave de partição), use a ferramenta de migração de dados ou a biblioteca de feed de alterações.
A capacidade de gravar em vários contêineres fixos está sendo preterida. Não o recomendamos para expandir seu trabalho do Stream Analytics.
Taxa de transferência melhorada com nível de compatibilidade 1.2
Com o nível de compatibilidade 1.2, o Stream Analytics suporta integração nativa para gravação em massa no Azure Cosmos DB. Essa integração permite escrever efetivamente no Azure Cosmos DB enquanto maximiza a taxa de transferência e lida com eficiência com solicitações de limitação.
O mecanismo de escrita melhorado está disponível sob um novo nível de compatibilidade devido a uma diferença no comportamento de upsert. Com níveis anteriores a 1.2, o comportamento do upsert é inserir ou mesclar o documento. Com a versão 1.2, o comportamento de upsert é modificado para inserir ou substituir o documento.
Com níveis anteriores à versão 1.2, o Stream Analytics usa um procedimento armazenado personalizado para atualizar documentos em massa por chave de partição no Azure Cosmos DB. Lá, um lote é escrito como uma transação. Mesmo quando um único registro atinge um erro transitório (limitação), todo o lote tem que ser repetido. Esse comportamento torna os cenários com limitação, mesmo razoável, relativamente lentos.
O exemplo a seguir mostra dois trabalhos idênticos do Stream Analytics lendo a partir da mesma entrada de Hubs de Eventos do Azure. Ambos os trabalhos do Stream Analytics são totalmente particionados com uma consulta de passagem e gravação em contêineres idênticos do Azure Cosmos DB. As métricas à esquerda são do trabalho configurado com nível de compatibilidade 1.0. As métricas à direita são configuradas com 1.2. A chave de partição de um contêiner do Azure Cosmos DB é um GUID exclusivo que vem do evento de entrada.
A taxa de eventos de entrada nos Hubs de Eventos é duas vezes maior do que os contêineres do Azure Cosmos DB (20.000 RUs) estão configurados para receber, portanto, a limitação é esperada no Azure Cosmos DB. No entanto, o trabalho com 1.2 está escrevendo consistentemente em uma taxa de transferência mais alta (eventos de saída por minuto) e com uma utilização média de SU% mais baixa. No seu ambiente, essa diferença depende de mais alguns fatores. Esses fatores incluem a escolha do formato do evento, o tamanho do evento/mensagem de entrada, as chaves de partição e a consulta.
Com a versão 1.2, o Stream Analytics é mais inteligente na utilização de 100% da taxa de transferência disponível no Azure Cosmos DB com poucos reenvios de limitação ou limitação de taxa. Esse comportamento fornece uma experiência melhor para outras cargas de trabalho, como consultas em execução no contêiner ao mesmo tempo. Se você quiser ver como o Stream Analytics se expande com o Azure Cosmos DB como um coletor para 1.000 a 10.000 mensagens por segundo, experimente este projeto de exemplo do Azure.
A taxa de transferência da saída do Azure Cosmos DB é idêntica à 1.0 e 1.1. É altamente recomendável que você use o nível de compatibilidade 1.2 no Stream Analytics com o Azure Cosmos DB.
Configurações do Azure Cosmos DB para saída JSON
Usar o Azure Cosmos DB como uma saída no Stream Analytics gera o seguinte prompt de informações.
Campo | Descrição |
---|---|
Alias de saída | Um alias para se referir a essa saída na sua consulta do Stream Analytics. |
Subscrição | A assinatura do Azure. |
ID de conta | O nome ou URI do ponto de extremidade da conta do Azure Cosmos DB. |
Chave da conta | A chave de acesso compartilhada para a conta do Azure Cosmos DB. |
Base de Dados | O nome do banco de dados do Azure Cosmos DB. |
Nome do contentor | O nome do contêiner, como MyContainer . Um contêiner chamado MyContainer deve existir. |
ID do Documento | Opcional. O nome da coluna nos eventos de saída usados como a chave exclusiva na qual as operações de inserção ou atualização devem ser baseadas. Se você deixá-lo vazio, todos os eventos serão inseridos, sem opção de atualização. |
Depois de configurar a saída do Azure Cosmos DB, você pode usá-la na consulta como o destino de uma instrução INTO. Quando você estiver usando uma saída do Azure Cosmos DB dessa forma, uma chave de partição precisa ser definida explicitamente.
O registro de saída deve conter uma coluna que diferencia maiúsculas de minúsculas com o nome da chave de partição no Azure Cosmos DB. Para obter maior paralelização, a instrução pode exigir uma cláusula PARTITION BY que usa a mesma coluna.
Aqui está um exemplo de consulta:
SELECT TollBoothId, PartitionId
INTO CosmosDBOutput
FROM Input1 PARTITION BY PartitionId
Processamento de erros e tentativas
Se ocorrer uma falha transitória, indisponibilidade de serviço ou limitação enquanto o Stream Analytics está enviando eventos para o Azure Cosmos DB, o Stream Analytics tentará novamente indefinidamente concluir a operação com êxito. Mas ele não tenta repetir as seguintes falhas:
- Não autorizado (código de erro HTTP 401)
- NotFound (código de erro HTTP 404)
- Proibido (código de erro HTTP 403)
- BadRequest (código de erro HTTP 400)
Problemas comuns
Uma restrição de índice exclusiva é adicionada à coleção e os dados de saída do Stream Analytics violam essa restrição. Certifique-se de que os dados de saída do Stream Analytics não violam restrições exclusivas ou removem restrições. Para obter mais informações, consulte Restrições de chave exclusivas no Azure Cosmos DB.
A
PartitionKey
coluna não existe.A
Id
coluna não existe.