Sei que junções com DataFrames coparticionados não são consideradas transformações amplas. Aqui estão as definições de transformações amplas e estreitas do artigo original .
dependências estreitas, onde cada partição do RDD pai é usada por no máximo uma partição do RDD filho, dependências amplas, onde várias partições filho podem depender dela.
Mesmo que os DataFrames sejam coparticionados, isso não significa necessariamente que suas partições correspondentes estejam localizadas no mesmo nó. Por exemplo, a partição P1 de df1
e P1 de df2
podem residir em nós diferentes. Portanto, durante a junção, a transferência de dados (por exemplo, mover P1 de df1
para o nó de P1 de df2
) ainda é necessária. No entanto, isso não é considerado um embaralhamento.
Tenho duas perguntas?
- Então, o que exatamente é um embaralhamento? Entendo que nem todas as transferências de dados de rede são consideradas embaralhadas.
- Que tipos de transferências de dados são consideradas embaralhadas? São apenas aquelas envolvidas em transformações amplas?
Embaralhando, cada executor escreve fragmentos para todos os outros executores. Imagine se tivéssemos 100 pessoas e cada uma enviasse uma carta para todas as outras.
Depois de escrever os fragmentos, cada executor precisa coletar os fragmentos recebidos de todos os outros executores. Como 100 pessoas recebendo cartas de todos os outros.
Em contraste, quando você tem RDDs coparticionados, mas não nos mesmos nós, cada executor precisa buscar apenas um fragmento. Como 100 pessoas recebendo 1 carta cada.