¿Spark SQL es más rápido que Hive?


La mejor respuesta

En cualquier punto de referencia posible, Spark Sql es «mucho» más rápido que Hive. Aunque Facebook creó Presto, una copia barata del diseño de Spark bajo el capó de la colmena y también hay una versión más nueva de colmena en Tez, cuya desventura con los DAG está bien documentada aquí La Tragedy of Tez , pero en todas las tareas relacionadas con SQL (por ejemplo, Map side sqls => filter, mutación de datos o reduce side Sqls => Sort / aggregate / Window functions), Spark sigue brillando.

Dado que la pregunta no es «por qué», no entraría mucho en esos detalles técnicos. Pero solo para darle una idea, piense en un modelo de procesamiento de datos distribuido en el que cada tarea necesita escribir el conjunto de datos completo (con replicación) que tiene antes de completarse, donde la aplicación no puede medir la utilización de recursos por sí sola y dónde se encuentra la aplicación. la misericordia del administrador del clúster al iniciar la tarea / etapa de ejecución y compararlo con otro modelo de procesamiento de datos distribuido donde las tareas pueden vivir en la memoria la mayor parte del tiempo, donde el motor puede asignar recursos de manera inteligente y donde el marco puede ubicarse en la parte superior de un administrador de clúster y depende del administrador de clúster para nada, aparte de la asignación de contenedores (y un poco de Des / serialización que incluso se puede omitir)

(y para ser breve, no incluso mencione que Spark 1.6 / 2.x está mejorando el juego con la implementación de Tungsten o simd para la optimización de consultas)

¿Qué modelo cree que ganaría la batalla de la latencia?

Respuesta

Comencemos con su consulta : Hive implementa un subconjunto de SQL: el lenguaje Hive ( LanguageManual – Apache Hive – Apache Software Foundation ) que es específico de las capacidades de Hive y Hadoop. La consulta enviada se divide en partes, predicados, que se pueden implementar en operaciones o etapas. SELECT col1 , col2 ,… coln especifica qué columnas de cada fila devuelta se mantendrán y devolverán en el conjunto de soluciones. Del mismo modo, una combinación LEFT o RIGHT se implementaría en un estado específico, probablemente una etapa Map-Reduce (M\_R). Una vez que su consulta se ha separado en las partes que coinciden con operaciones específicas, el Optimizador basado en costos (CBO) utiliza estadísticas recopiladas y almacenadas para tomar decisiones inteligentes sobre cómo se ejecutará cada una de esas etapas. Por ejemplo, una cláusula WHERE puede implementarse como un escaneo de tabla, si no es muy específica (cardinalidad baja) o si una tabla no está particionada, o podría resultar en la eliminación de la partición si la tabla está particionada y la cláusula WHERE especifica columnas de partición con alta especificidad. Si una consulta especifica múltiples combinaciones, cada combinación se implementará como una etapa Map-Reduce. Si una de las tablas de unión es muy pequeña, la CBO puede seleccionar un Map-Join para su ejecución para un mejor rendimiento.

Una vez que la CBO presenta un plan de ejecución, las etapas se programan y ejecutan, normalmente como múltiples etapas de RM. Puede examinar el plan de ejecución que usaría la CBO para ejecutar cualquier consulta determinada ejecutando EXPLAIN en la consulta.

Tenía un cliente en la industria del video que recopilaba estadísticas sobre los hábitos de visualización de sus usuarios. Esas estadísticas se reunieron en una tabla muy grande (cientos de TiB) que el cliente deseaba unir con unas 20 tablas relativamente pequeñas que contenían datos sobre cada video, los actores en el video, la trama de cada video, los datos de producción, etc. Creé vistas que unieron sucesivamente las tablas más pequeñas que finalmente se unieron con la tabla de visualización a una vista de resultados, que luego se escribió en una tabla de salida. Cuando envié una consulta simple para seleccionar de la vista de resultados en la tabla de salida (CREAR TABLA de salida (…) AS SELECT * FROM results\_view) Hive creó una consulta de 25 etapas que materializó todas las vistas intermedias en la vista final que luego se escribió a la tabla de salida. Dado que cada etapa era un trabajo de M-R (para YARN) y el tiempo de configuración para un trabajo de M-R era de aproximadamente 30 segundos para ese clúster, se emplearon entre 12 y 14 minutos en el tiempo de configuración de M-R. La mayoría de las etapas M-R se ejecutaron en 5 segundos, 2/3 de las cuales fueron tiempo de configuración M-R y 1/3 de la ejecución real. La unión final del mapa de las tablas más pequeñas a la tabla de estadísticas del espectador tomó otros 20 minutos. La creación de un grupo de vistas que se unieron sucesivamente en una tabla de resultados me permitió crear una canalización que se ensambló con un montón de consultas relativamente simples, en lugar de intentar crear una consulta masiva que intentaría unir más de 20 tablas en una consulta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *