• Aucun résultat trouvé

Le fonctionnaire a droit à une autorisation dans les cas suivants:

Dans le document Td corrigé textes adoptés pdf (Page 44-50)

Esta seção apresenta uma taxonomia que agrupa e classifica um conjunto de de- feitos funcionais que podem ocorrer em programas Spark. A taxonomia é dividida em três grupos principais que seguem o tipo de recurso que o defeito pode afetar, que são: Fluxo de Dados, que agrupa defeitos que podem aparecer na definição do fluxo de dados do programa; Operações, que agrupa defeitos em tipos específicos de operações; e Acumu- ladores, que agrupa defeitos relacionados com a utilização e definição de acumuladores. A taxonomia é apresentada na Figura 5.5. Os grupos são representados em caixas em cinza escuro e os defeitos de cada grupo são apresentados logo abaixo em caixas em cinza claro. Foram definidos 13 defeitos funcionais divididos nos três grupos. Os grupos e defeitos são apresentados a seguir.

F1 - Defeitos relacionados com o Fluxo de Dados: esse grupo descreve defeitos que

são relacionados com o fluxo de dados de um programa. O fluxo de dados representa a sequência de operações Spark (transformações e ações) que forma a lógica de um programa Spark. Defeitos nesse grupo representam erros ou enganos de programação na definição do fluxo de dados, o que pode incluir, por exemplo, enganos na definição da ordem em que as operações são chamadas, ausência de alguma operação ou operação errada. Os defeitos desse grupo são apresentados a seguir.

F1.1 - Definição Incorreta do Fluxo de Dados: esse defeito está relacionado com definição do fluxo de dados de um programa Spark de forma incorreta. O fluxo de dados é definido a partir de uma sequência de transformações seguida por uma operação de ação que finaliza o processo. Defeitos desse tipo consistem na definição incorreta dessa sequência de operações. Por exemplo, dentro de um fluxo de dados pode conter duas transformações que operam sobre conjuntos de dados do mesmo tipo e retornam conjuntos de dados do mesmo tipo. Dessa forma, a ordem em que essas transformações são chamadas poderia ser trocada sem causar um erro de tipos no fluxo de dados. Entretanto, a troca na ordem de chamada das transformações poderia causar um erro, dado que essa troca pode gerar resultados diferentes.

F1.2 - Operação Incorreta no Fluxo de Dados: esse defeito se refere a chamada de uma operação incorreta na sequência de operações que formam o fluxo de dados de um pro- grama Spark.

F2 - Defeitos relacionados com Operações: esse grupo descreve defeitos que são

Taxonomia de Defeitos Funcionais para Apache Spark Fluxo de Dados Definição Incorreta do Fluxo de Dados Operações Definição Incorreta do Mapeamento Operação Incorreta no Fluxo de Dados Acumuladores Uso de Variáveis Livres na Acumulação de Dados Definição Incorreta do Acumulador Agregação Não Comutativa e Não Associativa Definição Incorreta da Agregação Ordenação Incorreta Operação Binária Incorreta Junção Incorreta Tratamento Incorreto de Dados Duplicados Ação Incorreta Definição Incorreta da Filtragem

Figura 5.5 – Taxonomia de Defeitos Funcionais para Apache Spark.

representam enganos ou erros de programação em operações, tratando uma operação de forma isolada do fluxo de dados. Exemplos de defeitos nesse grupo são a incorreta definição de uma operação, como a passagem de uma função ou parâmetro incorreto, e a chamada de uma operação incorreta, como chamar uma operação no lugar de outra. F2.1 - Definição Incorreta do Mapeamento: esse defeito se refere a definição incorreta de uma operação de mapeamento. Operações de mapeamento recebem como entrada uma função que mapeia um elemento do conjunto de dados para um ou mais outros elementos do conjunto de dados resultante. Deste modo, defeitos em operações do tipo podem ocorrer com a incorreta definição da função de mapeamento ou com a passagem da função de mapeamento errada.

incorreta de um operação de filtragem de dados. Operações de filtragem fazem a seleção de elementos de um conjunto de dados a partir de uma função ou expressão condicional que avalia se um elemento continua ou não no conjunto de dados resultante. Defeitos em operações desse tipo ocorrem com a definição incorreta da função ou expressão condicional, assim como, a chamada incorreta de uma operação de filtragem.

