Entendiendo treeReduce () en Spark

Puede ver la implementación aquí: https://github.com/apache/spark/blob/ffa05c84fe75663fc33f3d954d1cb1e084ab3280/python/pyspark/rdd.py#L804

¿En qué se diferencia de la función de reduce ‘normal’?
¿Qué significa depth = 2 ?

No quiero que la función del reductor pase linealmente en las particiones, sino que primero reduzca cada uno de los pares disponibles, y luego iteraré así hasta que tenga un solo par y lo reduzca a 1, como se muestra en la imagen:

introduzca la descripción de la imagen aquí

¿ treeReduce logra eso?

    La reduce estándar es tomar una versión mapPartitions de la función y usarla para mapPartitions . Después de eso, los resultados se recostackn y reducen localmente en un controlador. Si el número de particiones es grande y / o la función que usa es costosa, se coloca una carga significativa en una sola máquina.

    La primera fase de treeReduce es bastante similar a la anterior, pero después de eso los resultados parciales se combinan en paralelo y solo se realiza la agregación final en el controlador.

    depth es la depth sugerida del árbol y como la profundidad del nodo en el árbol se define como el número de bordes entre la raíz y el nodo, debe proporcionarle un patrón más o menos esperado, aunque parece que una agregación distribuida se puede detener al principio algunos casos.

    Vale la pena tener en cuenta que lo que se obtiene con treeReduce no es un árbol binario. El número de particiones se ajusta en cada nivel y lo más probable es que más de dos particiones se fusionen a la vez.

    En comparación con la reducción estándar, la versión basada en árbol realiza reduceByKey con cada iteración y significa una gran cantidad de datos aleatorizados. Si el número de particiones es relativamente pequeño, será mucho más barato de usar simplemente reduce . Si sospecha que la fase final de la reduce es una versión de tree* cuello de botella tree* podría valer la pena intentarlo.