Desmistificando o particionamento no Spark



Este blog conta tudo o que você precisa saber sobre particionamento no Spark, tipos de partição e como melhora a velocidade de execução para transformações baseadas em chave.

Contribuição de Prithviraj Bose

Spark's Conjuntos de dados distribuídos resilientes (a abstração de programação) são avaliadas lentamente e as transformações são armazenadas como gráficos acíclicos direcionados (DAG). Portanto, cada ação no RDD fará com que o Spark recompute o DAG. É assim que a resiliência é alcançada no Spark, porque se algum nó de trabalho falhar, o DAG precisará apenas ser recalculado.





Isso é também obrigatório para o cache (persiste com o nível de armazenamento apropriado) o RDD de modo que ações frequentes no RDD não forcem o Spark a recalcular o DAG.Os tópicos abordados neste blog são essencialmente necessários para a certificação Apache Spark e Scala. Os tópicos abordados neste blog são essencialmente necessários para .

def __init __ (self) python

Por que usar um particionador?

Na computação em cluster, o desafio central é minimizar o tráfego da rede. Quando os dados são orientados por valor-chave, o particionamento se torna imperativo porque para transformações subsequentes no RDD, há uma boa quantidade de embaralhamento de dados pela rede. Se chaves semelhantes ou intervalo de chaves são armazenados na mesma partição, o embaralhamento é minimizado e o processamento torna-se substancialmente rápido.



As transformações que exigem embaralhamento de dados entre os nós de trabalho se beneficiam muito do particionamento. Essas transformações são cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combineByKey e olho para cima .

As partições são configuráveis ​​desde que o RDD seja baseado em valor-chave.

Propriedades da partição

  1. As tuplas na mesma partição estão garantidamente na mesma máquina.
  2. Cada nó em um cluster pode conter mais de uma partição.
  3. O número total de partições é configurável, por padrão é definido como o número total de núcleos em todos os nós executores.

Tipos de particionamento no Spark

O Spark oferece suporte a dois tipos de particionamento,

  • Particionamento Hash : Usa Java Object.hashCode método para determinar a partição como partição = key.hashCode ()% numPartitions.

hash-partitioning-demystifying-partitioning-in-spark



  • Particionamento de intervalo : Usa um intervalo para distribuir às respectivas partições as chaves que estão dentro de um intervalo. Este método é adequado onde há uma ordem natural nas chaves e as chaves não são negativas. O fragmento de código abaixo mostra o uso do particionador de intervalo.

Exemplo de Código

Vamos ver um exemplo de como particionar dados entre nós de trabalho. O código Scala completo está disponível Aqui .

Aqui estão alguns dados de teste de 12 coordenadas (como tuplas),

Criar um org.apache.spark.HashPartitioner de tamanho 2, onde as chaves serão particionadas entre essas duas partições com base no código hash das chaves.

Então, podemos inspecionar os pares e fazer várias transformações baseadas em chave, como foldByKey e reduzaByKey.

Resumindo, o particionamento melhora muito a velocidade de execução para transformações baseadas em chave.

Tem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você.

Postagens relacionadas:

Por que você deve aprender o Spark após dominar o Hadoop

Apache Spark Vs Hadoop MapReduce