¿Qué miembro elegirá Spark cuando no se cumplan todos los criterios de selección?

Sabemos que en Spark hay tres tipos de uniones -- Broadcast Join, Shuffle Join y Sort-Merge Join:

  • cuando la mesa pequeña se une a la mesa grande, Broadcast Join;
  • cuando una pequeña mesa grande que BroadcastJoinThreshold,use Shuffle Join;
  • cuando la mesa grande se une, y unirse a la llave puede ordenar, Unirse a los miembros de clase;

¿Qué sucede en un caso en el que hay una unión de dos grandes mesas y la tecla de unión no se puede resolver? ¿Qué tipo de conexión Spark elegirá?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarymaestro


3 Respuestas:

  • Spark 3.0 y arriba soporta estos tipos de uniones:

    • Broadcast hash join (BHJ)
    • Shuffle hash
    • Shuffle merge Join (SMJ)
    • Radiodifusión anida de lazo (BNLJ)
    • Producto cartesiano

    Su selección se describe mejor en el código fuente para SparkStrategies.scala:

      /**
       * Select the proper physical plan for join based on join strategy hints, the availability of
       * equi-join keys and the sizes of joining relations. Below are the existing join strategies,
       * their characteristics and their limitations.
       *
       * - Broadcast hash join (BHJ):
       *     Only supported for equi-joins, while the join keys do not need to be sortable.
       *     Supported for all join types except full outer joins.
       *     BHJ usually performs faster than the other join algorithms when the broadcast side is
       *     small. However, broadcasting tables is a network-intensive operation and it could cause
       *     OOM or perform badly in some cases, especially when the build/broadcast side is big.
       *
       * - Shuffle hash join:
       *     Only supported for equi-joins, while the join keys do not need to be sortable.
       *     Supported for all join types except full outer joins.
       *
       * - Shuffle sort merge join (SMJ):
       *     Only supported for equi-joins and the join keys have to be sortable.
       *     Supported for all join types.
       *
       * - Broadcast nested loop join (BNLJ):
       *     Supports both equi-joins and non-equi-joins.
       *     Supports all the join types, but the implementation is optimized for:
       *       1) broadcasting the left side in a right outer join;
       *       2) broadcasting the right side in a left outer, left semi, left anti or existence join;
       *       3) broadcasting either side in an inner-like join.
       *     For other cases, we need to scan the data multiple times, which can be rather slow.
       *
       * - Shuffle-and-replicate nested loop join (a.k.a. cartesian product join):
       *     Supports both equi-joins and non-equi-joins.
       *     Supports only inner like joins.
       */
    object JoinSelection extends Strategy with PredicateHelper { ...
    

    Como se indicó, el resultado de la aplicación de la selección depende no sólo del tamaño de las tablas y la clasificación de las teclas, sino también de un tipo de unión (INNER, LEFT/RIGHT, FULL) y unirse a las condiciones clave (equi- vs non-equi/theta). En general, parece que en su situación estará viendo Shuffle Hash o Broadcast Nested Loop.

    Respondida el Dec 18, 2020 a las 11:31 - por bytebard

    Votos positivos: 0 | Votos negativos: 0

  • En el caso en el que haya una unión de dos grandes mesas y la clave de unión no se pueda resolver, Spark elegirá el Shuffle Join como el tipo de unión por defecto. Esto se debe a que el Shuffle Join es el método estándar cuando no se cumplen los criterios específicos para los otros tipos de uniones (Broadcast Join y Sort-Merge Join) en Spark.

    Respondida el Dec 19, 2020 a las 11:35 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Cuando hay una unión de dos tablas grandes y la clave de unión no se puede ordenar, Spark elegirá Shuffle Join como tipo de unión.

    Shuffle Join es el tipo de unión por defecto en Spark para grandes conjuntos de datos cuando no se cumplen las condiciones para Broadcast Join o Sort-Merge Join. En Shuffle Join, Spark baraja y distribuye los datos de ambas tablas entre los ejecutores y luego los une en cada partición. Este enfoque es más escalable y eficiente que Broadcast Join o Sort-Merge Join para conjuntos de datos grandes y claves de unión no ordenadas.

    Nota:

    Broadcast Join solo es aplicable cuando una de las tablas es lo suficientemente pequeña (por debajo de un umbral configurable) para ser transmitida a todos los ejecutores. Sort-Merge Join solo es aplicable cuando las claves de unión están ordenadas en ambas tablas.

    Respondida el Dec 19, 2020 a las 11:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0