F2.3 - Agregação Não Comutativa e Não Associativa: esse defeito está relacionado com a definição de operações de agregação que não respeitam as propriedades de comutatividade e associatividade. Operações desse tipo fazem a agregação de dados agrupados a partir de uma função que define como esses dados serão agrupados. A execução de operações de agregação em um ambiente de processamento paralelo e distribuído, como o que opera o Apache Spark, faz com que a função de agregação tenha que ser comutativa e associativa para que seus resultados sejam determinísticos (CHEN et al., 2017). Dessa forma, como não é possível ter um controle da ordem em que os dados serão processados dada as características do ambiente distribuído, uma função de agregação que não é comutativa e associativa é um defeito dado que seu resultado é não determinístico.

F2.4 - Definição Incorreta da Agregação: esse defeito está relacionado com a definição incorreta de operações de agregação, podendo constituir na definição incorreta da função de agregação, assim como a chamada de uma operação de agregação incorreta.

F2.5 - Ordenação Incorreta: esse defeito está relacionado com a aplicação incorreta de uma operação de ordenação. Operações desse tipo ordenam os elementos de um conjunto de dados de forma ascendente ou descendente a partir de algum critério. Defeitos desse tipo consistem na aplicação da operação com uma ordem incorreta (ascendente ou des- cendente), na definição incorreta do critério de ordenação e na chamada incorreta de uma operação de ordenação.

F2.6 - Operação Binária Incorreta: esse defeito está relacionado com operações aplicadas em dois conjuntos de dados. Algumas das principais operações do tipo são as baseadas em operações de conjuntos matemáticos (união, interseção e diferença) e operações de junção. Esse defeito consiste na chamada de uma operação binária incorreta, como chamar uma operação ao invés de outra.

F2.7 - Junção Incorreta: esse defeito está relacionado de forma específica com operações de junção entre dois conjuntos de dados. Existem diferentes tipos de junção, como a junção interna (inner join), que combina os elementos de dois conjuntos de dados com base em uma relação comum, como uma mesma chave, e junções externas (outer join), que permitem a combinação de elementos de dois conjuntos de dados que possuem ou não uma relação em comum. Esse defeito se refere a aplicação de uma operação de junção do tipo errado ou da definição incorreta da relação entre os dois conjuntos de dados (chave). F2.8 - Tratamento Incorreto de Dados Duplicados: esse defeito está relacionado com o

tratamento incorreto de conjuntos de dados que podem conter elementos repetidos e é requisitado que esses não o tenham. O Apache Spark fornece a operação distinct para que elementos duplicados sejam removido. Dessa forma, um defeito desse tipo pode ser a não aplicação ou incorreta aplicação de distinct.

F2.9 - Ação Incorreta: esse defeito se refere a chamada de uma operação de ação incorreta, como a chamada de uma ação errada ou a passagem de um parâmetro de entrada incorreto para uma ação.

F3 - Defeitos relacionados com Acumuladores: esse grupo descreve defeitos relaci-

onados com as variáveis compartilháveis do tipo acumulador. Acumuladores são variáveis compartilhadas que permitem que elementos sejam agregados nos executores (processos que executam o programa de forma distribuída no cluster ) e que seu resultado seja re- tornado ao programa principal (Driver ). Defeitos desse grupo podem ocorrer com o uso incorreto de variáveis em programas Spark e com a definição incorreta de acumuladores. F3.1 - Uso de Variáveis Livres na Acumulação de Dados: este defeito se refere ao uso de uma variável livre (variável utilizada em uma função que foi definida fora de seu escopo) dentro de uma operação Spark para propagar valores agregados nos executores para o programa principal. Quando uma clausura (função que possui referências à variáveis livres) é passada para uma operação Spark, as variáveis livres referenciadas nessa função são copiadas e enviadas para cada tarefa que vai ser executada no cluster. Então, quando uma variável dessas é modificada dentro da operação Spark, seu valor não é propagado para o programa principal porque foi a variável local que foi modificada e não a que se encontra no Driver. Para que esse valor fosse propagado para o programa principal, é necessário utilizar uma variável compartilhada do tipo acumulador. Logo, não utilizar um acumulador nesse caso pode ocasionar um comportamento incorreto já que a variável no programa principal não vai ser atualizada.

F3.2 - Definição Incorreta do Acumulador : esse defeito se refere a definição incorreta de um acumulador personalizado. O Spark fornece acumuladores para tipos numéricos básicos, mas permite que seja definido um acumulador personalizado para outros tipos que não são suportados nativamente. Defeitos desse tipo podem ocorrer com a definição incorreta desse acumulador personalizado. Por exemplo, acumuladores também precisam respeitar as propriedades de comutatividade e associatividade uma vez que esses são processados de forma paralela e distribuída. Dessa forma, se um acumulador não respeita essas propriedades, seus resultados são não-determinísticos.

5.3

Uma Análise da Taxonomia de Defeitos Funcionais para Apa-

Dans le document Td corrigé textes adoptés pdf (Page 44-50)