Otimizando AUs Azure Data Lake Analytics


Os jobs processados pelo Azure Data Lake Analytics ( ADLA ) são cobrados pela quantidade de AUs utilizadas por hora, conforme descrito na documentação oficial. Otimizar o número de AUs em cada Job não é somente sobre economizar dinheiro, e sim sobre otimizar o seu ambiente para execução de jobs.

Antes de demonstrar como analisar se a quantidade de AUs esta adequada, e quais ganhos podemos ter com um aumento ou diminuição delas, é importante entender como o ADLA faz o uso. ( Para quem estiver acostumado a clusters Hadoop, vocês podem imaginar as AUs sendo um container Yarn )

AUs (Analytics Units) são as unidades de processamento utilizadas pelo ADLA ao executar um Job, sendo o job um script U-SQL. Atualmente existe o limite de 250 AU por cada ADLA Account, e é possível executar 20 Jobs em paralelo. Esses valores podem ser alterados mediante a abertura de um chamado, não vou abordar sobre isso nesse post. Vocês devem imaginar que quanto maior o número de AUs utilizadas pelo job, mais rápido será o processamento do mesmo, mas isso não é sempre verdade, e é exatamente o que eu quero demonstrar aqui, junto a possíveis malefícios em utilizar valores muito altos.

Com 250 AUs posso ter vários cenários, como por exemplo:

1 job utilizando 250 AU

10 jobs utilizando 25 AU cada

2 jobs utilizando 100 AU cada e 50 AU disponíveis

Conforme os exemplos acima, logo de cara podemos perceber que quanto maior o número de AUs, menor a quantidade de jobs executados simultaneamente. Também validamos que não é necessário utilizar todas as AUs em um unico job. Não analisamos o tempo de execução para cada job e quantidade de AUs que o job se beneficia. Ok, e como fazemos isso?! Data Lake Tools for Visual Studio é a resposta!

Após instalar o Data Lake Tools for Visual Studio e entender o básico da navegação ( o último link vai auxilia-los nisso), é hora de analisar um job.

Vamos executar o job abaixo com 1 AU. Os seguintes passos serão realizados durante a execução:

    • Script sera carregado na nuvem, compilado e otimizado pelo compile service.
    • Alocado em fila para execução.
    • Executado.
    • Finalizado.

 

@searchlog =
EXTRACT UserId          int,
Start           DateTime,
Region          string,
Query           string,
Duration        int,
Urls            string,
ClickedUrls     string
FROM @"/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();//Insert it into a previously created table
INSERT INTO SampleDBTutorials.dbo.SearchLog
SELECT *
FROM @searchlog;

 

Esse script basicamente lê informações do arquivo SearchLog.Tsv, que esta armazenado em um Azure Data Lake Store relacionado ao ADLA, e salva as informações em uma managed table criada por outro script no ADLA. ( Para mais informações sobre managed tables e external tables, vocês podem olhar aqui)

Por quê você começou executando somente com 1 AU? Preciso avaliar o plano de execução para decidir aumentar ou não a quantidade de AUs, não existe fórmula para especificar a melhor quantidade de AU para a primeira execução, o recomendado é avaliar seu input, e calcular 1 GB de dados por cada 1 AU.

image

 

Analisando o job graph acima, vemos que nosso job foi dividido em vários “pedaços” chamados vertices, que são agrupados em Stage ou Super Vértices ( Retângulos verdes).

Em cada um dos super vértices, temos a informação de quantos vérticies foram utilizados para processar, quantas linhas foram processadas, reads, writes, etc. Abaixo uma imagem com todas as informações.

image

Cada vértice pode processar 1 AU, dessa forma os super vérticies que alocaram mais de 1 vértice, podem fazer uso de mais AUs caso elas sejam alocadas (paralelismo).

No cenário em que estamos trabalhando, os super vértices SV1e SV3 utilizam somente 1 vértice e não são executadas simultaneamente, ou seja, a execução do job com AU = 1 é suficiente para essas stages. Para o SV2, foram criados 2 vértices, utilizando  AU = 1 não seria possível executar os 2 vertices em paralelo, sendo necessário executa-los em série. Nesse cenário seria interessante aumentar a quantidade de AUs para 2, mas e se aumentarmos para 5?

image

Aumentando a quantidade de AUs para 5, o job processou mais rápido conforme podemos verificar pela imagem acima, mas processamos com 5 AUs e de acordo com o job graph são utilizados no máximo 2 em paralelo, quer dizer que estou alocando mais recurso do que preciso e não utilizando? A resposta é SIM! Se verificarmos a aba Diagnostics dentro do Visual Studio, vamos descobrir que o próprio ADLA nos diz isso.

 

image

Temos 3 AUs alocadas a mais do que o necessário!!

Esse seria um exemplo de um troubleshooting básico, em um cenário real com milhares de dados e transformações, teriamos muitos outros super vértices e possivelmente muitos outros vértices. Mas da mesmo forma seria um bom ponto de partida para otimizar seus jobs.

Informações mais detalhadas sobre o Job Browser e o Job View podem ser encontradas aqui.

[]s André


Comments (0)

Skip to main content