Hi Siva,
Take a look at https://issues.apache.org/jira/browse/HIVE-3562. It is in my todo list, but I have not been able to review this. I think, this addresses a very similar problem. If yes, can you also review the above patch ? Thanks, -namit On 11/19/12 3:10 PM, "Sivaramakrishnan Narayanan" <tarb...@gmail.com> wrote: >Hi All, > >I'm a developer at Qubole (http://www.qubole.com) looking at Hadoop and >Hive. In my past life, I was on the optimizer team of Greenplum Parallel >Database. I'm a newbie to the Hive mailing list, so apologies for any >missteps. I've done some searching in the Hive mailing list and JIRA and >have not found any discussions around this topic - please feel free to >redirect me to any old discussions I might've missed. > >A class of queries we're interested in optimizing are top-k queries i.e. >queries of the form: > >(1) SELECT x, y from T order by z limit 10 > >You can imagine similar query with aggregates: > >(2) SELECT x, y, count(*) as c from T group by x, y order by c desc limit >10 > >I'll continue my discussion with example (1) for simplicity. The way such >a query is executed, every mapper sorts all rows from T and writes it to >local files. Reducers (in this example, singular) read these files and >merge them. These rows are fed to the limit operator which stops after 10 >rows. > >The change I'm proposing is a combination of Hive and Hadoop changes >which will greatly improve the performance of such queries: > >Hadoop change: > - New parameter map.sort.limitrecords which determines how many records >each mapper in a job will send to every reducer > - When writing out local files after sorting, map-task stops after >map.sort.limitrecords records for each reducer > - Effectively, each mapper sends out its top-K records > >Hive change: > - Determining when the Top-K optimization is applicable and setting K in >ReduceSinkDesc > - Passing the K value along to MapredWork > - ExecDriver sets map.sort.limitrecords before executing the job >corresponding to the MapredWork > >This change will reduce the amount of I/O that happens on the map-side >(writing only 10 rows per reducer as opposed to entire table) and can >have a big effect on performance. Furthermore, it is possible to make the >sort on the mapper side a top-k sort which can further improve >performance - but the deep pocket is really the I/O savings. In my >experiments, I see a 5x performance improvement for such queries. > >Please let me know if this is of general interest - I'll be happy to >contribute this back to the community. I'll also be mailing the Hadoop >mailing list about this. > >Thanks >Siva