Öğretici: Databricks Delta tablosu güncelleştirmek için data lake yakalama desenini uygulama

Bu öğreticide, hiyerarşik ad alanına sahip bir depolama hesabında olayları işleme hakkında bilgi ve açıklama bulabilirsiniz.

Bir kullanıcının bir satış siparişlerini açıklayan virgülle ayrılmış değerler (csv) dosyasını karşıya yükerek Databricks Delta tablosu oluşturmalarını sağlayan küçük bir çözüm derleyebilirsiniz. Bu çözümü derlemek için bir Event Grid aboneliği, Azure İşlevi ve Azure Databricks.

Bu öğreticide şunları yapacaksınız:

  • Azure İşlevi Event Grid çağıran bir abonelik oluşturun.
  • Bir olaydan bildirim alan ve işi bir olayda çalıştıran bir Azure İşlevi Azure Databricks.
  • Depolama hesabında bulunan bir Databricks Delta tablosuna müşteri siparişi ekseren bir Databricks işi oluşturun.

Bu çözümü çalışma alanıyla başlayarak ters sırada Azure Databricks oluşturuz.

Ön koşullar

  • Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

  • Hiyerarşik ad alanına sahip bir depolama hesabı oluşturun (Azure Data Lake Depolama 2. Nesil). Bu öğretici, adlı bir depolama hesabı contosoorders kullanır. Kullanıcı hesabınıza blob verisi katkıda bulunan Depolama rolü atandığından emin olun.

    Bkz. Azure Data Lake ile kullanmak için depolama hesabı oluşturma Depolama 2. Nesil.

  • Hizmet sorumlusu oluşturun. Bkz. Nasıl: Portalı kullanarak kaynaklara erişen bir Azure AD uygulaması ve hizmet sorumlusu oluşturma.

    Bu makaledeki adımları gerçekleştirmeniz için gerçekleştirmeniz gereken birkaç özel işlem vardır.

    ✔️ Uygulamayı bir role atama makalesinde yer alan adımları gerçekleştirerek blob verisi katkıda bulunan rolünü hizmet sorumlusuna Depolama emin olun.

    Önemli

    Rolü Data Lake Depolama 2. Nesil depolama hesabı kapsamında atayın. Üst kaynak grubuna veya aboneliğe rol atabilirsiniz, ancak bu rol atamaları depolama hesabına yaynana kadar izinlerle ilgili hatalar alırsınız.

    ✔️ Makalenin Oturum açma için değerleri al bölümündeki adımları gerçekleştirerek kiracı kimliğini, uygulama kimliğini ve parola değerlerini bir metin dosyasına yapıştırın. Bu değerlere daha sonra ihtiyacınız olacak.

Satış siparişi oluşturma

İlk olarak, satış siparişlerini açıklayan bir csv dosyası oluşturun ve ardından bu dosyayı depolama hesabına yükleyin. Daha sonra, Databricks Delta tablomuzdaki ilk satırı doldurmak için bu dosyadaki verileri kullanacağız.

  1. Yeni Azure Depolama Gezgini. Ardından depolama hesabınıza gidin ve Blob Kapsayıcıları bölümünde data adlı yeni bir kapsayıcı oluşturun.

    veri klasörü

    Depolama Gezgini kullanma hakkında daha fazla bilgi için bkz. Azure Data Lake Azure Depolama Gezgini 2.Nesil hesabında verileri yönetmek için Depolama kullanma.

  2. Veri kapsayıcısı içinde input adlı bir klasör oluşturun.

  3. Aşağıdaki metni bir metin düzenleyicisine yapıştırın.

    InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
    536365,85123A,WHITE HANGING HEART T-LIGHT HOLDER,6,12/1/2010 8:26,2.55,17850,United Kingdom
    
  4. Bu dosyayı yerel bilgisayarınıza kaydedin ve dosyanın adını data.csv.

  5. Bu Depolama Gezgini giriş klasörüne yükleyin.

Azure Databricks'de iş oluşturma

Bu bölümde şu görevleri gerçekleştirebilirsiniz:

  • Çalışma alanı Azure Databricks oluşturun.
  • Bir not defteri oluşturun.
  • Databricks Delta tablosu oluşturma ve bu tabloyu doldurmak.
  • Databricks Delta tablosuna satır ekli kod ekleyin.
  • bir İş oluşturun.

