Aracılığıyla paylaş


C# (Önizleme) kullanarak Azure Synapse Veri Gezgini için Event Hubs veri bağlantısı oluşturma

Önemli

Azure Synapse Analytics Veri Gezgini (Önizleme) 7 Ekim 2025'te kullanımdan kaldırılacaktır. Bu tarihten sonra Synapse Veri Gezgini'ne çalışan iş yükleri silinir ve ilişkili uygulama verileri kaybolur. Microsoft Fabric'te Eventhouse'a geçiş yapmanızı kesinlikle öneririz.

Microsoft Cloud Migration Factory (CMF) programı, müşterilere Fabric'e geçişte yardımcı olmak için tasarlanmıştır. Program, müşteriye hiçbir ücret ödemeden uygulamalı klavye kaynakları sunar. Bu kaynaklar, önceden tanımlanmış ve üzerinde anlaşmaya varılmış bir kapsama sahip 6-8 haftalık bir süre için atanır. Müşteri adaylıkları Microsoft hesabı ekibinden veya doğrudan CMF ekibine yardım isteği gönderilerek kabul edilir.

Azure Synapse Veri Gezgini, günlük ve telemetri verileri için hızlı ve yüksek oranda ölçeklenebilir bir veri araştırma hizmetidir. Azure Synapse Veri Gezgini, Event Hubs, IoT Hubs ve blob kapsayıcılarına yazılan bloblardan veri alımı (veri yükleme) sunar.

Bu makalede, C# kullanarak Azure Synapse Veri Gezgini için bir Event Hubs veri bağlantısı oluşturacaksınız.

Önkoşullar

  • Bir Azure aboneliği. Ücretsiz bir Azure hesabı oluşturun.

  • Synapse Studio'yu veya Azure portalını kullanarak Veri Gezgini havuzu oluşturma

  • Veri Gezgini veritabanı oluşturma.

    1. Synapse Studio'da sol taraftaki bölmede Veri'yi seçin.

    2. + (Yeni kaynak ekle) >Veri Gezgini havuzu'nu seçin ve aşağıdaki bilgileri kullanın:

      Setting Önerilen değer Description
      Havuz adı contosodataexplorer Kullanılacak Veri Gezgini havuzunun adı
      İsim TestDatabase Veritabanı adı küme içinde benzersiz olmalıdır.
      Varsayılan saklama süresi 365 Verilerin sorgulanabilir durumda tutulduğundan emin olunan süre (gün olarak). Zaman aralığı verilerin alındığı andan itibaren hesaplanır.
      Varsayılan önbellek dönemi 31 Sık sorgulanan verilerin daha uzun süreli depolama yerine SSD depolama veya RAM'de kullanılabilir durumda tutulması gereken zaman aralığı (gün cinsinden).
    3. Veritabanını oluşturmak için Oluştur'u seçin. Oluşturma işlemi genellikle bir dakikadan kısa sürer.

Uyarı

Synapse çalışma alanınız veri sızdırma koruması etkinleştirilmiş yönetilen bir sanal ağ kullanıyorsa, Event Hub'dan Veri Gezgini havuzlarına veri aktarma işlemi çalışmayacaktır.

Test kümenizde tablo oluşturma

Dosyadaki StormEvents verilerin şemasıyla eşleşen adlı StormEvents.csv bir tablo oluşturun.

İpucu

Aşağıdaki kod parçacıkları, neredeyse her çağrı için bir istemci örneği oluşturur. Bu, her kod parçacığını ayrı ayrı çalıştırılabilir hale getirmek için yapılır. Üretimde istemci örnekleri tekrar girilebilir olup gerektiği kadar tutulmalıdır. URI başına tek bir istemci örneği, birden çok veritabanıyla çalışırken bile yeterlidir (veritabanı bir komut düzeyinde belirtilebilir).

