I think it makes sense to keep cleanup() has a user-visible function rather than forcing them to rely on finalizers. In general, I suppose cleaning up an RDD means it is no longer valid to use while unpersisting just means it's no longer taking up space in the BlockManager. I can see use cases for either.