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 stringFROM @"/Samples/Data/SearchLog.tsv"USING Extractors.Tsv();//Insert it into a previously created tableINSERT INTO SampleDBTutorials.dbo.SearchLogSELECT *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.
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.
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?
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.
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é