var databaseName = "<DatabaseName>";
var table = "StormEvents";
using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kustoConnectionStringBuilder))
{
    var command =
        CslCommandGenerator.GenerateTableCreateCommand(
            table,
            new[]
            {
                Tuple.Create("StartTime", "System.DateTime"),
                Tuple.Create("EndTime", "System.DateTime"),
                Tuple.Create("EpisodeId", "System.Int32"),
                Tuple.Create("EventId", "System.Int32"),
                Tuple.Create("State", "System.String"),
                Tuple.Create("EventType", "System.String"),
                Tuple.Create("InjuriesDirect", "System.Int32"),
                Tuple.Create("InjuriesIndirect", "System.Int32"),
                Tuple.Create("DeathsDirect", "System.Int32"),
                Tuple.Create("DeathsIndirect", "System.Int32"),
                Tuple.Create("DamageProperty", "System.Int32"),
                Tuple.Create("DamageCrops", "System.Int32"),
                Tuple.Create("Source", "System.String"),
                Tuple.Create("BeginLocation", "System.String"),
                Tuple.Create("EndLocation", "System.String"),
                Tuple.Create("BeginLat", "System.Double"),
                Tuple.Create("BeginLon", "System.Double"),
                Tuple.Create("EndLat", "System.Double"),
                Tuple.Create("EndLon", "System.Double"),
                Tuple.Create("EpisodeNarrative", "System.String"),
                Tuple.Create("EventNarrative", "System.String"),
                Tuple.Create("StormSummary", "System.Object"),
            });

    kustoClient.ExecuteControlCommand(databaseName, command);
}

Veri alımı eşlemesini tanımlayın

Gelen CSV verilerini tabloyu oluştururken kullanılan sütun adlarına eşleyin. Bu tabloda bir CSV sütun eşleme nesnesi sağlayın.

var tableMapping = "StormEvents_CSV_Mapping";
using (var kustoClient = KustoClientFactory.CreateCslAdminProvider(kustoConnectionStringBuilder))
{
    var command =
        CslCommandGenerator.GenerateTableMappingCreateCommand(
            Data.Ingestion.IngestionMappingKind.Csv,
            table,
            tableMapping,
            new[] {
                new ColumnMapping() { ColumnName = "StartTime", Properties = new Dictionary<string, string>() { { MappingConsts.Ordinal, "0" } } },
                new ColumnMapping() { ColumnName = "EndTime", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "1" } } },
                new ColumnMapping() { ColumnName = "EpisodeId", Properties = new Dictionary<string, string>() { { MappingConsts.Ordinal, "2" } } },
                new ColumnMapping() { ColumnName = "EventId", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "3" } } },
                new ColumnMapping() { ColumnName = "State", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "4" } } },
                new ColumnMapping() { ColumnName = "EventType", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "5" } } },
                new ColumnMapping() { ColumnName = "InjuriesDirect", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "6" } } },
                new ColumnMapping() { ColumnName = "InjuriesIndirect", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "7" } } },
                new ColumnMapping() { ColumnName = "DeathsDirect", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "8" } } },
                new ColumnMapping() { ColumnName = "DeathsIndirect", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "9" } } },
                new ColumnMapping() { ColumnName = "DamageProperty", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "10" } } },
                new ColumnMapping() { ColumnName = "DamageCrops", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "11" } } },
                new ColumnMapping() { ColumnName = "Source", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "12" } } },
                new ColumnMapping() { ColumnName = "BeginLocation", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "13" } } },
                new ColumnMapping() { ColumnName = "EndLocation", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "14" } } },
                new ColumnMapping() { ColumnName = "BeginLat", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "15" } } },
                new ColumnMapping() { ColumnName = "BeginLon", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "16" } } },
                new ColumnMapping() { ColumnName = "EndLat", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "17" } } },
                new ColumnMapping() { ColumnName = "EndLon", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "18" } } },
                new ColumnMapping() { ColumnName = "EpisodeNarrative", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "19" } } },
                new ColumnMapping() { ColumnName = "EventNarrative", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "20" } } },
                new ColumnMapping() { ColumnName = "StormSummary", Properties =  new Dictionary<string, string>() { { MappingConsts.Ordinal, "21" } } }
        });

    kustoClient.ExecuteControlCommand(databaseName, command);
}

C# NuGet'i yükleme

Authentication

Aşağıdaki örneği çalıştırmak için kaynaklara erişebilen bir Microsoft Entra uygulamasına ve hizmet sorumlusuna ihtiyacınız vardır. Ücretsiz bir Microsoft Entra uygulaması oluşturmak ve abonelik düzeyinde rol ataması eklemek için bkz . Microsoft Entra uygulaması oluşturma. Ayrıca dizin (kiracı) kimliğine, uygulama kimliğine ve istemci gizliliğine ihtiyacınız vardır.

Event Hubs veri bağlantısı ekleme

Aşağıdaki örnekte program aracılığıyla Event Hubs veri bağlantısının nasıl ekleneceği gösterilmektedir. Azure portalını kullanarak bir Event Hubs veri bağlantısı ekleme hakkında bilgi için Event Hubs'a bağlanma bölümüne bakın.

