Il y a un SparkSQL qui va rejoindre 4 grandes tables (50 millions pour la première table 3 et 200 millions pour la dernière table) et faire un groupe par opération qui consomme 60 jours de Les données. et ce SQL prendra 2 heures à courir, au cours de laquelle, j'ai vérifié que Shuffle Write
augmente considérablement, ce qui pourrait aller jusqu'à plus de 200GB. Par contre, lorsque je diminue la plage de consommation de 60 jours à 45 jours, il ne faut que 6,3 min pour fonctionner. J'ai vérifié sur le graphique DAG, pour 45 jours de données, il sort 1 milliard de données après le dernier sortMergeJoin.Optimisation lorsque l'écriture aléatoire est grande et la tâche d'étincelle devient super lente
Quelqu'un pourrait-il me donner une idée de la direction dans laquelle je pourrais optimiser ce scénario? Merci!
P.S.
Relatifs possible:
- Spark.version = 2.1.0
- spark.executor.instances = 20
- spark.executor.memory = 6g
- spark.yarn.executor .memoryOverhead = 5g
hey man, merci pour la réponse détaillée. En fait, il y a une partition dans toutes les 3 premières tables (50 millions en taille pour les partitions de 60 jours) et pas de support de partition pour la dernière table (200 millions en taille pour 60 jours). et il y a de petites tables, que j'ai pu voir à partir du graphe DAG, qu'elles sont 'BroadCastJoin' comme prévu. Cependant, il y a plusieurs (6/7) 'SortMergeJoin' sur ces grandes tables pendant le comuting. C'est le phénomène. D'autres suggestions? – KAs
Quel type de partition utilisez-vous? –
partitionné sur 'day = aaaa-MM-jj', donc je ne récupère que les données des 60 derniers jours, qui sont 50 millions de taille totalement – KAs