All Downloads are FREE. Search and download functionalities are using the official Maven repository.

geotrellis.spark.io.kryo.KryoRegistrator.scala Maven / Gradle / Ivy

Go to download

GeoTrellis is an open source geographic data processing engine for high performance applications.

The newest version!
/*
 * Copyright (c) 2014 DigitalGlobe.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package geotrellis.spark.io.kryo

import org.apache.spark.serializer.{ KryoRegistrator => SparkKryoRegistrator }

import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.serializers._
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output
import de.javakaffee.kryoserializers._

import java.util.{Arrays, Collections, Comparator, TreeMap}

/** Account for a bug in Kryo < 2.22 for serializing TreeMaps */
class XTreeMapSerializer extends MapSerializer {
  override def write (kryo: Kryo, output: Output, map: java.util.Map[_, _]) {
    val treeMap = map.asInstanceOf[TreeMap[_, _]]
    kryo.writeClassAndObject(output, treeMap.comparator())
    super.write(kryo, output, map)
  }

  protected override def create (kryo: Kryo, input: Input, t: Class[java.util.Map[_, _]]): java.util.Map[_, _] = {
    new TreeMap(kryo.readClassAndObject(input).asInstanceOf[Comparator[_]])
  }

  protected override def createCopy (kryo: Kryo, original: java.util.Map[_, _]): java.util.Map[_, _] = {
    new TreeMap(original.asInstanceOf[TreeMap[_, _]].comparator())
  }
}

class KryoRegistrator extends SparkKryoRegistrator {

  override def registerClasses(kryo: Kryo) {
    // TreeMap serializaiton has a bug; we fix it here as we're stuck on low
    // Kryo versions due to Spark. Hack-tastic.
    kryo.register(classOf[TreeMap[_, _]], (new XTreeMapSerializer).asInstanceOf[com.esotericsoftware.kryo.Serializer[TreeMap[_, _]]])

    kryo.register(classOf[(_,_)])
    kryo.register(classOf[::[_]])
    kryo.register(classOf[geotrellis.raster.ByteArrayFiller])

    // CellTypes
    kryo.register(geotrellis.raster.BitCellType.getClass)                     // Bit
    kryo.register(geotrellis.raster.ByteCellType.getClass)                    // Byte
    kryo.register(geotrellis.raster.ByteConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.ByteUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.UByteCellType.getClass)                   // UByte
    kryo.register(geotrellis.raster.UByteConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.UByteUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.ShortCellType.getClass)                   // Short
    kryo.register(geotrellis.raster.ShortConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.ShortUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.UShortCellType.getClass)                  // UShort
    kryo.register(geotrellis.raster.UShortConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.UShortUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.IntCellType.getClass)                     // Int
    kryo.register(geotrellis.raster.IntConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.IntUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.FloatCellType.getClass)                   // Float
    kryo.register(geotrellis.raster.FloatConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.FloatUserDefinedNoDataCellType])
    kryo.register(geotrellis.raster.DoubleCellType.getClass)                  // Double
    kryo.register(geotrellis.raster.DoubleConstantNoDataCellType.getClass)
    kryo.register(classOf[geotrellis.raster.DoubleUserDefinedNoDataCellType])