var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";//Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";//Application ID
var clientSecret = "xxxxxxxxxxxxxx";//Client Secret
var subscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var authenticationContext = new AuthenticationContext($"https://login.windows.net/{tenantId}");
var credential = new ClientCredential(clientId, clientSecret);
var result = await authenticationContext.AcquireTokenAsync(resource: "https://management.core.windows.net/", clientCredential: credential);

var credentials = new TokenCredentials(result.AccessToken, result.AccessTokenType);

var kustoManagementClient = new KustoManagementClient(credentials)
{
    SubscriptionId = subscriptionId
};

var resourceGroupName = "testrg";
//The cluster and database that are created as part of the Prerequisites
var clusterName = "mykustocluster";
var databaseName = "mykustodatabase";
var dataConnectionName = "myeventhubconnect";
//The Event Hub that is created as part of the Prerequisites
var eventHubResourceId = "/subscriptions/xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx/resourceGroups/xxxxxx/providers/Microsoft.EventHub/namespaces/xxxxxx/eventhubs/xxxxxx";
var consumerGroup = "$Default";
var location = "Central US";
//The table and column mapping are created as part of the Prerequisites
var tableName = "StormEvents";
var mappingRuleName = "StormEvents_CSV_Mapping";
var dataFormat = DataFormat.CSV;
var compression = "None";
await kustoManagementClient.DataConnections.CreateOrUpdateAsync(resourceGroupName, clusterName, databaseName, dataConnectionName,
    new EventHubDataConnection(eventHubResourceId, consumerGroup, location: location, tableName: tableName, mappingRuleName: mappingRuleName, dataFormat: dataFormat, compression: compression));
Setting Önerilen değer Alan açıklaması
tenantId xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx Kiracı kimliğiniz. Dizin kimliği olarak da bilinir.
subscriptionId xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx Kaynak oluşturmak için kullandığınız abonelik kimliği.
clientId xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx Kiracınızdaki kaynaklara erişebilen uygulamanın istemci kimliği.
clientSecret xxxxxxxxxxx Kiracınızdaki kaynaklara erişebilen uygulamanın istemci sırrı.
resourceGroupName testrg Kümenizi içeren kaynak grubunun adı.
kümeAdı mykustocluster Kümenizin adı.
databaseName mykustodatabase Kümenizdeki hedef veritabanının adı.
veriBağlantıAdı myeventhubconnect Veri bağlantınızın istenen adı.
tableName StormEvents Hedef veritabanındaki hedef tablonun adı.
mappingKuralAdı FırtınaOlayları_CSV_Haritalama Hedef tabloyla ilgili sütun eşlemenizin adı.
veri formatı csv İletinin veri biçimi.
EventHubKaynakKimliği Kaynak Kimliği Alım verilerini tutan olay hub'ınızın kaynak kimliği.
tüketici grubu $Varsayılan Olay hub'ınızın tüketici grubu.
location Orta ABD Veri bağlantısı kaynağının konumu.
compression Gzip veya Yok Veri sıkıştırma türü.

Veri oluştur

Veri oluşturan ve bir olay hub'ına gönderen örnek uygulamaya bakın.

Bir olay, boyut sınırına kadar bir veya daha fazla kayıt içerebilir. Aşağıdaki örnekte iki olay gönderiyoruz, her birinde beş kayıt eklenmiştir:

var events = new List<EventData>();
var data = string.Empty;
var recordsPerEvent = 5;
var rand = new Random();
var counter = 0;

for (var i = 0; i < 10; i++)
{
    // Create the data
    var metric = new Metric { Timestamp = DateTime.UtcNow, MetricName = "Temperature", Value = rand.Next(-30, 50) };
    var data += JsonConvert.SerializeObject(metric) + Environment.NewLine;
    counter++;

    // Create the event
    if (counter == recordsPerEvent)
    {
        var eventData = new EventData(Encoding.UTF8.GetBytes(data));
        events.Add(eventData);

        counter = 0;
        data = string.Empty;
    }
}

// Send events
eventHubClient.SendAsync(events).Wait();

Kaynakları temizle

Veri bağlantısını silmek için aşağıdaki komutu kullanın:

kustoManagementClient.DataConnections.Delete(resourceGroupName, clusterName, databaseName, dataConnectionName);

Sonraki Adımlar