Image
Ocak 17 2016 02:28

Data Factory ile Sql Azure & Warehouse

           Evet Cloud mimarisi ile birlikte hayatımızda pek çok şey değişmiştir. İster uygulama geliştiricisi olun, ister SaaS uygulamarı geliştiren bir yazılım firması olun yada iş sürekliliğini sağlamayı,
daha az maliyetle daha fazla performans elde etmeyi isteyen herhangi bir sektördeki herhangi bir firma olun. Databaselerin(sadece databaselerin değil, konumuz database olduğu için sadece onu kullandım) backupları, replikasyonları, güvenlikleri 24 saat up olmaları ve daha bin türlü işlem için
Database admin, sistemci, analizci, datacenter maliyetlerinden kurtulup ekonomi yapmayı düşünüyorsanız cloud çözümlerini incelemenizi öneririm. 

Bildiğiniz gibi SSIS yani SQL Server Integration Services ile farklı data kaynaklarından aldığı dataları isterse transforme edip başka bir veri kaynağına yazmaya yarayan yetenekli bir araçtır.
Azure platfoımunda ne yazıkki bu tool yok, onun yerine Data Factory denilen bir servis eklenmiş henüz çok yeni olmasına rağmen SSIS bütün yeteneklerini kazanacağını düşünüyorum.
Bizimki gibi bir mecburiyetiniz yoksa kullanmak için ürünün tamamlanmasını beklemenin daha faydalı olacağına inanıyorum.

Bizim senaryomuzda Sql Azure Databaseleri içindeki verilerimizin Sql Data Warehouse taşınması gerekiyordu. Bende bundan yola çıkarak bu makale için aşağıdaki şekildeki gibi bir kurgu oluşturdum.
Sql azure db sinde Brand adında bir tablomuz var, bu tablodaki dataları sql datawarehouse- da ki yine aynı isimdeki bir tabloya taşıyacağız.

Not : Data Factory, Daha Warehouse, DocumentDb  gibi bazı özellikleri https://manage.windowsazure.com  adresindeki portalda bulamayacaksınız bu yüzden azurenin yeni platformu olan ve henüz deneme aşamasında olan 
https://portal.azure.com  üzerinden yapmanız gerekiyor. (Siz bu makaleyi okudunuzda belki realse olur)

Data Factory tanımlama adımını geçiyorum, sizden Data Factory adını, üyeliğinizi, resource grubu ve bu factory in konuşlanacağı Regionu seçmenizi isteyecek. bu adamları geçtikten sonra

Adım 1: Veri kaynaklarını tanımlama 
bu adımda Data Factory-in Linked Services bölümündeki verinin alınacağı ve yazılacağı kaynakları tanımlayacağız. Evet bildiğiniz ConnectionString

Aşağıdaki şekilde görüldüğü gibi datanın alınacağı Azure Sql Databasei için "azuresqldb" adında bir sevice tanımladım
 

azure

code: 

{
    "name": "azuresqldb",
    "properties": {
        "description": "",
        "hubName": "repzonedwhfactory_hub",
        "type": "AzureSqlDatabase",
        "typeProperties": {
            "connectionString": "Data Source=tcp:{db}.database.windows.net,1433;Initial Catalog={db name};User ID={userid};Password={pwd};Encrypt=True;TrustServerCertificate=False;Application Name=\"Azure Data Factory Linked Service\""
        }
    }
}

böylece Azure Sql Database nde ki Brand tablomuza erişecek bağlantı adresini yani linked Service yi tanımlamış olduk. Şimdi bir benzerini Sql Data Warehouse için yapmalıyız.
onun adını da  "dwhLinkedService"   diye tanımladım.

{
    "name": "dwhLinkedService",
    "properties": {
        "description": "",
        "hubName": "repzonedwhfactory_hub",
        "type": "AzureSqlDW",
        "typeProperties": {
            "connectionString": "Data Source=tcp:{db}.database.windows.net,1433;Initial Catalog={db name};User ID={user id};Password={pwd};Encrypt=True;TrustServerCertificate=False;Application Name=\"Azure Data Factory Linked Service\""
        }
    }
}