    // ArrayTiles
    kryo.register(classOf[geotrellis.raster.BitArrayTile])                    // Bit
    kryo.register(classOf[geotrellis.raster.ByteArrayTile])                   // Byte
    kryo.register(classOf[geotrellis.raster.ByteRawArrayTile])
    kryo.register(classOf[geotrellis.raster.ByteConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.ByteUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.UByteArrayTile])                  // UByte
    kryo.register(classOf[geotrellis.raster.UByteRawArrayTile])
    kryo.register(classOf[geotrellis.raster.UByteConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.UByteUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.ShortArrayTile])                  // Short
    kryo.register(classOf[geotrellis.raster.ShortRawArrayTile])
    kryo.register(classOf[geotrellis.raster.ShortConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.ShortUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.UShortArrayTile])                 // UShort
    kryo.register(classOf[geotrellis.raster.UShortRawArrayTile])
    kryo.register(classOf[geotrellis.raster.UShortConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.UShortUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.IntArrayTile])                    // Int
    kryo.register(classOf[geotrellis.raster.IntRawArrayTile])
    kryo.register(classOf[geotrellis.raster.IntConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.IntUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.FloatArrayTile])                  // Float
    kryo.register(classOf[geotrellis.raster.FloatRawArrayTile])
    kryo.register(classOf[geotrellis.raster.FloatConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.FloatUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.DoubleArrayTile])                 // Double
    kryo.register(classOf[geotrellis.raster.DoubleRawArrayTile])
    kryo.register(classOf[geotrellis.raster.DoubleConstantNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.DoubleUserDefinedNoDataArrayTile])
    kryo.register(classOf[geotrellis.raster.Tile])

    kryo.register(classOf[geotrellis.raster.ArrayMultibandTile])
    kryo.register(classOf[Array[geotrellis.raster.Tile]])
    kryo.register(classOf[geotrellis.raster.CompositeTile])
    kryo.register(classOf[geotrellis.raster.ConstantTile])
    kryo.register(classOf[geotrellis.raster.CroppedTile])
    kryo.register(classOf[geotrellis.raster.Raster[_]])
    kryo.register(classOf[geotrellis.raster.RasterExtent])
    kryo.register(classOf[geotrellis.raster.CellGrid])
    kryo.register(classOf[geotrellis.raster.CellSize])
    kryo.register(classOf[geotrellis.raster.GridBounds])
    kryo.register(classOf[geotrellis.raster.GridExtent])

    kryo.register(classOf[geotrellis.spark.SpatialKey])
    kryo.register(classOf[geotrellis.spark.SpaceTimeKey])
    kryo.register(classOf[org.joda.time.DateTime], new jodatime.JodaDateTimeSerializer)
    kryo.register(classOf[org.joda.time.Interval], new jodatime.JodaIntervalSerializer)
    kryo.register(classOf[geotrellis.spark.io.index.rowmajor.RowMajorSpatialKeyIndex])
    kryo.register(classOf[geotrellis.spark.io.index.zcurve.ZSpatialKeyIndex])
    kryo.register(classOf[geotrellis.spark.io.index.zcurve.ZSpaceTimeKeyIndex])
    kryo.register(classOf[geotrellis.spark.io.index.hilbert.HilbertSpatialKeyIndex])
    kryo.register(classOf[geotrellis.spark.io.index.hilbert.HilbertSpaceTimeKeyIndex])
    kryo.register(classOf[geotrellis.vector.ProjectedExtent])
    kryo.register(classOf[geotrellis.vector.Extent])
    kryo.register(classOf[geotrellis.proj4.CRS])

    // UnmodifiableCollectionsSerializer.registerSerializers(kryo)
    kryo.register( Arrays.asList( "" ).getClass, new ArraysAsListSerializer )
    kryo.register( Collections.EMPTY_LIST.getClass, new CollectionsEmptyListSerializer() )
    kryo.register( Collections.EMPTY_MAP.getClass, new CollectionsEmptyMapSerializer() )
    kryo.register( Collections.EMPTY_SET.getClass, new CollectionsEmptySetSerializer() )
    kryo.register( Collections.singletonList( "" ).getClass, new CollectionsSingletonListSerializer )
    kryo.register( Collections.singleton( "" ).getClass, new CollectionsSingletonSetSerializer )
    kryo.register( Collections.singletonMap( "", "" ).getClass, new CollectionsSingletonMapSerializer )
    kryo.register(geotrellis.spark.buffer.BufferTiles.Center.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.Top.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.Bottom.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.Left.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.Right.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.TopLeft.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.TopRight.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.BottomLeft.getClass)
    kryo.register(geotrellis.spark.buffer.BufferTiles.BottomRight.getClass)

