/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.kylin.engine.spark; import java.util.LinkedHashSet; import java.util.Set; import org.apache.spark.serializer.KryoRegistrator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.esotericsoftware.kryo.Kryo; /** * Registor for registering classes and serializers to Kryo */ public class KylinKryoRegistrator implements KryoRegistrator { protected static final Logger logger = LoggerFactory.getLogger(KylinKryoRegistrator.class); @Override public void registerClasses(Kryo kryo) { Set<Class> kyroClasses = new LinkedHashSet(); kyroClasses.add(byte[].class); kyroClasses.add(int[].class); kyroClasses.add(byte[][].class); kyroClasses.add(String[].class); kyroClasses.add(String[][].class); kyroClasses.add(Object[].class); kyroClasses.add(java.math.BigDecimal.class); kyroClasses.add(java.util.ArrayList.class); kyroClasses.add(java.util.LinkedList.class); kyroClasses.add(java.util.HashSet.class); kyroClasses.add(java.util.LinkedHashSet.class); kyroClasses.add(java.util.LinkedHashMap.class); kyroClasses.add(java.util.HashMap.class); kyroClasses.add(java.util.TreeMap.class); kyroClasses.add(java.util.Properties.class); kyroClasses.add(java.math.MathContext.class); kyroClasses.add(java.math.RoundingMode.class); kyroClasses.add(java.util.concurrent.ConcurrentHashMap.class); kyroClasses.add(java.util.Random.class); kyroClasses.add(java.util.concurrent.atomic.AtomicLong.class); kyroClasses.add(org.apache.spark.sql.Row[].class); kyroClasses.add(org.apache.spark.sql.Row.class); kyroClasses.add(org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema.class); kyroClasses.add(org.apache.spark.sql.types.StructType.class); kyroClasses.add(org.apache.spark.sql.types.StructField[].class); kyroClasses.add(org.apache.spark.sql.types.StructField.class); kyroClasses.add(org.apache.spark.sql.types.DateType$.class); kyroClasses.add(org.apache.spark.sql.types.Metadata.class); kyroClasses.add(org.apache.spark.sql.types.StringType$.class); kyroClasses.add(org.apache.spark.sql.execution.columnar.CachedBatch.class); kyroClasses.add(org.apache.spark.sql.types.Decimal.class); kyroClasses.add(scala.math.BigDecimal.class); kyroClasses.add(org.apache.kylin.common.util.SplittedBytes[].class); kyroClasses.add(org.apache.kylin.metadata.model.ColumnDesc[].class); kyroClasses.add(org.apache.kylin.metadata.model.JoinTableDesc[].class); kyroClasses.add(org.apache.kylin.metadata.model.TblColRef[].class); kyroClasses.add(org.apache.kylin.metadata.model.MeasureDesc[].class); kyroClasses.add(org.apache.kylin.metadata.datatype.DataTypeSerializer[].class); kyroClasses.add(org.apache.kylin.measure.MeasureAggregator[].class); kyroClasses.add(org.apache.kylin.cube.model.HBaseColumnFamilyDesc[].class); kyroClasses.add(org.apache.kylin.cube.model.HBaseColumnDesc[].class); kyroClasses.add(org.apache.kylin.cube.model.RowKeyColDesc[].class); kylinClassByReflection1(kyroClasses); kylinClassByReflection2(kyroClasses); kyroClasses.add(com.google.common.hash.Hashing.murmur3_128().getClass()); kyroClasses.add(org.roaringbitmap.buffer.MutableRoaringArray.class); kyroClasses.add(org.roaringbitmap.buffer.MappeableContainer[].class); kyroClasses.add(org.roaringbitmap.buffer.MutableRoaringBitmap.class); kyroClasses.add(org.roaringbitmap.buffer.MappeableArrayContainer.class); kyroClasses.add(com.tdunning.math.stats.AVLTreeDigest.class); kyroClasses.add(com.tdunning.math.stats.Centroid.class); addClassQuitely(kyroClasses, "com.google.common.collect.EmptyImmutableList"); addClassQuitely(kyroClasses, "java.nio.HeapShortBuffer"); addClassQuitely(kyroClasses, "scala.collection.immutable.Map$EmptyMap$"); addClassQuitely(kyroClasses, "org.apache.spark.sql.catalyst.expressions.GenericInternalRow"); addClassQuitely(kyroClasses, "org.apache.spark.unsafe.types.UTF8String"); addClassQuitely(kyroClasses, "com.tdunning.math.stats.AVLGroupTree"); for (Class kyroClass : kyroClasses) { kryo.register(kyroClass); } // TODO: should use JavaSerializer for PercentileCounter after Kryo bug be fixed: https://github.com/EsotericSoftware/kryo/issues/489 // kryo.register(PercentileCounter.class, new JavaSerializer()); } /** * Generated by KyroMappingGenerator, method exceeds 150 lines, splits into two methods * @param kyroClasses */ private void kylinClassByReflection1(Set<Class> kyroClasses) { kyroClasses.add(org.apache.kylin.common.KylinConfig.class); kyroClasses.add(org.apache.kylin.common.KylinConfigBase.class); kyroClasses.add(org.apache.kylin.common.KylinConfigExt.class); kyroClasses.add(org.apache.kylin.common.persistence.RootPersistentEntity.class); kyroClasses.add(org.apache.kylin.common.util.Array.class); kyroClasses.add(org.apache.kylin.common.util.ByteArray.class); kyroClasses.add(org.apache.kylin.common.util.ByteArray.ImmutableByteArray.class); kyroClasses.add(org.apache.kylin.common.util.Dictionary.class); kyroClasses.add(org.apache.kylin.common.util.OrderedProperties.class); kyroClasses.add(org.apache.kylin.common.util.Pair.class); kyroClasses.add(org.apache.kylin.common.util.SplittedBytes.class); kyroClasses.add(org.apache.kylin.cube.CubeInstance.class); kyroClasses.add(org.apache.kylin.cube.CubeSegment.class); kyroClasses.add(org.apache.kylin.cube.common.RowKeySplitter.class); kyroClasses.add(org.apache.kylin.cube.cuboid.Cuboid.class); kyroClasses.add(org.apache.kylin.cube.cuboid.CuboidScheduler.class); kyroClasses.add(org.apache.kylin.cube.gridtable.TrimmedDimensionSerializer.class); kyroClasses.add(org.apache.kylin.cube.kv.AbstractRowKeyEncoder.class); kyroClasses.add(org.apache.kylin.cube.kv.CubeDimEncMap.class); kyroClasses.add(org.apache.kylin.cube.kv.FuzzyKeyEncoder.class); kyroClasses.add(org.apache.kylin.cube.kv.FuzzyMaskEncoder.class); kyroClasses.add(org.apache.kylin.cube.kv.LazyRowKeyEncoder.class); kyroClasses.add(org.apache.kylin.cube.kv.RowKeyColumnIO.class); kyroClasses.add(org.apache.kylin.cube.kv.RowKeyEncoder.class); kyroClasses.add(org.apache.kylin.cube.kv.RowKeyEncoderProvider.class); kyroClasses.add(org.apache.kylin.cube.model.AggregationGroup.class); kyroClasses.add(org.apache.kylin.cube.model.AggregationGroup.HierarchyMask.class); kyroClasses.add(org.apache.kylin.cube.model.CubeDesc.class); kyroClasses.add(org.apache.kylin.cube.model.CubeDesc.DeriveInfo.class); kyroClasses.add(org.apache.kylin.cube.model.CubeDesc.DeriveType.class); kyroClasses.add(org.apache.kylin.cube.model.CubeJoinedFlatTableDesc.class); kyroClasses.add(org.apache.kylin.cube.model.CubeJoinedFlatTableEnrich.class); kyroClasses.add(org.apache.kylin.cube.model.DictionaryDesc.class); kyroClasses.add(org.apache.kylin.cube.model.DimensionDesc.class); kyroClasses.add(org.apache.kylin.cube.model.HBaseColumnDesc.class); kyroClasses.add(org.apache.kylin.cube.model.HBaseColumnFamilyDesc.class); kyroClasses.add(org.apache.kylin.cube.model.HBaseMappingDesc.class); kyroClasses.add(org.apache.kylin.cube.model.HierarchyDesc.class); kyroClasses.add(org.apache.kylin.cube.model.RowKeyColDesc.class); kyroClasses.add(org.apache.kylin.cube.model.RowKeyDesc.class); kyroClasses.add(org.apache.kylin.cube.model.SelectRule.class); kyroClasses.add(org.apache.kylin.cube.model.v1_4_0.CubeDesc.class); kyroClasses.add(org.apache.kylin.dict.AppendTrieDictionary.class); kyroClasses.add(org.apache.kylin.dict.CacheDictionary.class); kyroClasses.add(org.apache.kylin.dict.DateStrDictionary.class); kyroClasses.add(org.apache.kylin.dict.DictionaryInfo.class); kyroClasses.add(org.apache.kylin.dict.NumberDictionary.class); kyroClasses.add(org.apache.kylin.dict.NumberDictionary2.class); kyroClasses.add(org.apache.kylin.dict.Number2BytesConverter.class); kyroClasses.add(org.apache.kylin.dict.StringBytesConverter.class); kyroClasses.add(org.apache.kylin.dict.TimeStrDictionary.class); kyroClasses.add(org.apache.kylin.dict.TrieDictionary.class); kyroClasses.add(org.apache.kylin.dict.TrieDictionaryForest.class); kyroClasses.add(org.apache.kylin.dict.lookup.SnapshotTable.class); kyroClasses.add(org.apache.kylin.dimension.BooleanDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.BooleanDimEnc.BooleanSerializer.class); kyroClasses.add(org.apache.kylin.dimension.DateDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.DictionaryDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.DictionaryDimEnc.DictionarySerializer.class); kyroClasses.add(org.apache.kylin.dimension.FixedLenDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.FixedLenDimEnc.FixedLenSerializer.class); kyroClasses.add(org.apache.kylin.dimension.FixedLenHexDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.FixedLenHexDimEnc.FixedLenSerializer.class); kyroClasses.add(org.apache.kylin.dimension.IntDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.IntDimEnc.IntegerSerializer.class); kyroClasses.add(org.apache.kylin.dimension.IntegerDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.IntegerDimEnc.IntegerSerializer.class); kyroClasses.add(org.apache.kylin.dimension.OneMoreByteVLongDimEnc.class); kyroClasses.add(org.apache.kylin.dimension.OneMoreByteVLongDimEnc.VLongSerializer.class); kyroClasses.add(org.apache.kylin.dimension.TimeDimEnc.class); kyroClasses.add(org.apache.kylin.engine.mr.common.BaseCuboidBuilder.class); kyroClasses.add(org.apache.kylin.engine.mr.common.NDCuboidBuilder.class); kyroClasses.add(org.apache.kylin.engine.spark.SparkCubingByLayer.class); kyroClasses.add(org.apache.kylin.job.JobInstance.class); kyroClasses.add(org.apache.kylin.job.dao.ExecutableOutputPO.class); kyroClasses.add(org.apache.kylin.job.dao.ExecutablePO.class); } /** * Generated by KyroMappingGenerator * @param kyroClasses */ private void kylinClassByReflection2(Set<Class> kyroClasses) { kyroClasses.add(org.apache.kylin.measure.BufferedMeasureCodec.class); kyroClasses.add(org.apache.kylin.measure.MeasureAggregator.class); kyroClasses.add(org.apache.kylin.measure.MeasureAggregators.class); kyroClasses.add(org.apache.kylin.measure.MeasureCodec.class); kyroClasses.add(org.apache.kylin.measure.MeasureIngester.class); kyroClasses.add(org.apache.kylin.measure.MeasureType.class); kyroClasses.add(org.apache.kylin.measure.MeasureTypeFactory.NeedRewriteOnlyMeasureType.class); kyroClasses.add(org.apache.kylin.measure.basic.BasicMeasureType.class); kyroClasses.add(org.apache.kylin.measure.basic.BigDecimalIngester.class); kyroClasses.add(org.apache.kylin.measure.basic.BigDecimalMaxAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.BigDecimalMinAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.BigDecimalSumAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.DoubleIngester.class); kyroClasses.add(org.apache.kylin.measure.basic.DoubleMaxAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.DoubleMinAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.DoubleSumAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.LongIngester.class); kyroClasses.add(org.apache.kylin.measure.basic.LongMaxAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.LongMinAggregator.class); kyroClasses.add(org.apache.kylin.measure.basic.LongSumAggregator.class); kyroClasses.add(org.apache.kylin.measure.bitmap.BitmapAggregator.class); kyroClasses.add(org.apache.kylin.measure.bitmap.BitmapMeasureType.class); kyroClasses.add(org.apache.kylin.measure.bitmap.BitmapSerializer.class); kyroClasses.add(org.apache.kylin.measure.bitmap.RoaringBitmapCounter.class); kyroClasses.add(org.apache.kylin.measure.bitmap.RoaringBitmapCounterFactory.class); kyroClasses.add(org.apache.kylin.measure.dim.DimCountDistinctMeasureType.class); kyroClasses.add(org.apache.kylin.measure.extendedcolumn.ExtendedColumnMeasureType.class); kyroClasses.add(org.apache.kylin.measure.extendedcolumn.ExtendedColumnSerializer.class); kyroClasses.add(org.apache.kylin.measure.hllc.DenseRegister.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLCAggregator.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLCMeasureType.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLCSerializer.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLCounter.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLCounterOld.class); kyroClasses.add(org.apache.kylin.measure.hllc.HLLDistinctCountAggFunc.FixedValueHLLCMockup.class); kyroClasses.add(org.apache.kylin.measure.hllc.HyperLogLogPlusTable.class); kyroClasses.add(org.apache.kylin.measure.hllc.SingleValueRegister.class); kyroClasses.add(org.apache.kylin.measure.hllc.SparseRegister.class); kyroClasses.add(org.apache.kylin.measure.percentile.PercentileAggregator.class); kyroClasses.add(org.apache.kylin.measure.percentile.PercentileCounter.class); kyroClasses.add(org.apache.kylin.measure.percentile.PercentileMeasureType.class); kyroClasses.add(org.apache.kylin.measure.percentile.PercentileSerializer.class); kyroClasses.add(org.apache.kylin.measure.raw.RawAggregator.class); kyroClasses.add(org.apache.kylin.measure.raw.RawMeasureType.class); kyroClasses.add(org.apache.kylin.measure.raw.RawSerializer.class); kyroClasses.add(org.apache.kylin.measure.topn.Counter.class); kyroClasses.add(org.apache.kylin.measure.topn.DoubleDeltaSerializer.class); kyroClasses.add(org.apache.kylin.measure.topn.TopNAggregator.class); kyroClasses.add(org.apache.kylin.measure.topn.TopNCounter.class); kyroClasses.add(org.apache.kylin.measure.topn.TopNCounterSerializer.class); kyroClasses.add(org.apache.kylin.measure.topn.TopNMeasureType.class); kyroClasses.add(org.apache.kylin.metadata.badquery.BadQueryEntry.class); kyroClasses.add(org.apache.kylin.metadata.badquery.BadQueryHistory.class); kyroClasses.add(org.apache.kylin.metadata.datatype.BigDecimalSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.BooleanSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.DataType.class); kyroClasses.add(org.apache.kylin.metadata.datatype.DataTypeSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.DateTimeSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.DoubleMutable.class); kyroClasses.add(org.apache.kylin.metadata.datatype.DoubleSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.Int4Serializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.IntMutable.class); kyroClasses.add(org.apache.kylin.metadata.datatype.Long8Serializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.LongMutable.class); kyroClasses.add(org.apache.kylin.metadata.datatype.LongSerializer.class); kyroClasses.add(org.apache.kylin.metadata.datatype.StringSerializer.class); kyroClasses.add(org.apache.kylin.metadata.model.ColumnDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.DataModelDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.DataModelDesc.RealizationCapacity.class); kyroClasses.add(org.apache.kylin.metadata.model.DataModelDesc.TableKind.class); kyroClasses.add(org.apache.kylin.metadata.model.DatabaseDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.ExternalFilterDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.FunctionDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.JoinDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.JoinTableDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.JoinsTree.class); kyroClasses.add(org.apache.kylin.metadata.model.JoinsTree.Chain.class); kyroClasses.add(org.apache.kylin.metadata.model.MeasureDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.ModelDimensionDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.ParameterDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.PartitionDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.PartitionDesc.PartitionType.class); kyroClasses.add(org.apache.kylin.metadata.model.PartitionDesc.DefaultPartitionConditionBuilder.class); kyroClasses.add(org.apache.kylin.metadata.model.Segments.class); kyroClasses.add(org.apache.kylin.metadata.model.SegmentStatusEnum.class); kyroClasses.add(org.apache.kylin.metadata.model.TableDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.TableExtDesc.class); kyroClasses.add(org.apache.kylin.metadata.model.TableExtDesc.ColumnStats.class); kyroClasses.add(org.apache.kylin.metadata.model.TableRef.class); kyroClasses.add(org.apache.kylin.metadata.model.TblColRef.class); kyroClasses.add(org.apache.kylin.metadata.project.ProjectInstance.class); kyroClasses.add(org.apache.kylin.metadata.project.RealizationEntry.class); kyroClasses.add(org.apache.kylin.metadata.realization.RealizationStatusEnum.class); kyroClasses.add(org.apache.kylin.metadata.streaming.StreamingConfig.class); kyroClasses.add(org.apache.kylin.source.ReadableTable.TableSignature.class); kyroClasses.add(org.apache.kylin.storage.hybrid.HybridInstance.class); } private static void addClassQuitely(Set<Class> kyroClasses, String className) { try { kyroClasses.add(Class.forName(className)); } catch (ClassNotFoundException e) { logger.error("failed to load class", e); } } }