Asynchronous I/O and physical I/O scheduler are very important for some storage like S3.
Currently, we have some simple I/O scheduling strategies in PixelsRecordReaderImpl.read(), like sorting I/O requests by their starting offsets and grouping adjacent I/O requests. However, we need to make this a generic interface and implement plugable I/O schedulers for different types of storage.
In this issue, we are going to implement the asynchronous I/O framework and the I/O scheduling framework. They will work together to affect the physical I/O pattern. Specific scheduling strategies are left for the next Issues.