Mercedes driver Hamilton clocked a 1m13.809s on Pirelli's ultra-soft tyres to finish just 0.198 seconds ahead of championship leader Vettel at the Circuit Gilles Villeneuve in Montreal.
Hamilton's team-mate Valtteri Bottas was third quickest, 0.237s off the pace, with Kimi Raikkonen completing the top four a further two tenths back in the second Ferrari.
Canadian Grand Prix
Mercedes win 'a great blow' to Ferrari - Hamilton
11/06/2017 AT 21:24
The track was very dusty early on, with Raikkonen spinning on the exit of the Turn 7 chicane and Vettel following suit between Turns 1 and 2 but both continued.
Hamilton had a moment at Turn 6, the three-time world champion losing the rear turning in before catching it, while Nico Hulkenberg spun his Renault between Turns 6 and 7.
Following that scare, Hamilton set the early pace ahead of Bottas, with Mercedes beginning its programme on the super-softs and Ferrari focusing on the ultra-softs.
When Mercedes switched to the ultra-softs in the second-half of the session, Bottas and Hamilton traded fastest times.
After the first flurry of laps, it was Bottas who held the edge, the Finn 0.127s faster than his team-mate.
But Hamilton, who was told he could find time through Turns 6/7 and 8/9, hooked together a cleaner lap to sneak ahead by 0.085s.
The lap times continued to tumble as the track cleaned up, with Vettel slotting into second.
Bottas then locked up on the entry to the pits, with Mercedes determining that the front-right was too badly flat-spotted to run anymore and ending his session early.

Lewis Hamilton (Mercedes) - GP of Canada 2017

Image credit: Getty Images

Force India had a strong session, with Sergio Perez fifth and team-mate Esteban Ocon sixth, completing a top six within one second of each other.
Max Verstappen was the leading Red Bull in seventh, 1.052s off the pace.
Felipe Massa, Daniel Ricciardo and Daniil Kvyat rounded out the top 10.
Lance Stroll, driving in front of his home crowd, was 12th, 1.2s slower than Williams team-mate Massa.
It was not until the final third of the session that F1 returnee Fernando Alonso set his first timed lap, but soon after he was told by McLaren to stop and switch the car off immediately.
Alonso came to a halt at the hairpin, launched his headrest from the car and then threw it back into the cockpit.
McLaren later confirmed a loss of hydraulic pressure was the reason behind the stoppage, with the cause still being investigated.
Carlos Sainz Jr's session lasted just a few corners, the Spaniard pulling off track after the hairpin on his installation lap with smoke coming from the back of his Toro Rosso-Renault.
Canadian Grand Prix
Canadian Grand Prix: Alonso angry, Hamilton cruising - and the return of the shoey
11/06/2017 AT 20:31
Canadian Grand Prix
Hamilton wins in Montreal as Vettel finishes fourth after poor start
11/06/2017 AT 19:36