Azure Databricks çalışma alanı oluşturma

Bu bölümde Azure portalını kullanarak bir Azure Databricks çalışma alanı oluşturursunuz.

  1. Kaynak Azure portal Kaynak analizi oluştur'Azure Databricks. > >

    Azure portal üzerinde Databricks

  2. Azure Databricks Hizmeti bölümünde, Databricks çalışma alanı oluşturmak için değerler sağlayın.

    Azure Databricks çalışma alanı oluşturma

    Çalışma alanının oluşturulması birkaç dakika sürer. İşlem durumunu izlemek için üstteki ilerleme çubuğunu görüntüleme.

Databricks’te Spark kümesi oluşturma

  1. Uygulama Azure portal,oluşturduğunuz Azure Databricks çalışma alanına gidin ve Ardından Çalışma Alanını Başlat'ı seçin.

  2. Azure Databricks portalına yönlendirilirsiniz. Portaldan Yeni Küme'yi > seçin.

    Azure'da Databricks

  3. Yeni küme sayfasında, bir küme oluşturmak için değerleri girin.

    Azure'da Databricks Spark kümesi oluşturma

    Aşağıdakiler dışında diğer tüm varsayılan değerleri kabul edin:

    • Küme için bir ad girin.
    • 120 dakika işlem yapılmadığında sonlandır onay kutusunu seçtiğinizden emin olun. Küme kullanılmazsa kümenin sonlandırılması için biz süre (dakika cinsinden) belirtin.
  4. Küme oluştur'a seçin. Küme çalışmaya başladıktan sonra kümeye not defterleri ekleyebilir ve Spark işleri çalıştırabilirsiniz.

Küme oluşturma hakkında daha fazla bilgi için bkz. Azure Databricks üzerinde Spark kümesi oluşturma.

Not defteri oluşturma

  1. Sol bölmede Çalışma Alanı’nı seçin. Çalışma Alanı açılır listesinden Oluştur > Not Defteri’ni seçin.

    Databricks'te not defteri oluşturma

  2. Not Defteri Oluştur iletişim kutusunda, not defterinizin adını girin. Dil olarak Python'ı ve ardından daha önce oluşturduğunuz Spark kümesi'ni seçin.

    Not Defteri Oluştur iletişim kutusunu ve dil olarak Python'ın nerede seçil olduğunu gösteren ekran görüntüsü.

    Oluştur’u seçin.

