Sahil Takiar created IMPALA-9316:
------------------------------------

             Summary: Consider coalescing S3 scans
                 Key: IMPALA-9316
                 URL: https://issues.apache.org/jira/browse/IMPALA-9316
             Project: IMPALA
          Issue Type: Improvement
          Components: Backend
            Reporter: Sahil Takiar


We should consider coalescing S3 reads. IIUC the current {{DiskIoMgr}} code for 
S3A does not do anything special for scheduling S3 scan ranges. It simply 
round-robin assigns scans to IO threads.

I think there might be a smarter algorithm we could employ when scheduling S3 
reads. A few things to consider:
* With the migration to {{hdfsPreadFully}}, each S3 scan range should 
correspond to a single HTTP GET request (assuming the 8 MB limit is not hit, 
see below)
* {{read_size}} limits the size of a read to 8 MB (I believe if a scan range 
exceeds this limit, the reads are just done on the same IO thread, but 
sequentially - they are broken up into multiple HTTP GET requests)
* S3A has a readahead option that defaults to 64 KB, however, it only applies 
in certain situations
** If {{fs.s3a.experimental.input.fadvise=random}} (which is the recommended 
value when reading Parquet / ORC data), the readahead applies if (1) it won't 
cause the read to go past the end of the file, and (2) the request read length 
is under 64 KB (it reads up to Math.max(requested-read-length, 64 KB)) (so the 
readahead most likely applies for small reads)

Coalescing reads would allow Impala to combine multiple, small HTTP GET 
requests into fewer, larger HTTP GET requests. There may be some data that 
needs to be skipped over, but the cost of reading that extra data might 
outweigh the cost of issuing multiple HTTP requests. Since each HTTP request 
requires a round-trip to S3, issuing a lot of GET requests can be costly, 
especially if each only reads a small amount of data.

Some implementation factors to consider:
* There should probably be a limit on the maximum size of a read request (is 8 
MB the right value for S3?)
* Since S3A uses a default of 64 KB for their readahead, we can probably use a 
similar value
* Should the number of disk IO threads be considered when coalescing reads? 
e.g. by default there are 16 IO threads, if there are 16 small scan ranges, 
does it make more sense to coalesce them into a single large scan range, or 
would we get better throughput by issuing all 16 in parallel



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to