Dataların alınacağı kaynakları tanımladıktan sonra adım 2 ye DataSets lerin tanıma geçebiliriz.

Adım 2: DataSet leri tanımlama 
Bu adımda, verinin alınacağı ve yazılacağı serverlerdeki data yapılarını tanımlıyor olacağız. Bizim senaryomuzda her ikiside Table olduğu için table yapılarını tanımlayacağız.
Ancak bunlar farklı da olabilirdi. Azura blob,cloud table vs olabilir kaynak veya hedef.

Dataset 1 : BrandFromSqlDb

{
    "name": "BrandFromSqlDb",
    "properties": {
        "structure": [
            {
                "name": "Id",
                "type": "Int32"
            },
            {
                "name": "TenantId",
                "type": "Int32"
            },
            {
                "name": "Name",
                "type": "String"
            },
            {
                "name": "RecordDateUtc",
                "type": "Datetime"
            },
            {
                "name": "ModificationDateUtc",
                "type": "Datetime"
            },
            {
                "name": "State",
                "type": "Int16"
            }
        ],
        "published": false,
        "type": "AzureSqlTable",
        "linkedServiceName": "azuresqldb",
        "typeProperties": {
            "tableName": "Brands"
        },
        "availability": {
            "frequency": "Minute",
            "interval": 15
        },
        "external": true,
        "policy": {}
    }
}

Burada dikkat edilmesi gereken 

    "type": "AzureSqlTable" 

Bu datasetin bağlı bulunduğu kaynağa dair bilgiyi barındırıyor. bizim örneğimizde Azure Sql Database olduğu için AzureSqlTable seçiyorum. Peki başka neler var  birazdan dwh için tanımlacağımız AzureSqlDWTable var
AzureTable,CustomDataset,Oracletable,RelationalTable,SqlServerTable var şimdilik.

 "linkedServiceName": "azuresqldb"  

Yukarı da tanımladığımız Linked Service içindeki name yani bu dataset azuresqldb servisi ile beslenecek 

  "typeProperties": {
            "tableName"
: "Brands"
        },

Azure Sql Database içinde verinin alınacağı Tablo adı, scriptin devamında kaç dakikada bir taşınma işleminin yapılacağı bilgisi var.

 

Dataset 2 : BrandToSqlDataWarehouseDataSet

{
    "name": "BrandToSqlDataWarehouseDataSet",
    "properties": {
        "structure": [
            {
                "name": "Id",
                "type": "Int32"
            },
            {
                "name": "TenantId",
                "type": "Int32"
            },
            {
                "name": "Name",
                "type": "String"
            },
            {
                "name": "RecordDateUtc",
                "type": "Datetime"
            },
            {
                "name": "ModificationDateUtc",
                "type": "Datetime"
            },
            {
                "name": "State",
                "type": "Int16"
            }
        ],
        "published": false,
        "type": "AzureSqlDWTable",
        "linkedServiceName": "dwhLinkedService",
        "typeProperties": {
            "tableName": "Brands"
        },
        "availability": {
            "frequency": "Minute",
            "interval": 15
        }
    }
}

Burada dikkat edilmesi gereken 

    "type": "AzureSqlDWTable" 

Bu datasetin bağlı bulunduğu kaynağa dair bilgiyi barındırıyor. bizim örneğimizde Azure Data Warehouse olduğu için AzureSqlDWTable seçiyorum.  

 "linkedServiceName": "dwhLinkedService"  

Yukarı da tanımladığımız Linked Service içindeki name yani bu dataset dwhLinkedService servisi ile beslenecek 

  "typeProperties": {
            "tableName"
: "Brands"
        },

Azure Data Warehouse içinde verinin yazılacağı Tablo adı

işin sonunda elimize aşağıdaki gibi iki dataset olmalı.

azure

ve dwh a ait aşağıdaki dataset

azure

bütün bu tanımlamaları yaptıktan sonra artık DataFactory tanımlama işlemimiz bitmiş oluyor. Aşağıdaki gibi bir diyagram elde etmiş olmamız gerekiyor.

azure

factory çalışmaya başladığında datalar taşınacaktır.

2015 : memet tayanç