Valtteri Bottas was second, 19.7 seconds behind, to give Mercedes a sweep of the top two spots as it jostles with Ferrari in the championship points race. Hamilton entered the day trailing in the points race by 25 points to Sebastien Vettel, who finished fourth. He cut the deficit to 141-129.
Red Bull’s Daniel Ricciardo was third for the third straight week, but teammate Max Verstappen lasted just 20 laps despite jumping from fourth to second at the start.
Force India duo Sergio Perez and Esteban Ocon were fifth and sixth.
Native Montrealer Lance Stroll was ninth – a career-best finish for the 18-year-old rookie.
Fernando Alonso was forced to retire having seemingly run out of fuel when 10th in the race – a position which would have been good enough for them to earn their first point of the season.