Ejemplo de cómo crear una Azure Data Factory

Por: Luis Ramirez

En este blog vamos a realizar un ejemplo de cómo crear una Azure Data Factory. Para realizar este ejercicio se requiere tener una cuenta de SQL Azure, Azure SQL Database, Azure Blob Storage, acceso al portal nuevo de Azure y Azure PowerShell.

Siguiendo los pasos descritos anteriormente

Paso 1. Desde el portal crear una “Azure Data Factory”

Existen dos formas de crear una “Azure Data Factory” desde el portal de internet o mediante PowerShell.

1.1 Abrir el Portal https://Portal.Azure.com y navegar a [ + New] -> [Data Analytics] -> [Data Factory]

1.2 Una vez subministrado nombre , grupo le damos crear:

 

Paso 2. Crear un servicio enlazado (“Linked Service”)

Una vez creada la Azure Data Factory se crean los servicios enlazados, para este ejemplo usaremos servicios enlazado de almacenamiento de datos.

2.1 En el portal seleccionamos el ADF creado seleccionamos [Author and deploy] y nos mostrara la ventana de edición. En el editor seleccionar [New Data store] y después [Azure Storage] y nos mostrara la plantilla de script JSON (JavaScript Object Notation) para crear servicios enlazados de almacenamiento de datos.

2.2 Remplazar <accountname> , <accountkey> con sus valores correspondientes y seleccionar [Deploy]

Nota: Esta información se puede obtener navegando desde el portal:

Portal -> BROWSE -> Storage Accounts -> seleccionar la cuenta-> KEYS –>

 

2.3 Bajo la misma ventana de Edición seleccionar [New Data store] y después [Azure SQL Database] y nos mostrara la plantilla de script JSON para crear servicios enlazados de almacenamiento de datos.

Remplazar <servername>, <databasename>, <username@servername>, <password> con sus valores correspondientes y seleccionar Deploy

Nota: Esta información se puede obtener navegando desde el portal:

Portal -> BROWSE -> SQL databases -> Seleccionar la base de datos -> Propiedades –>

 

Paso 3. Crear conjuntos de datos (“Datasets”) de entrada y salida de datos

A continuación definiremos dos tablas que manejaremos para representar los datos de entrada y salida

Tabla de entrada. Apuntara al contenedor de BLOB en el almacenamiento de Azure definido por el servicio enlazado de StorageLinkedService

3.1 En el editor de Data Factor seleccionar [New Dataset] y [Azure Blob Storage]

 

Personalizar el script para definir la tabla de entrada:

{

    "name": "TablaAgentesBlob",

    "properties":

    {

        "structure": 

         [

            { "name": "BusinessEntityID", "type": "Int"},

            { "name": "PersonType", "type": "String"},

            { "name": "Title", "type": "String"},

            { "name": "FirstName", "type": "String"},

            { "name": "MiddleName", "type": "String"},

            { "name": "LastName", "type": "String"},

            { "name": "Sales", "type": "Int"}

        ],

        "location":

        {

            "type": "AzureBlobLocation",

                "folderPath": "ejemploadf/",

            "format":

            {

                "type": "TextFormat",

                "columnDelimiter": ","

            },

            "linkedServiceName": "StorageLinkedService"

        },

        "availability":

        {

            "frequency": "hour",

            "interval": 1,

            "waitonexternal": {}

        }

    }

}

En donde, indicamos la estructura a usar, la localidad, el tipo (AzureBlobLocation) el formato (texto delimitado por coma) y el servicio enlazado que definimos en el paso 2 (StorageLinkedService)

 

Tabla de Salida. Apunta a una tabla de SQL en la base de datos de Windows Azure definida en el servicio enlazado de AzureLinkedService.

3.2 En el editor de Data Factor seleccionar [New Dataset] y [Azure SQL]

{

    "name": "TablaSQLVentas",

    "properties":

    {

        "structure":

        [

            { "name": "BusinessEntityID", "type": "Int"},

            { "name": "PersonType", "type": "String"},

            { "name": "Title", "type": "String"},

            { "name": "FirstName", "type": "String"},

        { "name": "MiddleName", "type": "String"},

            { "name": "LastName", "type": "String"},

            { "name": "Sales", "type": "Int"}

        ],

        "location":

        {

            "type": "AzureSQLTableLocation",

            "tableName": "Ventas",

            "linkedServiceName": "AzureSqlLinkedService"

        },

        "availability":

        {

            "frequency": "Hour",

            "interval": 1

        }

    }

}

 

