De acordo com o Learning Spark
Lembre-se de que o reparticionamento dos dados é uma operação bastante cara. O Spark também possui uma versão otimizada do
repartition()
chamadocoalesce()
que permite evitar a movimentação de dados, mas apenas se você estiver diminuindo o número de partições RDD.
Uma diferença que recebo é que, com repartition()
o número de partições, é possível aumentar / diminuir, mas com coalesce()
o número de partições, só é possível diminuir.
Se as partições estão espalhadas por várias máquinas e coalesce()
são executadas, como evitar a movimentação de dados?
fonte
minimize data movement
vez deavoiding data movement
.repartition
deve ser usado em vez decoalesce
?repartition
faz é chamarcoalesce
com oshuffle
parâmetro definido como true. Deixe-me saber se isso ajuda.shuffle = true
bandeiraA resposta de Justin é incrível e essa resposta entra em mais profundidade.
O
repartition
algoritmo faz uma shuffle completa e cria novas partições com dados distribuídos uniformemente. Vamos criar um DataFrame com os números de 1 a 12.numbersDf
contém 4 partições na minha máquina.Aqui está como os dados são divididos nas partições:
Vamos fazer um shuffle completo com o
repartition
método e obter esses dados em dois nós.Aqui está como os
numbersDfR
dados são particionados na minha máquina:O
repartition
método cria novas partições e distribui uniformemente os dados nas novas partições (a distribuição de dados é mais uniforme para conjuntos de dados maiores).Diferença entre
coalesce
erepartition
coalesce
usa partições existentes para minimizar a quantidade de dados que são embaralhados.repartition
cria novas partições e faz uma reprodução aleatória completa.coalesce
resulta em partições com diferentes quantidades de dados (às vezes partições com tamanhos muito diferentes) erepartition
resulta em partições de tamanho aproximadamente igual.É
coalesce
ourepartition
mais rápido?coalesce
pode executar mais rápido querepartition
, mas partições de tamanhos desiguais geralmente são mais lentas para trabalhar com partições de tamanhos iguais. Você geralmente precisará reparticionar conjuntos de dados após filtrar um grande conjunto de dados. Descobrirepartition
ser mais rápido no geral, porque o Spark foi desenvolvido para funcionar com partições de tamanhos iguais.NB: Curiosamente, observei que a repartição pode aumentar o tamanho dos dados no disco . Certifique-se de executar testes ao usar a repartição / coalescência em grandes conjuntos de dados.
Leia esta postagem no blog se desejar obter mais detalhes.
Quando você usar coalescência e reparticionamento na prática
fonte
rdd.glom().map(len).collect()
mas dá muitos erros de OOM.repartition
algoritmo não distribui dados igualmente para conjuntos de dados muito pequenos. Eu costumavarepartition
organizar 5 milhões de registros em 13 partições e cada arquivo tinha entre 89,3 MB e 89,6 MB - isso é quase igual!Um ponto adicional a ser observado aqui é que, como o princípio básico do Spark RDD é a imutabilidade. A repartição ou coalescência criará um novo RDD. O RDD base continuará a existir com o número original de partições. Caso o caso de uso exija a persistência do RDD no cache, o mesmo deverá ser feito no recém-criado RDD.
fonte
repartition
- é recomendável usá-lo enquanto aumenta o número de partições, pois envolve a baralhamento de todos os dados.coalesce
- é recomendável usá-lo enquanto reduz o número de partições. Por exemplo, se você possui 3 partições e deseja reduzi-las para 2,coalesce
os dados da 3ª partição serão movidos para as partições 1 e 2. As partições 1 e 2 permanecerão no mesmo contêiner. Por outro lado,repartition
embaralha os dados em todas as partições, portanto, o uso da rede entre os executores será alto e afetará o desempenho.coalesce
executa melhor do querepartition
ao reduzir o número de partições.fonte
O que se segue dos códigos e documentos de código
coalesce(n)
é o mesmocoalesce(n, shuffle = false)
erepartition(n)
o mesmo quecoalesce(n, shuffle = true)
Assim, ambos
coalesce
erepartition
podem ser usados para aumentar o número de partiçõesOutra observação importante a ser destacada é que, se você diminuir drasticamente o número de partições, deverá considerar usar a versão aleatória de
coalesce
(o mesmorepartition
nesse caso). Isso permitirá que seus cálculos sejam executados em paralelo nas partições pai (várias tarefas).Consulte também a resposta relacionada aqui
fonte
Todas as respostas estão adicionando um grande conhecimento a essa pergunta muito frequente.
Então, seguindo a tradição da linha do tempo dessa pergunta, aqui estão meus 2 centavos.
Eu achei a repartição mais rápida que unir , em casos muito específicos.
No meu aplicativo, quando o número de arquivos que estimamos é menor que o limite certo, a repartição funciona mais rapidamente.
Aqui está o que eu quero dizer
No snippet acima, se meus arquivos tivessem menos de 20 anos, a coalescência levaria uma eternidade para terminar, enquanto a repartição era muito mais rápida e, portanto, o código acima.
Obviamente, esse número (20) dependerá do número de trabalhadores e da quantidade de dados.
Espero que ajude.
fonte
Repartição : embaralhe os dados em um NOVO número de partições.
Por exemplo. O quadro de dados inicial é particionado em 200 partições.
df.repartition(500)
: Os dados serão embaralhados de 200 partições para novas 500 partições.Agrupar : embaralhe os dados para o número existente de partições.
df.coalesce(5)
: Os dados serão embaralhados das 195 partições restantes para as 5 partições existentes.fonte
Gostaria de acrescentar à resposta de Justin e Power que -
repartition
irá ignorar as partições existentes e criar novas. Então você pode usá-lo para corrigir a inclinação dos dados. Você pode mencionar chaves de partição para definir a distribuição. A inclinação dos dados é um dos maiores problemas no espaço de problemas do 'big data'.coalesce
funcionará com as partições existentes e embaralhará um subconjunto delas. Ele não pode corrigir tanto a inclinação dos dados quanto orepartition
faz. Portanto, mesmo que seja menos caro, pode não ser o que você precisa.fonte
A todas as ótimas respostas, gostaria de acrescentar que essa
repartition
é a melhor opção para tirar proveito da paralelização de dados. Enquantocoalesce
uma opção barata para reduzir as partições, é muito útil ao gravar dados no HDFS ou em algum outro coletor para aproveitar grandes gravações.Eu achei isso útil ao escrever dados no formato parquet para obter o máximo proveito.
fonte
Para alguém que teve problemas ao gerar um único arquivo csv do PySpark (AWS EMR) como saída e salvá-lo no s3, o uso da repartição ajudou. A razão é que a coalescência não pode fazer um baralhamento completo, mas a repartição pode. Essencialmente, você pode aumentar ou diminuir o número de partições usando a repartição, mas só pode diminuir o número de partições (mas não 1) usando a coalescência. Aqui está o código para quem está tentando escrever um csv do AWS EMR para o s3:
fonte
De uma maneira simples COALESCE: - é apenas para diminui o número de partições, sem embaralhamento de dados, apenas comprime as partições
REPARTIÇÃO: - é para aumentar e diminuir o número de partições, mas o embaralhamento ocorre
Exemplo:-
Ambos funcionam bem
Mas geralmente fazemos essas duas coisas quando precisamos ver a saída em um cluster, seguimos com isso.
fonte
Mas você também deve se certificar de que os dados que estão chegando aos nós de coalescência devem estar altamente configurados, se você estiver lidando com dados enormes. Como todos os dados serão carregados nesses nós, pode levar à exceção da memória. Embora a reparação seja cara, prefiro usá-la. Uma vez que embaralha e distribui os dados igualmente.
Seja prudente ao escolher entre coalescer e reparticionar.
fonte
O
repartition
algoritmo faz uma mistura completa dos dados e cria partições de tamanho igual.coalesce
combina partições existentes para evitar uma reprodução aleatória completa.O Coalesce funciona bem para obter um RDD com muitas partições e combinar partições em um único nó de trabalho para produzir um RDD final com menos partições.
Repartition
reorganizará os dados em seu RDD para produzir o número final de partições solicitadas. O particionamento dos DataFrames parece um detalhe de implementação de baixo nível que deve ser gerenciado pela estrutura, mas não é. Ao filtrar DataFrames grandes em outros menores, você quase sempre deve reparticionar os dados. Você provavelmente estará filtrando DataFrames grandes em outros menores com frequência, para se acostumar ao reparticionamento.Leia esta postagem no blog se desejar obter mais detalhes.
fonte