Flink sql sabe por qué (13): solución al problema de conexión de transmisión
Sin más preámbulos, vayamos directamente al índice y a la conclusión de este artículo. Los amigos pueden leer la conclusión primero y comprender rápidamente qué ayuda esperan los blogueros de este artículo. para llevar a sus amigos:
Este libro continúa el contenido anterior e introduce el problema de usar la unión regular de flink sql cuando el flujo de exposición está asociado con el flujo de clic.
Este artículo presenta cómo utilizar la conexión de intervalo SQL de Flink para resolver estos problemas.
Flink sql sabe por qué (12): ¿Es difícil la conexión de transmisión? ㈠
Mire el caso real en la sección anterior para ver cómo debería verse el valor de salida en el escenario de valor de entrada específico.
Escenario: el flujo de registro de exposición ordinario (show_log) se asocia con el flujo de registro de clics (click_log) a través de log_id y los resultados de la asociación de datos se distribuyen.
Una ola de datos de entrada:
Datos de exposición:
Datos de clic:
Los datos de salida esperados son los siguientes: p>
La solución a la conexión regular de flink sql en la sección anterior es la siguiente:
Como se mencionó anteriormente, si el flujo de la tabla izquierda (show_log) se une al flujo de la tabla derecha (click_log) cuando el Cuando llegan los datos del flujo, no esperará el flujo de la tabla derecha (click_log) La salida directa del flujo de la tabla (show_log, null), pero saldrá (show_log, null) y enviará (show_log, click) cuando llegue el flujo de la tabla derecha posterior. Se copian los datos. Por eso se produce un flujo de retracción que lleva a la repetición de la escritura de Kafka.
A este respecto también hemos propuesto las soluciones correspondientes. Dado que la secuencia izquierda no esperará la secuencia derecha en la unión izquierda, se puede obligar a la secuencia izquierda a esperar la secuencia derecha durante un período de tiempo, pero no puede esperar datos no relacionados con los datos.
¡Dang Dang Dang Dang! ! !
Aparece la unión de intervalo flink sql de este artículo y puede esperar.
Primero, comprendamos brevemente el papel de la unión de intervalos a través de las siguientes oraciones y gráficos (es posible que mi amigo Meng, que está familiarizado con DataStream, lo haya usado) y luego presentemos el principio en detalle.
La unión por intervalos consiste en utilizar los datos de una secuencia para asociar los datos de otra secuencia dentro de un período de tiempo. Si está asociado, los datos asociados se distribuirán; si no hay asociación, se asignarán después del tiempo de espera en función de si se trata de una conexión externa (conexión izquierda, conexión derecha, conexión completa).
& ltfig caption style = " margen: 5px 0px 0px; relleno: 0px contorno: 0px ancho máximo: 100%; tamaño del cuadro: borde - cuadro! importante; desbordamiento - salto de línea: separación de palabras! importante; Alineación de texto: centrado; color: rgb (136, 136, 136); tamaño de fuente: 12px; familia de fuentes: ping fangsc-Light; cómo escribir flink sql intervalo join sql en el caso anterior:
En haga clic en _ log fila _ time-interval ' 10 ' minutos y haga clic en _ log fila _ time+interval ' 10 ' Show_log.row_time. entre minutos representa los datos en la tabla Show_log. Y row_time en la tabla click_log en 10 minutos.
Los resultados de ejecución son los siguientes:
Los anteriores son los resultados correctos que esperamos.
El diagrama del operador de la interfaz de usuario web de Flink es el siguiente:
& ltfig caption style = " margin: 5px 0px 0px; padding: 0px contorno: 0px ancho máximo: 100%; tamaño del cuadro : borde -cuadro importante; desbordamiento: salto de palabra importante; alineación del texto: centro; color: rgb (136, 136, 136); tamaño de fuente: 12px; & lt/fig caption & gt;
Entonces es posible que tengas una pregunta en este momento. Sé que los dos primeros datos del resultado se concatenan en la salida. Entonces, ¿por qué show_log join también genera resultados cuando es más pequeño que click_log? ¿Cuál es el principio?
El blogger te llevará a ver el código fuente específico. Comencemos mirando las conversiones.
& ltfig caption style = " margen: 5px 0px 0px; relleno: 0px contorno: 0px ancho máximo: 100%; tamaño del cuadro: borde - cuadro! importante; desbordamiento - salto de línea: separación de palabras! importante; Alineación de texto: centrado; color: rgb (136, 136, 136); tamaño de fuente: 12px; familia de fuentes: ping fangsc-Light; el operador específico de unión de intervalo de tiempo de evento es org. Apache. Frink. mesa. tiempo de ejecución. operador. participar. KeyedCoprocessOperator con retraso de marca de agua.
La lógica central se concentra en ProcessElement1 y ProcessElement2. En ProcessElement1 y ProcessElement2, org. Apache. Frink. mesa. tiempo de ejecución. operador. participar. intervalo. Las uniones RowTimeInterval se utilizan para manejar una lógica de unión específica. Los métodos importantes de RowTimeIntervalJoin se muestran en la siguiente figura.
TimeIntervalJoin
Déjame explicártelo detalladamente.
Al unirse, la secuencia izquierda y la secuencia derecha se esperarán entre sí dentro del intervalo. Si esperan, los datos se generarán [+(show_log, click_log)]. Si no pueden esperar y el tiempo de la transmisión de la otra parte ha avanzado hasta el punto en que los datos actuales no se pueden agregar a los datos de la transmisión de la otra parte, entonces los datos se generarán directamente [+(show_log, null)], [+(nulo)].
Por ejemplo, en show_log.row_time entre click_log.row_time-interval '10' minutos y click_log.row_time+interval '10' minutos, cuando haga clic en Cuando el tiempo de _ log avanza a 2021-1- 01 11:00:00, el show_log llegará a 20265438+. Entonces este show_log no se puede conectar con los datos en click_log, porque los datos en click_log son 2021-11-01: 50:00 a 2021-165438. Show_log genera directamente [+(show_log, null)].
Tome la conexión de intervalo show_log (tabla izquierda) click_log (tabla derecha) en el caso anterior como ejemplo (ya sea una conexión de intervalo interno, una conexión de intervalo izquierdo, una conexión de intervalo derecho o una conexión de intervalo completo conexión, se seguirá el siguiente proceso):
Lo anterior es solo el proceso de ejecución cuando llegan los datos show_log del flujo izquierdo (es decir, ProcessElement1), y también es un proceso de ejecución completamente similar cuando el click_log del flujo derecho llega (es decir, ProcessElement2).
Mi amigo Meng necesita prestar atención a dos cosas cuando usa la conexión de intervalo:
Presenta principalmente cómo el intervalo de flink sql evita el problema de retracción de la conexión regular de flink y lo explica analizando su implementación Principio de operación. El blogger espera que lo entiendas después de leer este artículo: