Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Azure Data Explorer é um serviço de exploração de dados rápido e altamente escalonável para dados telemétricos e de log. O Azure Data Explorer fornece duas bibliotecas de clientes para o Node.js: uma biblioteca de ingestão e uma biblioteca de dados. Essas bibliotecas permitem ingerir (carregar) dados em um cluster e consultar dados do código. Neste artigo, primeiro você cria uma tabela e um mapeamento de dados em um cluster de teste. Em seguida, você enfileira a ingestão no cluster e valida os resultados.
Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.
Pré-requisitos
- Uma conta Microsoft ou uma identidade de usuário do Microsoft Entra. Uma assinatura do Azure não é necessária.
- Um cluster e um banco de dados do Azure Data Explorer. Criar um cluster e um banco de dados.
- Node.js instalado no computador de desenvolvimento
Instalar as bibliotecas de dados e de ingestão de dados
Instalar azure-kusto-ingest e azure-kusto-data
npm i azure-kusto-ingest@^3.3.2 azure-kusto-data@^3.3.2
Adicionar instruções de importação e constantes
Importar classes das bibliotecas
const { Client: KustoClient, KustoConnectionStringBuilder } = require('azure-kusto-data');
const {
IngestClient: KustoIngestClient,
IngestionProperties,
IngestionDescriptors,
DataFormat,
IngestionMappingKind,
} = require("azure-kusto-ingest");
Para autenticar um aplicativo, o Azure Data Explorer usa sua ID de locatário do Microsoft Entra. Para localizar sua ID de locatário, siga Localizar sua ID de locatário do Microsoft 365.
Defina os valores para authorityId, kustoUrikustoIngestUri e kustoDatabase antes de executar esse código.
const cluster = "MyCluster";
const region = "westus";
const authorityId = "microsoft.com";
const kustoUri = `https://${cluster}.${region}.kusto.windows.net`;
const kustoIngestUri = `https://ingest-${cluster}.${region}.kusto.windows.net`;
const kustoDatabase = "Weather";
Agora, construa a cadeia de caracteres de conexão. Este exemplo usa a autenticação do dispositivo para acessar o cluster. Verifique a saída do console para concluir a autenticação. Você também pode usar um certificado de aplicativo do Microsoft Entra, uma chave de aplicativo e um usuário e uma senha.
Você cria a tabela de destino e o mapeamento em uma etapa posterior.
const kcsbIngest = KustoConnectionStringBuilder.withAadDeviceAuthentication(kustoIngestUri, authorityId);
const kcsbData = KustoConnectionStringBuilder.withAadDeviceAuthentication(kustoUri, authorityId);
const destTable = "StormEvents";
const destTableMapping = "StormEvents_CSV_Mapping";
Definir informações do arquivo de origem
Importe mais classes e defina constantes para o arquivo de fonte de dados. Este exemplo usa um arquivo de exemplo hospedado no Armazenamento de Blobs do Azure. O conjunto de dados de exemplo StormEvents contém dados relacionados ao clima dos Centros Nacionais de Informações Ambientais.
const container = "samplefiles";
const account = "kustosamples";
const sas = ""; // If relevant add SAS token
const filePath = "StormEvents.csv";
const blobPath = `https://${account}.blob.core.windows.net/${container}/${filePath}${sas}`;
Criar uma tabela em seu cluster de teste
Crie uma tabela que corresponda ao esquema dos dados no StormEvents.csv arquivo. Quando esse código é executado, ele retorna uma mensagem como a seguinte: Para entrar, use um navegador da Web para abrir a página https://microsoft.com/devicelogin e insira o código XXXXXXXXXX para autenticar. Siga as etapas para entrar e, em seguida, retorne para executar o próximo bloco de código. Os blocos de código subsequentes que fazem uma conexão exigirão que você entre novamente.
const kustoClient = new KustoClient(kcsbData);
const createTableCommand = `.create table ${destTable} (StartTime: datetime, EndTime: datetime, EpisodeId: int, EventId: int, State: string, EventType: string, InjuriesDirect: int, InjuriesIndirect: int, DeathsDirect: int, DeathsIndirect: int, DamageProperty: int, DamageCrops: int, Source: string, BeginLocation: string, EndLocation: string, BeginLat: real, BeginLon: real, EndLat: real, EndLon: real, EpisodeNarrative: string, EventNarrative: string, StormSummary: dynamic)`;
const createTableResults = await kustoClient.executeMgmt(kustoDatabase, createTableCommand);
console.log(createTableResults.primaryResults[0].toJSON().data);
Definir mapeamento de ingestão
Mapeie os dados CSV de entrada para os nomes de coluna e os tipos de dados usados ao criar a tabela.
const createMappingCommand = `.create table ${destTable} ingestion csv mapping '${destTableMapping}' '[{"Name":"StartTime","datatype":"datetime","Ordinal":0}, {"Name":"EndTime","datatype":"datetime","Ordinal":1},{"Name":"EpisodeId","datatype":"int","Ordinal":2},{"Name":"EventId","datatype":"int","Ordinal":3},{"Name":"State","datatype":"string","Ordinal":4},{"Name":"EventType","datatype":"string","Ordinal":5},{"Name":"InjuriesDirect","datatype":"int","Ordinal":6},{"Name":"InjuriesIndirect","datatype":"int","Ordinal":7},{"Name":"DeathsDirect","datatype":"int","Ordinal":8},{"Name":"DeathsIndirect","datatype":"int","Ordinal":9},{"Name":"DamageProperty","datatype":"int","Ordinal":10},{"Name":"DamageCrops","datatype":"int","Ordinal":11},{"Name":"Source","datatype":"string","Ordinal":12},{"Name":"BeginLocation","datatype":"string","Ordinal":13},{"Name":"EndLocation","datatype":"string","Ordinal":14},{"Name":"BeginLat","datatype":"real","Ordinal":16},{"Name":"BeginLon","datatype":"real","Ordinal":17},{"Name":"EndLat","datatype":"real","Ordinal":18},{"Name":"EndLon","datatype":"real","Ordinal":19},{"Name":"EpisodeNarrative","datatype":"string","Ordinal":20},{"Name":"EventNarrative","datatype":"string","Ordinal":21},{"Name":"StormSummary","datatype":"dynamic","Ordinal":22}]'`;
const mappingCommandResults = await kustoClient.executeMgmt(kustoDatabase, createMappingCommand);
console.log(mappingCommandResults.primaryResults[0].toJSON().data);
Enfileirar uma mensagem para processamento
Enfileirar uma mensagem para recuperar dados do armazenamento de blobs e ingerir esses dados no Azure Data Explorer.
const defaultProps = new IngestionProperties({
database: kustoDatabase,
table: destTable,
format: DataFormat.CSV,
ingestionMappingReference: destTableMapping,
ingestionMappingKind: IngestionMappingKind.CSV,
additionalProperties: {ignoreFirstRecord: true},
});
const ingestClient = new KustoIngestClient(kcsbIngest, defaultProps);
// All ingestion properties are documented here: https://learn.microsoft.com/azure/kusto/management/data-ingest#ingestion-properties
const blobDesc = new BlobDescriptor(blobPath, 10);
try {
const ingestionResult = await ingestClient.ingestFromBlob(blobDesc, null);
} catch (err) {
// Handle errors
}
Validar se a tabela contém dados
Valide se os dados foram ingeridos na tabela. Aguarde de cinco a dez minutos para que a ingestão que está em fila seja agendada e que os dados sejam carregados no Azure Data Explorer. Em seguida, execute o código a seguir para obter a contagem de registros na StormEvents tabela.
const query = `${destTable} | count`;
var tableResults = await kustoClient.execute(kustoDatabase, query);
console.log(tableResults.primaryResults[0].toJSON().data);
Executar consultas de solução de problemas
https://dataexplorer.azure.com Entre e conecte-se ao cluster. Execute o comando a seguir no banco de dados para ver se houve falhas de ingestão nas últimas quatro horas. Substitua o nome do banco de dados antes de executar.
.show ingestion failures
| where FailedOn > ago(4h) and Database == "<DatabaseName>"
Execute o comando a seguir para exibir o status de todas as operações de ingestão nas últimas quatro horas. Substitua o nome do banco de dados antes de executar.
.show operations
| where StartedOn > ago(4h) and Database == "<DatabaseName>" and Operation == "DataIngestPull"
| summarize arg_max(LastUpdatedOn, *) by OperationId
Limpar os recursos
Se você planeja seguir nossos outros artigos, mantenha os recursos criados. Caso contrário, execute o comando a seguir em seu banco de dados para limpar a StormEvents tabela.
.drop table StormEvents