    /* Exhaustive Registration */
    kryo.register(classOf[Array[Double]])
    kryo.register(classOf[Array[Float]])
    kryo.register(classOf[Array[Int]])
    kryo.register(classOf[Array[String]])
    kryo.register(classOf[Array[com.vividsolutions.jts.geom.Coordinate]])
    kryo.register(classOf[Array[com.vividsolutions.jts.geom.LinearRing]])
    kryo.register(classOf[Array[com.vividsolutions.jts.geom.Polygon]])
    kryo.register(classOf[Array[geotrellis.spark.io.avro.AvroRecordCodec[Any]]])
    kryo.register(classOf[Array[geotrellis.spark.SpaceTimeKey]])
    kryo.register(classOf[Array[geotrellis.spark.SpatialKey]])
    kryo.register(classOf[Array[geotrellis.vector.Feature[Any,Any]]])
    kryo.register(classOf[Array[geotrellis.vector.MultiPolygon]])
    kryo.register(classOf[Array[geotrellis.vector.Point]])
    kryo.register(classOf[Array[geotrellis.vector.Polygon]])
    kryo.register(classOf[Array[scala.collection.Seq[Any]]])
    kryo.register(classOf[Array[scala.Tuple2[Any, Any]]])
    kryo.register(classOf[Array[scala.Tuple3[Any, Any, Any]]])
    kryo.register(classOf[com.vividsolutions.jts.geom.Coordinate])
    kryo.register(classOf[com.vividsolutions.jts.geom.Envelope])
    kryo.register(classOf[com.vividsolutions.jts.geom.GeometryFactory])
    kryo.register(classOf[com.vividsolutions.jts.geom.impl.CoordinateArraySequence])
    kryo.register(classOf[com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory])
    kryo.register(classOf[com.vividsolutions.jts.geom.LinearRing])
    kryo.register(classOf[com.vividsolutions.jts.geom.MultiPolygon])
    kryo.register(classOf[com.vividsolutions.jts.geom.Point])
    kryo.register(classOf[com.vividsolutions.jts.geom.Polygon])
    kryo.register(classOf[com.vividsolutions.jts.geom.PrecisionModel])
    kryo.register(classOf[com.vividsolutions.jts.geom.PrecisionModel.Type])
    kryo.register(classOf[geotrellis.raster.histogram.FastMapHistogram])
    kryo.register(classOf[geotrellis.raster.histogram.Histogram[Any]])
    kryo.register(classOf[geotrellis.raster.histogram.MutableHistogram[Any]])
    kryo.register(classOf[geotrellis.raster.histogram.StreamingHistogram])
    kryo.register(classOf[geotrellis.raster.histogram.StreamingHistogram.DeltaCompare])
    kryo.register(classOf[geotrellis.raster.histogram.StreamingHistogram.Delta])
    kryo.register(classOf[geotrellis.raster.histogram.StreamingHistogram.Bucket])
    kryo.register(classOf[geotrellis.raster.KernelStamper])
    kryo.register(classOf[geotrellis.raster.summary.polygonal.MeanResult])
    kryo.register(classOf[geotrellis.raster.ProjectedRaster[Any]])
    kryo.register(classOf[geotrellis.raster.TileLayout])
    kryo.register(classOf[geotrellis.spark.TemporalProjectedExtent])
    kryo.register(classOf[geotrellis.spark.buffer.BufferSizes])
    kryo.register(classOf[geotrellis.spark.io.avro.AvroRecordCodec[Any]])
    kryo.register(classOf[geotrellis.spark.io.avro.AvroUnionCodec[Any]])
    kryo.register(classOf[geotrellis.spark.io.avro.codecs.KeyValueRecordCodec[Any,Any]])
    kryo.register(classOf[geotrellis.spark.io.avro.codecs.TupleCodec[Any,Any]])
    kryo.register(classOf[geotrellis.spark.KeyBounds[Any]])
    kryo.register(classOf[geotrellis.vector.Feature[Any,Any]])
    kryo.register(classOf[geotrellis.vector.Geometry])
    kryo.register(classOf[geotrellis.vector.GeometryCollection])
    kryo.register(classOf[geotrellis.vector.Line])
    kryo.register(classOf[geotrellis.vector.MultiGeometry])
    kryo.register(classOf[geotrellis.vector.MultiLine])
    kryo.register(classOf[geotrellis.vector.MultiPoint])
    kryo.register(classOf[geotrellis.vector.MultiPolygon])
    kryo.register(classOf[geotrellis.vector.Point])
    kryo.register(classOf[geotrellis.vector.Polygon])
    kryo.register(classOf[geotrellis.vector.SpatialIndex[Any]])
    kryo.register(classOf[java.lang.Class[Any]])
    kryo.register(classOf[java.util.TreeMap[Any, Any]])
    kryo.register(classOf[java.util.HashMap[Any,Any]])
    kryo.register(classOf[java.util.HashSet[Any]])
    kryo.register(classOf[java.util.LinkedHashMap[Any,Any]])
    kryo.register(classOf[java.util.LinkedHashSet[Any]])
    kryo.register(classOf[org.apache.hadoop.io.BytesWritable])
    kryo.register(classOf[org.apache.hadoop.io.LongWritable])
    kryo.register(classOf[Array[org.apache.hadoop.io.LongWritable]])
    kryo.register(classOf[org.codehaus.jackson.node.BooleanNode])
    kryo.register(classOf[org.codehaus.jackson.node.IntNode])
    kryo.register(classOf[org.osgeo.proj4j.CoordinateReferenceSystem])
    kryo.register(classOf[org.osgeo.proj4j.datum.AxisOrder])
    kryo.register(classOf[org.osgeo.proj4j.datum.AxisOrder.Axis])
    kryo.register(classOf[org.osgeo.proj4j.datum.Datum])
    kryo.register(classOf[org.osgeo.proj4j.datum.Ellipsoid])
    kryo.register(classOf[org.osgeo.proj4j.datum.Grid])
    kryo.register(classOf[org.osgeo.proj4j.datum.Grid.ConversionTable])
    kryo.register(classOf[org.osgeo.proj4j.util.PolarCoordinate])
    kryo.register(classOf[org.osgeo.proj4j.util.FloatPolarCoordinate])
    kryo.register(classOf[org.osgeo.proj4j.util.IntPolarCoordinate])
    kryo.register(classOf[Array[org.osgeo.proj4j.util.FloatPolarCoordinate]])
    kryo.register(classOf[org.osgeo.proj4j.datum.PrimeMeridian])
    kryo.register(classOf[org.osgeo.proj4j.proj.LambertConformalConicProjection])
    kryo.register(classOf[org.osgeo.proj4j.proj.LongLatProjection])
    kryo.register(classOf[org.osgeo.proj4j.proj.TransverseMercatorProjection])
    kryo.register(classOf[org.osgeo.proj4j.proj.MercatorProjection])
    kryo.register(classOf[org.osgeo.proj4j.units.DegreeUnit])
    kryo.register(classOf[org.osgeo.proj4j.units.Unit])
    kryo.register(classOf[scala.collection.mutable.WrappedArray$ofInt])
    kryo.register(classOf[scala.collection.mutable.WrappedArray$ofRef])
    kryo.register(classOf[scala.collection.Seq[Any]])
    kryo.register(classOf[scala.Tuple3[Any, Any, Any]])
    kryo.register(geotrellis.proj4.LatLng.getClass)
    kryo.register(geotrellis.spark.EmptyBounds.getClass)
    kryo.register(scala.collection.immutable.Nil.getClass)
    kryo.register(scala.math.Ordering.Double.getClass)
    kryo.register(scala.math.Ordering.Float.getClass)
    kryo.register(scala.math.Ordering.Int.getClass)
    kryo.register(scala.math.Ordering.Long.getClass)
    kryo.register(scala.None.getClass)

    UnmodifiableCollectionsSerializer.registerSerializers( kryo )
    SynchronizedCollectionsSerializer.registerSerializers( kryo )
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy