Se necesita mucho tiempo para que Spark SQL acceda a las tablas particionadas de Hive antes del inicio de Job
Síntoma
Cuando se utiliza Spark SQL para acceder a tablas particionadas de Hive almacenadas en OBS, la velocidad de acceso es lenta y se invoca a un gran número de API de consulta de OBS.
Ejemplo de SQL:
select a,b,c from test where b=xxx
Localización de fallas
De acuerdo con la configuración, la tarea debe analizar solo la partición cuya b sea xxx. Sin embargo, los registros de tareas muestran que la tarea analiza todas las particiones y luego calcula los datos cuya b es xxx. Como resultado, el cálculo de la tarea es lento. Además, se envía un gran número de solicitudes OBS porque todos los archivos necesitan ser analizados.
De forma predeterminada, la optimización del plan de ejecución basada en estadísticas de partición está habilitada en MRS, lo que equivale a la ejecución automática de Analyze Table. (El método de configuración predeterminado es establecer spark.sql.statistics.fallBackToHdfs en true. Puede establecer este parámetro en false.) Después de activar esta función, las estadísticas de partición de tabla se analizan durante la ejecución SQL y se utilizan como estimación de costos en el plan de ejecución. Por ejemplo, las pequeñas tablas identificadas durante la evaluación de costes se difunden a cada nodo en la memoria para operaciones de unión, reduciendo significativamente el tiempo de mezclado. Esta función optimiza enormemente el rendimiento en escenarios de unión, pero aumenta el número de invocaciones de OBS.
Procedimiento
Establezca el siguiente parámetro en Spark SQL y, a continuación, ejecute la sentencia SQL:
set spark.sql.statistics.fallBackToHdfs=false;
Alternativamente, ejecute el comando --conf para establecer este parámetro en false antes del inicio.
--conf spark.sql.statistics.fallBackToHdfs=false