[ 
https://issues.apache.org/jira/browse/MAPREDUCE-3235?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13131934#comment-13131934
 ] 

Todd Lipcon commented on MAPREDUCE-3235:
----------------------------------------

bq. -1 for the second. The key distribution of terasort, which results in 
compare != 0 most of the time, is an anomaly. In my experience, where skews etc 
are almost always a fact of life, more compares return 0 than non-zero.

Definitely worth considering. Like Chris said, this comparison is practically 
free - we don't have to delegate to any "proxy objects" as you put it. The 
proxies have to be 4-byte strings. Since we already do a compare on the 
PARTITION part of the metadata, making that comparison an 8-byte compare 
instead of a 4-byte compare doesn't really cost anything. So, the only real 
cost is the extra accounting overhead in the buffer - 20 bytes per record 
instead of 16. One optimization there would be to pack the PARTITION field more 
tightly - in most MR jobs, we have <256 reducers, so partition could be a 
single byte. Since we know the number of reducers up front, we could easily 
trade-off space between the partition ID and the comparison proxy.

bq. What's the API look like?

Currently I added a marker interface with a single method: getPrefix(byte[] 
dst, int off, int length). If the key type implements this interface, 
getPrefix() is called by collect() to copy the comparison proxy into the kvmeta 
buffer. I was thinking last night that it would be better to delegate to the 
Serializer implementation there, though. I just did the above for expediency 
last night while hacking this together. Alternatively, it might make sense to 
add another interface like how RawComparator is done.

bq. Both of these would be pretty esoteric config knobs

I imagine most of the "stock writables" we have in Hadoop could easily 
implement this - eg Text, BytesWritable, LongWritable, etc. Frameworks like 
Pig/Hive could get it in as well. Application programmers implementing their 
own key types already tend to implement RawComparators, so allowing them to 
implement another simple method for a good CPU boost doesn't seem too bad.
                
> Improve CPU cache behavior in map side sort
> -------------------------------------------
>
>                 Key: MAPREDUCE-3235
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-3235
>             Project: Hadoop Map/Reduce
>          Issue Type: Improvement
>          Components: task
>    Affects Versions: 0.23.0
>            Reporter: Todd Lipcon
>            Assignee: Todd Lipcon
>
> When running oprofile on a terasort workload, I noticed that a large amount 
> of CPU usage was going to MapTask$MapOutputBuffer.compare. Upon disassembling 
> this and looking at cycle counters, most of the cycles were going to memory 
> loads dereferencing into the array of key-value data -- implying expensive 
> cache misses. This can be avoided as follows:
> - rather than simply swapping indexes into the kv array, swap the entire meta 
> entries in the meta array. Swapping 16 bytes is only negligibly slower than 
> swapping 4 bytes. This requires adding the value-length into the meta array, 
> since we used to rely on the previous-in-the-array meta entry to determine 
> this. So we replace INDEX with VALUELEN and avoid one layer of indirection.
> - introduce an interface which allows key types to provide a 4-byte 
> comparison proxy. For string keys, this can simply be the first 4 bytes of 
> the string. The idea is that, if stringCompare(key1.proxy(), key2.proxy()) != 
> 0, then compare(key1, key2) should have the same result. If the proxies are 
> equal, the normal comparison method is used. We then include the 4-byte proxy 
> as part of the metadata entry, so that for many cases the indirection into 
> the data buffer can be avoided.
> On a terasort benchmark, these optimizations plus an optimization to 
> WritableComparator.compareBytes dropped the aggregate mapside CPU millis by 
> 40%, and the compare() routine mostly dropped off the oprofile results.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to