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

Tom White commented on MAPREDUCE-1126:
--------------------------------------

Yesterday I spoke to Owen offline about his design for this JIRA. Briefly, it 
works as follows. (I apologize in advance for any errors due to 
misunderstandings on my part! Owen, please correct anything I've got wrong.)

The Serialization classes change as follows. SerializationFactory becomes 
RootSerializationFactory, while Serialization becomes SerializationFactory, and 
Serializer/Deserializer pairs are combined into single Serialization per pair. 
Serialization has the ability to write itself to and read itself from a stream, 
using its own serialization format. There is a subclass of Serialization called 
TypedSerialization, which is subclassed by WritableSerialization. 
AvroGenericSerialization would not be a TypedSerialization. 
RootSerializationFactory can map types into Serializations in the usual manner 
(via io.serializations). Non-typed serializations, such as 
AvroGenericSerialization, would be set explicitly as described below.

Instead of the metadata map, each job context (map input key, map output key, 
etc) has a serialized serialization that is deserialized for the Task (by the 
framework) and used to carry out the serialization for that context. The 
serialized serializations are not stored in the job configuration, but rather 
are stored in a new file in the job directory which has the format {{(context, 
serialization class, serialization bytes)+}}.

In terms of configuration for the user, the API looks like the one described by 
Arun and Chris. That is, {{Job#setSerialization(MapReduceSerializationContext, 
Serialization)}}.

Some comments:
* The changes to the serialization API are not backwards compatible, so a new 
package of serializer types would need creating.
* I'm not sure why we need to serialize serializations. The current patch 
avoids the need for this by using a simple string mechanism for configuration. 
Having an opaque binary format also makes it difficult to retrieve and use the 
serialization from other languages (e.g. C++ or other Pipes languages). The 
current patch is language-neutral in this regard.
* Adding a side file for the context-serializer mapping complicates the 
implementation. It's not clear what container file would be used for the side 
file (Avro container, custom). I understand that putting framework 
configuration in the job configuration may not be desirable, but it has been 
done in the past so I don't know why it is being ruled out here. I would rather 
have a separate effort (and discussion) to create a "private" job configuration 
(not accessible by user code) for such configuration.
* The user API is no shorter than the one in the current patch. Compare:

{code}
Schema keySchema = ...
AvroGenericSerialization serialization = new AvroGenericSerialization();
serialization.setSchema(keySchema);
job.set(MAP_OUTPUT_KEY, serialization);
{code}

with

{code}
Schema keySchema = ...
AvroGenericData.setMapOutputKeySchema(job, keySchema);
{code}

I was hoping it might help reach consensus if we could incorporate some of 
Owen's ideas with the existing patch. However it is not clear to me how to do 
this. In the meantime, I would appreciate it if someone would review the latest 
patch. Thanks!


> shuffle should use serialization to get comparator
> --------------------------------------------------
>
>                 Key: MAPREDUCE-1126
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-1126
>             Project: Hadoop Map/Reduce
>          Issue Type: Improvement
>          Components: task
>            Reporter: Doug Cutting
>            Assignee: Aaron Kimball
>             Fix For: 0.22.0
>
>         Attachments: MAPREDUCE-1126.2.patch, MAPREDUCE-1126.3.patch, 
> MAPREDUCE-1126.4.patch, MAPREDUCE-1126.5.patch, MAPREDUCE-1126.6.patch, 
> MAPREDUCE-1126.patch, MAPREDUCE-1126.patch
>
>
> Currently the key comparator is defined as a Java class.  Instead we should 
> use the Serialization API to create key comparators.  This would permit, 
> e.g., Avro-based comparators to be used, permitting efficient sorting of 
> complex data types without having to write a RawComparator in Java.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to