Bajo localidad ponemos el tipo “AzureSQLTableLocation”, linkedServiceName ponemos el creado en el paso 2 “AzureSqlLinkedService”, se pone el nombre de la tabla Ventas (que ya tiene que estar creada ejemplo al final del ejercicio)

La cuestión de la frecuencia es para generar salidas particionadas por hora

 

Paso 4. Crear un conducto (“Pipeline”)

Vamos a crear una actividad de copiado de TablaAgentesBlob a TablaSQLVentas

4.1 En el editor de Data Factor seleccionar [New Pipeline] (en caso de no visualizarse dar click a […])

{

    "name": "PipelineCopiado",

    "properties":

    {

        "description" : "Copia datos de un blob a una tabla en Windows Azure SQL database",

        "activities":

        [

            {

                "name": "CopiaBlobaSQL",

                "description": "Pippeline Hola Mundo",

                "type": "CopyActivity",

                "inputs": [ {"name": "TablaAgentesBlob"} ],

                "outputs": [ {"name": "TablaSQLVentas"} ],

                "transformation":

                {

             "source":

                    {

                        "type": "BlobSource"

                    },

                    "sink":

                    {

                        "type": "SqlSink"

                    }

  },

                "Policy":

                {

                    "concurrency": 1,

                    "executionPriorityOrder": "NewestFirst",

                    "style": "StartOfInterval",

                    "retry": 0,

               "timeout": "01:00:00"

                }

            }

        ],

 

        "start": "2015-05-11T00:00:00Z",

        "end": "2015-05-12T00:00:00Z",

        "isPaused": false

    }

}

 

Después seleccionamos [Deploy]

En el script se nota que se configura el tipo de actividad como copiado, la fuente, destino y la transformación.

Es necesario poner la fecha de inicio en formato ISO.

 

Paso 5. Monitoreo de porción (“slice”) y conductos (“Pipeline”)

Usando la herramienta “Azure Storage Explorer” (enlace al final del documento) subimos el archivo fuente EMP_SALES.CSV (eliminar el primer renglón de títulos de columnas)

Contenedor “EjemploAdf” definido en paso 3 en Conjunto de Datos (DataSet) de entrada:

            Ahora desde el portal de Azure seleccionar el Data Factory creado:

            Podemos revisar el diagrama por errores:

  

Seleccionamos TablaSQLVentas

  

Seleccionar bajo “monitoring” la actividad para obtener más información

  

Podemos ver que el error es debido a que está tratando de convertir una cadena a entero:

 

Una vez corregido el problema (en mi caso eliminar el primer renglón de encabezados) vuelvo a correr la actividad y nos mostrara de la siguiente manera:

 

Si nos vamos a DataSet y seleccionamos nuestras fuentes ya muestran actividades verificadas:

 

Ahora usando SQL Server Management Studio nos podemos conectar a la base de datos de Windows Azure y correr la siguiente consulta:

 

 

INFORMACION ADICIONAL:

- Para crear la tabla destino usada en mi ejemplo en Windows Azure SQL Database corrí el siguiente transact SQL:

CREATE TABLE dbo.Ventas (

       [BusinessEntityID] [int] NOT NULL,

       [PersonType] [nchar](2) NOT NULL,

       [Title] varchar(8) NULL,

       [FirstName] varchar(50) NOT NULL,

       [MiddleName] varchar(50) NULL,

       [LastName] varchar(50) NOT NULL,

       [Sales] [int] NOT NULL,

)

GO

CREATE CLUSTERED INDEX IX_VENTAS_ID ON dbo.Ventas (BusinessEntityID);

 

- Al tratar de configurar el servicio enlazado a la base de datos de Windows Azure me indicaba el siguiente error:

Instale “AzurePowerShell SDK”

Ejecuté el Microsoft Azure PowerShell y lo cambie a modo AzureResourceManager para poder correr “Get-AzureDataFactoryLinkedService”

PS C:\> Switch-AzureMode -Name AzureResourceManager

Agregue mi cuenta con Add-AzureAccount y después liste los servicios enlazados:

PS C:\> Get-AzureDataFactoryLinkedService -ResourceGroupName ADF -DataFactoryName WikiADF | format-list

El cual lista error en AzureSQLLinkedService, para arreglar este error tuve que ir bajo firewall habilitar conexión a servicios:

Portal Nuevo y Portal anterior:

Una vez hecho el cambio al listar ya aparecen ambos servicios enlazados en línea:

 

Mas Información: