In a hierarchy, you handle different details at different levels. Using hierarchies comes naturally to most people. When people draw a complex object, such as a house, for example, they draw it as a hierarchy. Abstraction is also a mean of reducing complexity by handling different details at different levels. Any time you work with an aggregate entity, you're working with an abstraction.
Abstraction is a more general concept than hierarchy.
It can reduce complexity by spreading details across a loose network of components, for example, rather than among a hierarchy's strictly tiered levels. Programming productivity has advanced largely through increasing the abstractness of program components. Fred Brooks argues that the biggest single productivity gain ever made in software development arose from the move from machine language to higher-level languages. More recently, the advent of visual programming environments has greatly reduced the complexity associated with creating GUI applications. Visual programming environments allow programmers to work at a level of abstraction at which they can forget about many GUI-related housekeeping details and focus on the particulars of the application itself.