You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/05/23 04:13:42 UTC

kylin git commit: KYLIN-1725 Use KylinConfig inside coprocessor

Repository: kylin
Updated Branches:
  refs/heads/KYLIN-1725 [created] 56af0f418


KYLIN-1725 Use KylinConfig inside coprocessor


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/56af0f41
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/56af0f41
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/56af0f41

Branch: refs/heads/KYLIN-1725
Commit: 56af0f4181bb0cca621fd425a8eba6f65d9c6c41
Parents: 422b362
Author: lidongsjtu <li...@apache.org>
Authored: Mon May 23 12:13:04 2016 +0800
Committer: lidongsjtu <li...@apache.org>
Committed: Mon May 23 12:13:04 2016 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/common/KylinConfig.java    |   4 +-
 .../kylin/measure/MeasureTypeFactory.java       |  31 +-
 .../hbase/cube/v2/CubeHBaseEndpointRPC.java     |   3 +-
 .../coprocessor/endpoint/CubeVisitService.java  |  20 +-
 .../endpoint/generated/CubeVisitProtos.java     | 423 ++++++-------------
 .../endpoint/protobuf/CubeVisit.proto           |   3 +-
 6 files changed, 153 insertions(+), 331 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
index 722c6ce..7099c3f 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
@@ -243,8 +243,8 @@ public class KylinConfig extends KylinConfigBase {
     }
     
     public static void setSandboxEnvIfPossible() {
-        File dir1 = new File("../../kylin/examples/test_case_data/sandbox");
-        File dir2 = new File("../examples/test_case_data/sandbox");
+        File dir1 = new File("../examples/test_case_data/sandbox");
+        File dir2 = new File("../../kylin/examples/test_case_data/sandbox");
         
         if (dir1.exists()) {
             logger.info("Setting sandbox env, KYLIN_CONF=" + dir1.getAbsolutePath());

http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/core-metadata/src/main/java/org/apache/kylin/measure/MeasureTypeFactory.java
----------------------------------------------------------------------
diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureTypeFactory.java b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureTypeFactory.java
index b07490a..d7a9305 100644
--- a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureTypeFactory.java
+++ b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureTypeFactory.java
@@ -18,7 +18,6 @@
 
 package org.apache.kylin.measure;
 
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -85,33 +84,15 @@ abstract public class MeasureTypeFactory<T> {
     private static Map<String, List<MeasureTypeFactory<?>>> factories = Maps.newHashMap();
     private static List<MeasureTypeFactory<?>> defaultFactory = Lists.newArrayListWithCapacity(2);
 
-    public static String[] customFactories = null;
-
     static {
         init();
     }
 
-    public static void forceInit() {
-        factories.clear();
-        defaultFactory.clear();
-
-        init();
-    }
-
     public static synchronized void init() {
         if (!factories.isEmpty()) {
             return;
         }
 
-        if (customFactories == null) {
-            try {
-                Collection<String> customMeasureTypeFactories = KylinConfig.getInstanceFromEnv().getCubeCustomMeasureTypes().values();
-                customFactories = customMeasureTypeFactories.toArray(new String[customMeasureTypeFactories.size()]);
-            } catch (Exception e) {
-                customFactories = null;
-            }
-        }
-
         List<MeasureTypeFactory<?>> factoryInsts = Lists.newArrayList();
 
         // five built-in advanced measure types
@@ -121,13 +102,11 @@ abstract public class MeasureTypeFactory<T> {
         factoryInsts.add(new RawMeasureType.Factory());
         factoryInsts.add(new ExtendedColumnMeasureType.Factory());
 
-        if (customFactories != null) {
-            for (String customFactory : customFactories) {
-                try {
-                    factoryInsts.add((MeasureTypeFactory<?>) Class.forName(customFactory).newInstance());
-                } catch (Exception e) {
-                    throw new IllegalArgumentException("Unrecognized MeasureTypeFactory classname: " + customFactory, e);
-                }
+        for (String customFactory : KylinConfig.getInstanceFromEnv().getCubeCustomMeasureTypes().values()) {
+            try {
+                factoryInsts.add((MeasureTypeFactory<?>) Class.forName(customFactory).newInstance());
+            } catch (Exception e) {
+                throw new IllegalArgumentException("Unrecognized MeasureTypeFactory classname: " + customFactory, e);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
index 6d2254b..f071a1b 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
@@ -331,8 +331,7 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
         builder.setBehavior(toggle);
         builder.setStartTime(System.currentTimeMillis());
         builder.setTimeout(epResultItr.getTimeout());
-        builder.setUseCompression(compressionResult);
-        builder.addAllCustomMeasureTypeFactories(KylinConfig.getInstanceFromEnv().getCubeCustomMeasureTypes().values());
+        builder.setKylinProperties(KylinConfig.getInstanceFromEnv().getConfigAsString());
 
         for (final Pair<byte[], byte[]> epRange : getEPKeyRanges(cuboidBaseShard, shardNum, totalShards)) {
             executorService.submit(new Runnable() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
index 156d56b..8c93144 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
@@ -19,14 +19,17 @@
 package org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.mutable.MutableBoolean;
@@ -40,6 +43,7 @@ import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
 import org.apache.hadoop.hbase.protobuf.ResponseConverter;
 import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.regionserver.RegionScanner;
+import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.util.Bytes;
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.common.util.CompressionUtils;
@@ -50,7 +54,6 @@ import org.apache.kylin.gridtable.GTScanRequest;
 import org.apache.kylin.gridtable.IGTScanner;
 import org.apache.kylin.gridtable.IGTStore;
 import org.apache.kylin.measure.BufferedMeasureEncoder;
-import org.apache.kylin.measure.MeasureTypeFactory;
 import org.apache.kylin.metadata.filter.UDF.MassInTupleFilter;
 import org.apache.kylin.metadata.model.TblColRef;
 import org.apache.kylin.metadata.realization.IRealizationConstants;
@@ -67,6 +70,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
+import com.google.common.io.Files;
 import com.google.protobuf.HBaseZeroCopyByteString;
 import com.google.protobuf.RpcCallback;
 import com.google.protobuf.RpcController;
@@ -164,14 +168,15 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
         sb.append(",");
     }
 
-    private void initCustomArtifacts(CubeVisitProtos.CubeVisitRequest request) {
-        MeasureTypeFactory.customFactories = request.getCustomMeasureTypeFactoriesList().toArray(new String[request.getCustomMeasureTypeFactoriesCount()]);
-        MeasureTypeFactory.forceInit();
+    private void setupKylinProperties(String propFileStr) throws IOException {
+        File kylinConfDir = Files.createTempDir();
+        Files.write(propFileStr, new File(kylinConfDir, KylinConfig.KYLIN_CONF_PROPERTIES_FILE), Charset.defaultCharset());
+        System.setProperty(KylinConfig.KYLIN_CONF, kylinConfDir.getAbsolutePath());
+        FileUtils.forceDeleteOnExit(kylinConfDir);
     }
 
     @Override
     public void visitCube(final RpcController controller, CubeVisitProtos.CubeVisitRequest request, RpcCallback<CubeVisitProtos.CubeVisitResponse> done) {
-
         List<RegionScanner> regionScanners = Lists.newArrayList();
         HRegion region = null;
 
@@ -182,7 +187,8 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
         try {
             this.serviceStartTime = System.currentTimeMillis();
 
-            initCustomArtifacts(request);
+            setupKylinProperties(request.getKylinProperties());
+            KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
 
             region = env.getRegion();
             region.startRegionOperation();
@@ -329,7 +335,7 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
             } else {
                 allRows = new byte[0];
             }
-            if (request.hasUseCompression() && request.getUseCompression() == false) {
+            if (!kylinConfig.getCompressionResult()) {
                 compressedAllRows = allRows;
             } else {
                 compressedAllRows = CompressionUtils.compress(allRows);

http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
index 9c06fb2..8226a75 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
@@ -117,59 +117,32 @@ public final class CubeVisitProtos {
      */
     long getTimeout();
 
-    // optional bool useCompression = 8;
+    // required string kylinProperties = 8;
     /**
-     * <code>optional bool useCompression = 8;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * compress result or not
+     * kylin properties
      * </pre>
      */
-    boolean hasUseCompression();
+    boolean hasKylinProperties();
     /**
-     * <code>optional bool useCompression = 8;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * compress result or not
+     * kylin properties
      * </pre>
      */
-    boolean getUseCompression();
-
-    // repeated string customMeasureTypeFactories = 9;
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
-     *
-     * <pre>
-     * customization
-     * </pre>
-     */
-    java.util.List<java.lang.String>
-    getCustomMeasureTypeFactoriesList();
+    java.lang.String getKylinProperties();
     /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * customization
-     * </pre>
-     */
-    int getCustomMeasureTypeFactoriesCount();
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
-     *
-     * <pre>
-     * customization
-     * </pre>
-     */
-    java.lang.String getCustomMeasureTypeFactories(int index);
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
-     *
-     * <pre>
-     * customization
+     * kylin properties
      * </pre>
      */
     com.google.protobuf.ByteString
-        getCustomMeasureTypeFactoriesBytes(int index);
+        getKylinPropertiesBytes();
   }
   /**
    * Protobuf type {@code CubeVisitRequest}
@@ -260,17 +233,9 @@ public final class CubeVisitProtos {
               timeout_ = input.readInt64();
               break;
             }
-            case 64: {
+            case 66: {
               bitField0_ |= 0x00000040;
-              useCompression_ = input.readBool();
-              break;
-            }
-            case 74: {
-              if (!((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-                customMeasureTypeFactories_ = new com.google.protobuf.LazyStringArrayList();
-                mutable_bitField0_ |= 0x00000100;
-              }
-              customMeasureTypeFactories_.add(input.readBytes());
+              kylinProperties_ = input.readBytes();
               break;
             }
           }
@@ -284,9 +249,6 @@ public final class CubeVisitProtos {
         if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
           hbaseColumnsToGT_ = java.util.Collections.unmodifiableList(hbaseColumnsToGT_);
         }
-        if (((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-          customMeasureTypeFactories_ = new com.google.protobuf.UnmodifiableLazyStringList(customMeasureTypeFactories_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -998,74 +960,59 @@ public final class CubeVisitProtos {
       return timeout_;
     }
 
-    // optional bool useCompression = 8;
-    public static final int USECOMPRESSION_FIELD_NUMBER = 8;
-    private boolean useCompression_;
+    // required string kylinProperties = 8;
+    public static final int KYLINPROPERTIES_FIELD_NUMBER = 8;
+    private java.lang.Object kylinProperties_;
     /**
-     * <code>optional bool useCompression = 8;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * compress result or not
+     * kylin properties
      * </pre>
      */
-    public boolean hasUseCompression() {
+    public boolean hasKylinProperties() {
       return ((bitField0_ & 0x00000040) == 0x00000040);
     }
     /**
-     * <code>optional bool useCompression = 8;</code>
-     *
-     * <pre>
-     * compress result or not
-     * </pre>
-     */
-    public boolean getUseCompression() {
-      return useCompression_;
-    }
-
-    // repeated string customMeasureTypeFactories = 9;
-    public static final int CUSTOMMEASURETYPEFACTORIES_FIELD_NUMBER = 9;
-    private com.google.protobuf.LazyStringList customMeasureTypeFactories_;
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
-     *
-     * <pre>
-     * customization
-     * </pre>
-     */
-    public java.util.List<java.lang.String>
-        getCustomMeasureTypeFactoriesList() {
-      return customMeasureTypeFactories_;
-    }
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
-     *
-     * <pre>
-     * customization
-     * </pre>
-     */
-    public int getCustomMeasureTypeFactoriesCount() {
-      return customMeasureTypeFactories_.size();
-    }
-    /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * customization
+     * kylin properties
      * </pre>
      */
-    public java.lang.String getCustomMeasureTypeFactories(int index) {
-      return customMeasureTypeFactories_.get(index);
+    public java.lang.String getKylinProperties() {
+      java.lang.Object ref = kylinProperties_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          kylinProperties_ = s;
+        }
+        return s;
+      }
     }
     /**
-     * <code>repeated string customMeasureTypeFactories = 9;</code>
+     * <code>required string kylinProperties = 8;</code>
      *
      * <pre>
-     * customization
+     * kylin properties
      * </pre>
      */
     public com.google.protobuf.ByteString
-        getCustomMeasureTypeFactoriesBytes(int index) {
-      return customMeasureTypeFactories_.getByteString(index);
+        getKylinPropertiesBytes() {
+      java.lang.Object ref = kylinProperties_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        kylinProperties_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
     private void initFields() {
@@ -1076,8 +1023,7 @@ public final class CubeVisitProtos {
       hbaseColumnsToGT_ = java.util.Collections.emptyList();
       startTime_ = 0L;
       timeout_ = 0L;
-      useCompression_ = false;
-      customMeasureTypeFactories_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      kylinProperties_ = "";
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -1108,6 +1054,10 @@ public final class CubeVisitProtos {
         memoizedIsInitialized = 0;
         return false;
       }
+      if (!hasKylinProperties()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
       memoizedIsInitialized = 1;
       return true;
     }
@@ -1137,10 +1087,7 @@ public final class CubeVisitProtos {
         output.writeInt64(7, timeout_);
       }
       if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBool(8, useCompression_);
-      }
-      for (int i = 0; i < customMeasureTypeFactories_.size(); i++) {
-        output.writeBytes(9, customMeasureTypeFactories_.getByteString(i));
+        output.writeBytes(8, getKylinPropertiesBytes());
       }
       getUnknownFields().writeTo(output);
     }
@@ -1181,16 +1128,7 @@ public final class CubeVisitProtos {
       }
       if (((bitField0_ & 0x00000040) == 0x00000040)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBoolSize(8, useCompression_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < customMeasureTypeFactories_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(customMeasureTypeFactories_.getByteString(i));
-        }
-        size += dataSize;
-        size += 1 * getCustomMeasureTypeFactoriesList().size();
+          .computeBytesSize(8, getKylinPropertiesBytes());
       }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
@@ -1247,13 +1185,11 @@ public final class CubeVisitProtos {
         result = result && (getTimeout()
             == other.getTimeout());
       }
-      result = result && (hasUseCompression() == other.hasUseCompression());
-      if (hasUseCompression()) {
-        result = result && (getUseCompression()
-            == other.getUseCompression());
+      result = result && (hasKylinProperties() == other.hasKylinProperties());
+      if (hasKylinProperties()) {
+        result = result && getKylinProperties()
+            .equals(other.getKylinProperties());
       }
-      result = result && getCustomMeasureTypeFactoriesList()
-          .equals(other.getCustomMeasureTypeFactoriesList());
       result = result &&
           getUnknownFields().equals(other.getUnknownFields());
       return result;
@@ -1295,13 +1231,9 @@ public final class CubeVisitProtos {
         hash = (37 * hash) + TIMEOUT_FIELD_NUMBER;
         hash = (53 * hash) + hashLong(getTimeout());
       }
-      if (hasUseCompression()) {
-        hash = (37 * hash) + USECOMPRESSION_FIELD_NUMBER;
-        hash = (53 * hash) + hashBoolean(getUseCompression());
-      }
-      if (getCustomMeasureTypeFactoriesCount() > 0) {
-        hash = (37 * hash) + CUSTOMMEASURETYPEFACTORIES_FIELD_NUMBER;
-        hash = (53 * hash) + getCustomMeasureTypeFactoriesList().hashCode();
+      if (hasKylinProperties()) {
+        hash = (37 * hash) + KYLINPROPERTIES_FIELD_NUMBER;
+        hash = (53 * hash) + getKylinProperties().hashCode();
       }
       hash = (29 * hash) + getUnknownFields().hashCode();
       memoizedHashCode = hash;
@@ -1431,10 +1363,8 @@ public final class CubeVisitProtos {
         bitField0_ = (bitField0_ & ~0x00000020);
         timeout_ = 0L;
         bitField0_ = (bitField0_ & ~0x00000040);
-        useCompression_ = false;
+        kylinProperties_ = "";
         bitField0_ = (bitField0_ & ~0x00000080);
-        customMeasureTypeFactories_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
         return this;
       }
 
@@ -1499,13 +1429,7 @@ public final class CubeVisitProtos {
         if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
           to_bitField0_ |= 0x00000040;
         }
-        result.useCompression_ = useCompression_;
-        if (((bitField0_ & 0x00000100) == 0x00000100)) {
-          customMeasureTypeFactories_ = new com.google.protobuf.UnmodifiableLazyStringList(
-              customMeasureTypeFactories_);
-          bitField0_ = (bitField0_ & ~0x00000100);
-        }
-        result.customMeasureTypeFactories_ = customMeasureTypeFactories_;
+        result.kylinProperties_ = kylinProperties_;
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -1568,17 +1492,9 @@ public final class CubeVisitProtos {
         if (other.hasTimeout()) {
           setTimeout(other.getTimeout());
         }
-        if (other.hasUseCompression()) {
-          setUseCompression(other.getUseCompression());
-        }
-        if (!other.customMeasureTypeFactories_.isEmpty()) {
-          if (customMeasureTypeFactories_.isEmpty()) {
-            customMeasureTypeFactories_ = other.customMeasureTypeFactories_;
-            bitField0_ = (bitField0_ & ~0x00000100);
-          } else {
-            ensureCustomMeasureTypeFactoriesIsMutable();
-            customMeasureTypeFactories_.addAll(other.customMeasureTypeFactories_);
-          }
+        if (other.hasKylinProperties()) {
+          bitField0_ |= 0x00000080;
+          kylinProperties_ = other.kylinProperties_;
           onChanged();
         }
         this.mergeUnknownFields(other.getUnknownFields());
@@ -1610,6 +1526,10 @@ public final class CubeVisitProtos {
           
           return false;
         }
+        if (!hasKylinProperties()) {
+          
+          return false;
+        }
         return true;
       }
 
@@ -2149,180 +2069,100 @@ public final class CubeVisitProtos {
         return this;
       }
 
-      // optional bool useCompression = 8;
-      private boolean useCompression_ ;
+      // required string kylinProperties = 8;
+      private java.lang.Object kylinProperties_ = "";
       /**
-       * <code>optional bool useCompression = 8;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * compress result or not
+       * kylin properties
        * </pre>
        */
-      public boolean hasUseCompression() {
+      public boolean hasKylinProperties() {
         return ((bitField0_ & 0x00000080) == 0x00000080);
       }
       /**
-       * <code>optional bool useCompression = 8;</code>
-       *
-       * <pre>
-       * compress result or not
-       * </pre>
-       */
-      public boolean getUseCompression() {
-        return useCompression_;
-      }
-      /**
-       * <code>optional bool useCompression = 8;</code>
-       *
-       * <pre>
-       * compress result or not
-       * </pre>
-       */
-      public Builder setUseCompression(boolean value) {
-        bitField0_ |= 0x00000080;
-        useCompression_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bool useCompression = 8;</code>
-       *
-       * <pre>
-       * compress result or not
-       * </pre>
-       */
-      public Builder clearUseCompression() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        useCompression_ = false;
-        onChanged();
-        return this;
-      }
-
-      // repeated string customMeasureTypeFactories = 9;
-      private com.google.protobuf.LazyStringList customMeasureTypeFactories_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      private void ensureCustomMeasureTypeFactoriesIsMutable() {
-        if (!((bitField0_ & 0x00000100) == 0x00000100)) {
-          customMeasureTypeFactories_ = new com.google.protobuf.LazyStringArrayList(customMeasureTypeFactories_);
-          bitField0_ |= 0x00000100;
-         }
-      }
-      /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
-       *
-       * <pre>
-       * customization
-       * </pre>
-       */
-      public java.util.List<java.lang.String>
-          getCustomMeasureTypeFactoriesList() {
-        return java.util.Collections.unmodifiableList(customMeasureTypeFactories_);
-      }
-      /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
-       *
-       * <pre>
-       * customization
-       * </pre>
-       */
-      public int getCustomMeasureTypeFactoriesCount() {
-        return customMeasureTypeFactories_.size();
-      }
-      /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * customization
+       * kylin properties
        * </pre>
        */
-      public java.lang.String getCustomMeasureTypeFactories(int index) {
-        return customMeasureTypeFactories_.get(index);
+      public java.lang.String getKylinProperties() {
+        java.lang.Object ref = kylinProperties_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          kylinProperties_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
       }
       /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * customization
+       * kylin properties
        * </pre>
        */
       public com.google.protobuf.ByteString
-          getCustomMeasureTypeFactoriesBytes(int index) {
-        return customMeasureTypeFactories_.getByteString(index);
-      }
-      /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
-       *
-       * <pre>
-       * customization
-       * </pre>
-       */
-      public Builder setCustomMeasureTypeFactories(
-          int index, java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureCustomMeasureTypeFactoriesIsMutable();
-        customMeasureTypeFactories_.set(index, value);
-        onChanged();
-        return this;
+          getKylinPropertiesBytes() {
+        java.lang.Object ref = kylinProperties_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          kylinProperties_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
       }
       /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * customization
+       * kylin properties
        * </pre>
        */
-      public Builder addCustomMeasureTypeFactories(
+      public Builder setKylinProperties(
           java.lang.String value) {
         if (value == null) {
     throw new NullPointerException();
   }
-  ensureCustomMeasureTypeFactoriesIsMutable();
-        customMeasureTypeFactories_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
-       *
-       * <pre>
-       * customization
-       * </pre>
-       */
-      public Builder addAllCustomMeasureTypeFactories(
-          java.lang.Iterable<java.lang.String> values) {
-        ensureCustomMeasureTypeFactoriesIsMutable();
-        super.addAll(values, customMeasureTypeFactories_);
+  bitField0_ |= 0x00000080;
+        kylinProperties_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * customization
+       * kylin properties
        * </pre>
        */
-      public Builder clearCustomMeasureTypeFactories() {
-        customMeasureTypeFactories_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
+      public Builder clearKylinProperties() {
+        bitField0_ = (bitField0_ & ~0x00000080);
+        kylinProperties_ = getDefaultInstance().getKylinProperties();
         onChanged();
         return this;
       }
       /**
-       * <code>repeated string customMeasureTypeFactories = 9;</code>
+       * <code>required string kylinProperties = 8;</code>
        *
        * <pre>
-       * customization
+       * kylin properties
        * </pre>
        */
-      public Builder addCustomMeasureTypeFactoriesBytes(
+      public Builder setKylinPropertiesBytes(
           com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
-  ensureCustomMeasureTypeFactoriesIsMutable();
-        customMeasureTypeFactories_.add(value);
+  bitField0_ |= 0x00000080;
+        kylinProperties_ = value;
         onChanged();
         return this;
       }
@@ -4681,27 +4521,26 @@ public final class CubeVisitProtos {
     java.lang.String[] descriptorData = {
       "\npstorage-hbase/src/main/java/org/apache" +
       "/kylin/storage/hbase/cube/v2/coprocessor" +
-      "/endpoint/protobuf/CubeVisit.proto\"\233\002\n\020C" +
+      "/endpoint/protobuf/CubeVisit.proto\"\370\001\n\020C" +
       "ubeVisitRequest\022\020\n\010behavior\030\001 \002(\t\022\025\n\rgtS" +
       "canRequest\030\002 \002(\014\022\024\n\014hbaseRawScan\030\003 \002(\014\022\032" +
       "\n\022rowkeyPreambleSize\030\004 \002(\005\0223\n\020hbaseColum" +
       "nsToGT\030\005 \003(\0132\031.CubeVisitRequest.IntList\022" +
-      "\021\n\tstartTime\030\006 \002(\003\022\017\n\007timeout\030\007 \002(\003\022\026\n\016u" +
-      "seCompression\030\010 \001(\010\022\"\n\032customMeasureType" +
-      "Factories\030\t \003(\t\032\027\n\007IntList\022\014\n\004ints\030\001 \003(\005",
-      "\"\321\002\n\021CubeVisitResponse\022\026\n\016compressedRows" +
-      "\030\001 \002(\014\022\'\n\005stats\030\002 \002(\0132\030.CubeVisitRespons" +
-      "e.Stats\032\372\001\n\005Stats\022\030\n\020serviceStartTime\030\001 " +
-      "\001(\003\022\026\n\016serviceEndTime\030\002 \001(\003\022\027\n\017scannedRo" +
-      "wCount\030\003 \001(\005\022\032\n\022aggregatedRowCount\030\004 \001(\005" +
-      "\022\025\n\rsystemCpuLoad\030\005 \001(\001\022\036\n\026freePhysicalM" +
-      "emorySize\030\006 \001(\001\022\031\n\021freeSwapSpaceSize\030\007 \001" +
-      "(\001\022\020\n\010hostname\030\010 \001(\t\022\016\n\006etcMsg\030\t \001(\t\022\026\n\016" +
-      "normalComplete\030\n \001(\0052F\n\020CubeVisitService" +
-      "\0222\n\tvisitCube\022\021.CubeVisitRequest\032\022.CubeV",
-      "isitResponseB`\nEorg.apache.kylin.storage" +
-      ".hbase.cube.v2.coprocessor.endpoint.gene" +
-      "ratedB\017CubeVisitProtosH\001\210\001\001\240\001\001"
+      "\021\n\tstartTime\030\006 \002(\003\022\017\n\007timeout\030\007 \002(\003\022\027\n\017k" +
+      "ylinProperties\030\010 \002(\t\032\027\n\007IntList\022\014\n\004ints\030" +
+      "\001 \003(\005\"\321\002\n\021CubeVisitResponse\022\026\n\016compresse",
+      "dRows\030\001 \002(\014\022\'\n\005stats\030\002 \002(\0132\030.CubeVisitRe" +
+      "sponse.Stats\032\372\001\n\005Stats\022\030\n\020serviceStartTi" +
+      "me\030\001 \001(\003\022\026\n\016serviceEndTime\030\002 \001(\003\022\027\n\017scan" +
+      "nedRowCount\030\003 \001(\005\022\032\n\022aggregatedRowCount\030" +
+      "\004 \001(\005\022\025\n\rsystemCpuLoad\030\005 \001(\001\022\036\n\026freePhys" +
+      "icalMemorySize\030\006 \001(\001\022\031\n\021freeSwapSpaceSiz" +
+      "e\030\007 \001(\001\022\020\n\010hostname\030\010 \001(\t\022\016\n\006etcMsg\030\t \001(" +
+      "\t\022\026\n\016normalComplete\030\n \001(\0052F\n\020CubeVisitSe" +
+      "rvice\0222\n\tvisitCube\022\021.CubeVisitRequest\032\022." +
+      "CubeVisitResponseB`\nEorg.apache.kylin.st",
+      "orage.hbase.cube.v2.coprocessor.endpoint" +
+      ".generatedB\017CubeVisitProtosH\001\210\001\001\240\001\001"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
       new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -4713,7 +4552,7 @@ public final class CubeVisitProtos {
           internal_static_CubeVisitRequest_fieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
               internal_static_CubeVisitRequest_descriptor,
-              new java.lang.String[] { "Behavior", "GtScanRequest", "HbaseRawScan", "RowkeyPreambleSize", "HbaseColumnsToGT", "StartTime", "Timeout", "UseCompression", "CustomMeasureTypeFactories", });
+              new java.lang.String[] { "Behavior", "GtScanRequest", "HbaseRawScan", "RowkeyPreambleSize", "HbaseColumnsToGT", "StartTime", "Timeout", "KylinProperties", });
           internal_static_CubeVisitRequest_IntList_descriptor =
             internal_static_CubeVisitRequest_descriptor.getNestedTypes().get(0);
           internal_static_CubeVisitRequest_IntList_fieldAccessorTable = new

http://git-wip-us.apache.org/repos/asf/kylin/blob/56af0f41/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
index c9bc5d1..04e9c7a 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
@@ -37,8 +37,7 @@ message CubeVisitRequest {
     repeated IntList hbaseColumnsToGT = 5;
     required int64 startTime = 6;//when client start the request
     required int64 timeout = 7;//how long client will wait
-    optional bool useCompression = 8; // compress result or not
-    repeated string customMeasureTypeFactories = 9; // customization
+    required string kylinProperties = 8; // kylin properties
     message IntList {
         repeated int32 ints = 1;
     }