apache/hadoop · error · IOException

Cannot serialize type {}, we only accept subclass of Writabl

Error message

Cannot serialize type {}, we only accept subclass of Writable

What it means

Error "Cannot serialize type {}, we only accept subclass of Writable" thrown in apache/hadoop.

Source

Thrown at hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/serde/NativeSerialization.java:44

@InterfaceAudience.Private
public class NativeSerialization {

  private final ConcurrentHashMap<String, Class<?>> map =
    new ConcurrentHashMap<String, Class<?>>();

  public boolean accept(Class<?> c) {
    return Writable.class.isAssignableFrom(c);
  }

  @SuppressWarnings("unchecked")
  public INativeSerializer<Writable> getSerializer(Class<?> c) throws IOException {

    if (null == c) {
      return null;
    }
    if (!Writable.class.isAssignableFrom(c)) {
      throw new IOException("Cannot serialize type " + c.getName() +
                            ", we only accept subclass of Writable");
    }
    final String name = c.getName();
    final Class<?> serializer = map.get(name);

    if (null != serializer) {
      try {
        return (INativeSerializer<Writable>) serializer.newInstance();
      } catch (final Exception e) {
        throw new IOException(e);
      }
    }
    return new DefaultSerializer();
  }

  public void register(String klass, Class<?> serializer) throws IOException {
    if (null == klass || null == serializer) {
      throw new IOException("invalid arguments, klass or serializer is null");

View on GitHub (pinned to 2add963021)

Solutions

  1. Use key/value classes that extend org.apache.hadoop.io.Writable for native tasks.
  2. If a custom type is needed, implement Writable (or register a native serializer) instead of a plain Java type.

When it happens

Trigger: Thrown by NativeSerialization.register() when asked to serialize a class that is not a subclass of Writable. Only Writable types can be registered with the nativetask serialization framework; implement Writable or use the Java collector.

Common situations: Job configured with a non-Writable key/value class while mapreduce.map.output.collector.delegator / native task is enabled.


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/abf2a7e04866a09f. Report an issue: GitHub.