Databricks Delta tablosu oluşturma ve tabloyu doldurmak

  1. Oluşturduğunuz not defterinde aşağıdaki kod bloğuna kopyalayıp ilk hücreye yapıştırın, ancak henüz bu kodu çalıştırmayın.

    Bu kod bloğundaki , , yer tutucu değerlerini, bu öğreticinin önkoşullarını appId password tenant tamamladıktan sonra toplanmış olan değerlerle değiştirin.

    dbutils.widgets.text('source_file', "", "Source File")
    
    spark.conf.set("fs.azure.account.auth.type", "OAuth")
    spark.conf.set("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
    spark.conf.set("fs.azure.account.oauth2.client.id", "<appId>")
    spark.conf.set("fs.azure.account.oauth2.client.secret", "<password>")
    spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<tenant>/oauth2/token")
    
    adlsPath = 'abfss://data@contosoorders.dfs.core.windows.net/'
    inputPath = adlsPath + dbutils.widgets.get('source_file')
    customerTablePath = adlsPath + 'delta-tables/customers'
    

    Bu kod, source_file adlı bir pencere öğesi oluşturur. Daha sonra, bu kodu çağıran ve bu pencere öğesine bir dosya yolu iletir bir Azure İşlevi oluşturacağız. Bu kod ayrıca depolama hesabıyla hizmet sorumlusu kimliğini doğrular ve diğer hücrelerde kullanabileceğiniz bazı değişkenler oluşturur.

    Not

    Bir üretim ayarında, kimlik doğrulama anahtarınızı bir üretim Azure Databricks. Ardından, kimlik doğrulama anahtarı yerine kod bloğuna bir look up anahtarı ekleyin.

    Örneğin, bu kod satırı yerine şu spark.conf.set("fs.azure.account.oauth2.client.secret", "<password>") kod satırı kullanılır: spark.conf.set("fs.azure.account.oauth2.client.secret", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>")) .

    Bu öğreticiyi tamamlandıktan sonra, bu yaklaşımın örneklerini görmek için Azure Databricks Web Sitesinin Azure Data Lake Depolama 2. Nesil makalesine bakın.

  2. Bu blokta kodu çalıştırmak için SHIFT + ENTER tuşlarına basın.

  3. Aşağıdaki kod bloğuna kopyalayıp farklı bir hücreye yapıştırın ve ardından SHIFT + ENTER tuşlarına basarak bu blokta kodu çalıştırın.

    from pyspark.sql.types import StructType, StructField, DoubleType, IntegerType, StringType
    
    inputSchema = StructType([
    StructField("InvoiceNo", IntegerType(), True),
    StructField("StockCode", StringType(), True),
    StructField("Description", StringType(), True),
    StructField("Quantity", IntegerType(), True),
    StructField("InvoiceDate", StringType(), True),
    StructField("UnitPrice", DoubleType(), True),
    StructField("CustomerID", IntegerType(), True),
    StructField("Country", StringType(), True)
    ])
    
    rawDataDF = (spark.read
     .option("header", "true")
     .schema(inputSchema)
     .csv(adlsPath + 'input')
    )
    
    (rawDataDF.write
      .mode("overwrite")
      .format("delta")
      .saveAsTable("customer_data", path=customerTablePath))
    

    Bu kod, depolama hesabınıza Databricks Delta tablosu oluşturur ve ardından daha önce karşıya yüklediğiniz csv dosyasından bazı ilk verileri yükler.

  4. Bu kod bloğu başarıyla çalıştırıldıktan sonra, not defterinize bu kod bloğundan kaldırın.

Databricks Delta tablosuna satır ekli kod ekleme

  1. Aşağıdaki kod bloğuna kopyalayıp farklı bir hücreye yapıştırın, ancak bu hücreyi çalıştırmayın.

    upsertDataDF = (spark
      .read
      .option("header", "true")
      .csv(inputPath)
    )
    upsertDataDF.createOrReplaceTempView("customer_data_to_upsert")
    

    Bu kod, csv dosyasındaki verileri kullanarak geçici bir tablo görünümüne veri ekler. Bu csv dosyasının yolu, önceki bir adımda oluşturduğunuz giriş pencere öğesinden gelir.

  2. Geçici tablo görünümünün içeriğini Databricks Delta tablosuyla birleştirmek için aşağıdaki kodu ekleyin.

    %sql
    MERGE INTO customer_data cd
    USING customer_data_to_upsert cu
    ON cd.CustomerID = cu.CustomerID
    WHEN MATCHED THEN
      UPDATE SET
        cd.StockCode = cu.StockCode,
        cd.Description = cu.Description,
        cd.InvoiceNo = cu.InvoiceNo,
        cd.Quantity = cu.Quantity,
        cd.InvoiceDate = cu.InvoiceDate,
        cd.UnitPrice = cu.UnitPrice,
        cd.Country = cu.Country
    WHEN NOT MATCHED
      THEN INSERT (InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID, Country)
      VALUES (
        cu.InvoiceNo,
        cu.StockCode,
        cu.Description,
        cu.Quantity,
        cu.InvoiceDate,
        cu.UnitPrice,
        cu.CustomerID,
        cu.Country)
    

İş Oluşturma

Daha önce oluşturduğunuz not defterini çalıştıran bir İş oluşturun. Daha sonra, bir olay olduğunda bu işi çalıştıran bir Azure İşlevi oluşturacağız.

  1. İşler'e tıklayın.

  2. İşler sayfasında İş Oluştur'a tıklayın.

  3. İş için bir ad girin ve çalışma kitabını upsert-order-data seçin.

    Bir iş oluşturma

Azure İşlevi oluşturma

Işi çalıştıran bir Azure Işlevi oluşturun.

  1. Databricks çalışma alanının üst köşesinde kişiler simgesini ve ardından Kullanıcı ayarları' nı seçin.

    Hesabı yönetme

  2. Yeni belirteç oluştur düğmesine tıklayın ve ardından Oluştur düğmesine tıklayın.

    Belirteci güvenli bir yere kopyalamadığınızdan emin olun. Azure Işlevinizde bu belirtecin, Işi çalıştırabilmesi için Databricks ile kimlik doğrulaması yapması gerekir.

  3. Azure portal sol üst köşesinde bulunan kaynak oluştur düğmesini seçin ve ardından işlem > işlev uygulaması' yı seçin.

    Azure işlevi oluşturma

  4. İşlev Uygulaması oluştur sayfasında, çalışma zamanı yığını için .net Core ' u seçtiğinizden emin olun ve bir Application Insights örneği yapılandırdığınızdan emin olun.

    İşlev uygulamasını yapılandırma

  5. İşlev Uygulaması genel bakış sayfasında yapılandırma' ya tıklayın.

    Yapılandırılan özellikler altındaki yapılandırma seçeneğini vurgulayan ekran görüntüsü.

  6. uygulama Ayarlar sayfasında, her bir ayarı eklemek için yeni uygulama ayarı düğmesini seçin.

    Yapılandırma ayarı Ekle

    Aşağıdaki ayarları ekleyin:

    Ayar adı Değer
    DBX_INSTANCE Databricks çalışma alanınızın bölgesi. Örnek: westus2.azuredatabricks.net
    DBX_PAT Daha önce oluşturduğunuz kişisel erişim belirteci.
    DBX_JOB_ID Çalışan işin tanımlayıcısı. Bu durumda, bu değer 1 .
  7. İşlev uygulamasının genel bakış sayfasında, yeni işlev düğmesine tıklayın.

    Yeni işlev

  8. Azure Event Grid tetikleyiciyi seçin.

    İstenirse Microsoft. Azure. WebJobs. Extensions. EventGrid uzantısını yükleyebilirsiniz. Yüklemek gerekirse, işlevi oluşturmak için Azure Event Grid tetikleyiciyi yeniden seçmeniz gerekir.

    Yeni işlev bölmesi görüntülenir.

  9. Yeni işlev bölmesinde, UpsertOrder Işlevini adlandırın ve ardından Oluştur düğmesine tıklayın.

  10. Kod dosyasının içeriğini bu kodla değiştirin ve Kaydet düğmesine tıklayın:

    using "Microsoft.Azure.EventGrid"
    using "Newtonsoft.Json"
    using Microsoft.Azure.EventGrid.Models;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    
    private static HttpClient httpClient = new HttpClient();
    
    public static async Task Run(EventGridEvent eventGridEvent, ILogger log)
    {
        log.LogInformation("Event Subject: " + eventGridEvent.Subject);
        log.LogInformation("Event Topic: " + eventGridEvent.Topic);
        log.LogInformation("Event Type: " + eventGridEvent.EventType);
        log.LogInformation(eventGridEvent.Data.ToString());
    
        if (eventGridEvent.EventType == "Microsoft.Storage.BlobCreated" | | eventGridEvent.EventType == "Microsoft.Storage.FileRenamed") {
            var fileData = ((JObject)(eventGridEvent.Data)).ToObject<StorageBlobCreatedEventData>();
            if (fileData.Api == "FlushWithClose") {
                log.LogInformation("Triggering Databricks Job for file: " + fileData.Url);
                var fileUrl = new Uri(fileData.Url);
                var httpRequestMessage = new HttpRequestMessage {
                    Method = HttpMethod.Post,
                    RequestUri = new Uri(String.Format("https://{0}/api/2.0/jobs/run-now", System.Environment.GetEnvironmentVariable("DBX_INSTANCE", EnvironmentVariableTarget.Process))),
                    Headers = {
                        { System.Net.HttpRequestHeader.Authorization.ToString(), "Bearer " +  System.Environment.GetEnvironmentVariable ("DBX_PAT", EnvironmentVariableTarget.Process)},
                        { System.Net.HttpRequestHeader.ContentType.ToString (), "application/json" }
                    },
                    Content = new StringContent(JsonConvert.SerializeObject(new {
                        job_id = System.Environment.GetEnvironmentVariable ("DBX_JOB_ID", EnvironmentVariableTarget.Process) ,
                        notebook_params = new {
                            source_file = String.Join("", fileUrl.Segments.Skip(2))
                        }
                    }))
                 };
                var response = await httpClient.SendAsync(httpRequestMessage);
                response.EnsureSuccessStatusCode();
            }
        }
    }
    

Bu kod, yükseltilen depolama olayı hakkında bilgi ayrıştırır ve sonra olayı tetikleyen dosyanın URL 'si ile bir istek iletisi oluşturur. İleti bir parçası olarak, işlev daha önce oluşturduğunuz source_file pencere öğesine bir değer geçirir. işlev kodu, iletiyi Databricks Işine gönderir ve daha önce kimlik doğrulaması olarak edindiğiniz belirteci kullanır.

Event Grid aboneliği oluşturma

Bu bölümde, depolama hesabına dosyalar yüklendiğinde Azure Işlevini çağıran bir Event Grid aboneliği oluşturacaksınız.

  1. İşlev kodu sayfasında Event Grid abonelik Ekle düğmesine tıklayın.

    Event Grid aboneliği Ekle düğmesini vurgulayan ekran görüntüsü.

  2. Olay aboneliği oluştur sayfasında, aboneliği adlandırın ve ardından depolama hesabınızı seçmek için sayfadaki alanları kullanın.

    Yeni olay aboneliği

  3. Olay türlerine Filtre Uygula aşağı açılan listesinde, oluşturulan blobu ve BLOB silinen olayları seçin ve ardından Oluştur düğmesine tıklayın.

Event Grid aboneliğini test etme

  1. Adlı bir dosya oluşturun customer-order.csv , aşağıdaki bilgileri bu dosyaya yapıştırın ve yerel bilgisayarınıza kaydedin.

    InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
    536371,99999,EverGlow Single,228,1/1/2018 9:01,33.85,20993,Sierra Leone
    
  2. Depolama Gezgini, bu dosyayı depolama hesabınızın giriş klasörüne yükleyin.

    bir dosyayı karşıya yüklemek, Microsoft. Depolama oluşturur. BlobCreated olayı. Event Grid tüm abonelere bu olaya bildirir. Bu durumda, Azure Işlevi tek abonemdir. Azure Işlevi, hangi olayın oluştuğunu belirleyen olay parametrelerini ayrıştırır. Daha sonra dosyanın URL 'sini Databricks Işine geçirir. Databricks Işi dosyayı okur ve depolama hesabınızda bulunan Databricks Delta tablosuna bir satır ekler.

  3. İşin başarılı olup olmadığını denetlemek için, databricks çalışma alanınızı açın, işler düğmesine tıklayın ve ardından işinizi açın.

  4. İş sayfasını açmak için işi seçin.

    Spark işi

    İş tamamlandığında, bir tamamlanma durumu görürsünüz.

    İş başarıyla tamamlandı

  5. Yeni bir çalışma kitabı hücresinde, güncelleştirilmiş Delta tablosunu görmek için bu sorguyu bir hücrede çalıştırın.

    %sql select * from customer_data
    

    Döndürülen tabloda en son kayıt gösterilmektedir.

    Tabloda en son kayıt görünür

  6. Bu kaydı güncelleştirmek için adlı bir dosya oluşturun customer-order-update.csv , aşağıdaki bilgileri bu dosyaya yapıştırın ve yerel bilgisayarınıza kaydedin.

    InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
    536371,99999,EverGlow Single,22,1/1/2018 9:01,33.85,20993,Sierra Leone
    

    Bu CSV dosyası, siparişin miktarı ' den ' e değiştirilmedikçe öncekiyle neredeyse aynıdır 228 22 .

  7. Depolama Gezgini, bu dosyayı depolama hesabınızın giriş klasörüne yükleyin.

  8. selectGüncelleştirilmiş Delta tablosunu görmek için sorguyu yeniden çalıştırın.

    %sql select * from customer_data
    

    Döndürülen tablo, güncelleştirilmiş kaydı gösterir.

    Güncelleştirilmiş kayıt tabloda görüntülenir

Kaynakları temizleme

Artık gerekli olmadığında kaynak grubunu ve tüm ilgili kaynakları silin. Bunu yapmak için depolama hesabına ait kaynak grubunu seçin ve Sil' i seçin.

Sonraki adımlar