Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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é