Ricevo lo stesso errore di Missing an output location for shuffle quando si uniscono i grandi dataframes in Spark SQL. La raccomandazione è di impostare MEMORY_AND_DISK e/o spark.shuffle.memoryFraction 0. Tuttavia, spark.shuffle.memoryFraction è deprecato in Spark> = 1.6.0 e l'impostazione MEMORY_AND_DISK non dovrebbe essere d'aiuto se non sto memorizzando nella cache nessun RDD o Dataframe, giusto? Inoltre sto ottenendo molti altri log WARN e tentativi di attività che mi portano a pensare che il lavoro non sia stabile.Come unire i grandi dataframes in Spark SQL? (best practice, stabilità, prestazioni)
Pertanto, la mia domanda è:
- Quali sono le best practice per unirsi enormi dataframes a Spark SQL> = 1.6.0?
domande più specifici sono:
- Come sintonizzare numero di esecutori e spark.sql.shuffle.partitions per ottenere una migliore stabilità/prestazioni?
- Come trovare il giusto equilibrio tra il livello di parallelismo (numero di esecutori/core) e il numero di partizioni ? Ho riscontrato che aumentare il numero di esecutori non è sempre la soluzione in quanto può generare timeout di lettura I/O timeout a causa del traffico di rete.
- C'è qualche altro parametro rilevante da regolare per questo scopo?
- La mia comprensione è che l'unione di dati memorizzati come ORC o Parquet offre prestazioni migliori rispetto a testo o Avro per operazioni di join. C'è una differenza significativa tra Parquet e ORC?
- C'è un vantaggio di SQLContext rispetto a HiveContext in merito a stabilità/prestazioni per le operazioni di join?
- C'è una differenza in termini di prestazioni/stabilità quando i dati coinvolti nel join sono in precedenza registerTempTable() o saveAsTable()?
Finora sto utilizzando this is answer e this chapter come punto di partenza. E ci sono altre pagine StackOverflow correlate a questo argomento. Eppure non ho trovato una risposta esauriente a questo tema popolare.
Grazie in anticipo.
Questa risposta raccomanda di impostare spark.sql.shuffle.partitions oltre i 2000 quando ci sono mischiare problemi di memoria, come Spark utilizza una struttura dati diversa per riordino contabilità quando il numero di partizioni è superiore a tale soglia: http://stackoverflow.com/a/36459198/2482894 – leo9r
Impostazione spark.yarn.executor.memoryOverhead = 1024 è consigliato in questa risposta: http://stackoverflow.com/a/33118489/2482894 – leo9r