Repository: kylin
Updated Branches:
  refs/heads/2.0.x ad67fd763 -> eb30e3ca4


Revert "KYLIN-2624 introduce StorageURL, add timeout to HBaseResourceStore"

This reverts commit 79db2768bc517d9a8e64f657baff10e1914caa7c.


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

Branch: refs/heads/2.0.x
Commit: 0a2ee4e28ed6fe92a3f1874ade6ecbfc1e0aecaa
Parents: ad67fd7
Author: Hongbin Ma <mahong...@apache.org>
Authored: Sat May 20 16:36:54 2017 +0800
Committer: Hongbin Ma <mahong...@apache.org>
Committed: Sat May 20 16:36:54 2017 +0800

----------------------------------------------------------------------
 .../apache/kylin/common/KylinConfigBase.java    |  30 +--
 .../org/apache/kylin/common/StorageURL.java     | 183 -------------------
 .../common/persistence/FileResourceStore.java   |   2 +-
 .../apache/kylin/common/KylinConfigTest.java    |   9 +-
 .../org/apache/kylin/common/StorageURLTest.java | 103 -----------
 .../persistence/LocalFileResourceStoreTest.java |   3 +-
 .../common/persistence/ResourceStoreTest.java   |   2 +-
 .../apache/kylin/dict/DictionaryManager.java    |   3 +-
 .../apache/kylin/storage/StorageContext.java    |   7 +-
 .../kylin/engine/mr/steps/CubeReducerTest.java  |   2 +-
 .../engine/mr/steps/NDCuboidMapperTest.java     |   2 +-
 examples/test_case_data/localmeta/UUID          | Bin 38 -> 0 bytes
 .../kylin/job/BaseTestDistributedScheduler.java |   8 +-
 .../kylin/storage/hbase/ITStorageTest.java      |   3 +-
 .../apache/kylin/query/schema/OLAPSchema.java   |   5 +-
 .../rest/security/MockAclHBaseStorage.java      |   5 +-
 .../rest/security/RealAclHBaseStorage.java      |   9 +-
 .../apache/kylin/rest/service/QueryService.java |  11 +-
 .../kylin/storage/hbase/HBaseConnection.java    |  26 +--
 .../kylin/storage/hbase/HBaseResourceStore.java |  36 ++--
 .../storage/hbase/util/CubeMigrationCLI.java    |  20 +-
 .../hbase/util/GridTableHBaseBenchmark.java     |   3 +-
 .../hbase/util/ZookeeperDistributedJobLock.java |  14 +-
 .../kylin/storage/hdfs/HDFSResourceStore.java   |  33 +++-
 .../hbase/steps/CubeHFileMapper2Test.java       |   4 +-
 .../storage/hbase/steps/MockupMapContext.java   |   2 +-
 .../org/apache/kylin/tool/CubeMigrationCLI.java |  20 +-
 27 files changed, 135 insertions(+), 410 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java 
b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 9c698ac..09bbb72 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -167,7 +167,7 @@ abstract public class KylinConfigBase implements 
Serializable {
     }
 
     public String toString() {
-        return getMetadataUrl().toString();
+        return getMetadataUrl();
     }
 
     // 
============================================================================
@@ -203,8 +203,8 @@ abstract public class KylinConfigBase implements 
Serializable {
     // METADATA
     // 
============================================================================
 
-    public StorageURL getMetadataUrl() {
-        return StorageURL.valueOf(getOptional("kylin.metadata.url", ""));
+    public String getMetadataUrl() {
+        return getOptional("kylin.metadata.url");
     }
 
     // for test only
@@ -213,7 +213,14 @@ abstract public class KylinConfigBase implements 
Serializable {
     }
 
     public String getMetadataUrlPrefix() {
-        return getMetadataUrl().getIdentifier();
+        String metadataUrl = getMetadataUrl();
+        String defaultPrefix = "kylin_metadata";
+
+        int cut = metadataUrl.lastIndexOf('@');
+        if (cut > 0) {
+            return metadataUrl.substring(0, cut);
+        }
+        return defaultPrefix;
     }
 
     public String[] getRealizationProviders() {
@@ -536,14 +543,8 @@ abstract public class KylinConfigBase implements 
Serializable {
         return Integer.parseInt(getOptional("kylin.storage.default", "2"));
     }
 
-    public StorageURL getStorageUrl() {
-        String url = getOptional("kylin.storage.url", "default@hbase");
-
-        // for backward compatibility
-        if ("hbase".equals(url))
-            url = "default@hbase";
-        
-        return StorageURL.valueOf(url);
+    public String getStorageUrl() {
+        return getOptional("kylin.storage.url");
     }
 
     public String getHBaseClusterFs() {
@@ -971,7 +972,10 @@ abstract public class KylinConfigBase implements 
Serializable {
     }
 
     public String getResourceStoreImpl() {
-        return getResourceStoreImpls().get(getMetadataUrl().getScheme());
+        String metadataUrl = KylinConfig.getInstanceFromEnv().getMetadataUrl();
+        int cut = metadataUrl.indexOf('@');
+        String key = cut < 0 ? "" : metadataUrl.substring(cut + 1);
+        return getResourceStoreImpls().get(key);
     }
 
     public String getJobTrackingURLPattern() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/main/java/org/apache/kylin/common/StorageURL.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/StorageURL.java 
b/core-common/src/main/java/org/apache/kylin/common/StorageURL.java
deleted file mode 100644
index 04540e3..0000000
--- a/core-common/src/main/java/org/apache/kylin/common/StorageURL.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.common;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ExecutionException;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * The object form of metadata/storage URL: 
IDENTIFIER@SCHEME[,PARAM=VALUE,PARAM=VALUE...]
- *  
- * It is not standard URL, but a string of specific format that shares some 
similar parts with URL.
- * 
- * Immutable by design.
- */
-public class StorageURL {
-
-    private static final LoadingCache<String, StorageURL> cache = 
CacheBuilder.newBuilder()//
-            .maximumSize(100)//
-            .build(new CacheLoader<String, StorageURL>() {
-                @Override
-                public StorageURL load(String metadataUrl) throws Exception {
-                    return new StorageURL(metadataUrl);
-                }
-            });
-    
-    public static StorageURL valueOf(String metadataUrl) {
-        try {
-            return cache.get(metadataUrl);
-        } catch (ExecutionException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    // 
============================================================================
-
-    final String identifier;
-    final String scheme;
-    final Map<String, String> params;
-
-    // package private for test
-    StorageURL(String metadataUrl) {
-        boolean first = true;
-        String n = null;
-        String s = null;
-        Map<String, String> m = new LinkedHashMap<>();
-
-        for (String split : metadataUrl.split(",")) {
-            if (first) {
-                // identifier @ scheme
-                int cut = split.lastIndexOf('@');
-                if (cut < 0) {
-                    n = split.trim();
-                    s = "";
-                } else {
-                    n = split.substring(0, cut).trim();
-                    s = split.substring(cut + 1).trim();
-                }
-                first = false;
-            } else {
-                // param = value
-                int cut = split.indexOf('=');
-                String k, v;
-                if (cut < 0) {
-                    k = split.trim();
-                    v = "";
-                } else {
-                    k = split.substring(0, cut).trim();
-                    v = split.substring(cut + 1).trim();
-                }
-                m.put(k, v);
-            }
-        }
-
-        this.identifier = n.isEmpty() ? "kylin_metadata" : n;
-        this.scheme = s;
-        this.params = ImmutableMap.copyOf(m);
-    }
-
-    private StorageURL(String identifier, String scheme, Map<String, String> 
params) {
-        this.identifier = identifier;
-        this.scheme = scheme;
-        this.params = ImmutableMap.copyOf(params);
-    }
-
-    public String getIdentifier() {
-        return identifier;
-    }
-
-    public String getScheme() {
-        return scheme;
-    }
-
-    public boolean containsParameter(String k) {
-        return params.containsKey(k);
-    }
-    
-    public String getParameter(String k) {
-        return params.get(k);
-    }
-
-    public Map<String, String> getAllParameters() {
-        return params;
-    }
-
-    public StorageURL copy(Map<String, String> params) {
-        return new StorageURL(identifier, scheme, params);
-    }
-
-    @Override
-    public String toString() {
-        String str = identifier;
-        if (!scheme.isEmpty())
-            str += "@" + scheme;
-
-        for (Entry<String, String> kv : params.entrySet()) {
-            str += "," + kv.getKey();
-            if (!kv.getValue().isEmpty())
-                str += "=" + kv.getValue();
-        }
-        return str;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((identifier == null) ? 0 : 
identifier.hashCode());
-        result = prime * result + ((params == null) ? 0 : params.hashCode());
-        result = prime * result + ((scheme == null) ? 0 : scheme.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        StorageURL other = (StorageURL) obj;
-        if (identifier == null) {
-            if (other.identifier != null)
-                return false;
-        } else if (!identifier.equals(other.identifier))
-            return false;
-        if (params == null) {
-            if (other.params != null)
-                return false;
-        } else if (!params.equals(other.params))
-            return false;
-        if (scheme == null) {
-            if (other.scheme != null)
-                return false;
-        } else if (!scheme.equals(other.scheme))
-            return false;
-        return true;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
 
b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
index 82cf451..d84e587 100644
--- 
a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
+++ 
b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
@@ -44,7 +44,7 @@ public class FileResourceStore extends ResourceStore {
 
     public FileResourceStore(KylinConfig kylinConfig) {
         super(kylinConfig);
-        root = new 
File(kylinConfig.getMetadataUrl().getIdentifier()).getAbsoluteFile();
+        root = new File(kylinConfig.getMetadataUrl()).getAbsoluteFile();
         if (root.exists() == false)
             throw new IllegalArgumentException("File not exist by '" + 
kylinConfig.getMetadataUrl() + "': " + root.getAbsolutePath());
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java 
b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
index 6027af3..3976c6c 100644
--- a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
@@ -86,6 +86,7 @@ public class KylinConfigTest extends 
HotLoadKylinPropertiesTestCase {
     @Test
     public void testGetMetadataUrlPrefix() {
         KylinConfig config = KylinConfig.getInstanceFromEnv();
+        final String default_metadata_prefix = "kylin_metadata";
 
         config.setMetadataUrl("testMetaPrefix@hbase");
         assertEquals("testMetaPrefix", config.getMetadataUrlPrefix());
@@ -94,7 +95,7 @@ public class KylinConfigTest extends 
HotLoadKylinPropertiesTestCase {
         assertEquals("testMetaPrefix", config.getMetadataUrlPrefix());
 
         config.setMetadataUrl("/kylin/temp");
-        assertEquals("/kylin/temp", config.getMetadataUrlPrefix());
+        assertEquals(default_metadata_prefix, config.getMetadataUrlPrefix());
     }
 
     @Test
@@ -106,21 +107,21 @@ public class KylinConfigTest extends 
HotLoadKylinPropertiesTestCase {
         KylinConfig sysConfig = KylinConfig.getInstanceFromEnv();
         sysConfig.setMetadataUrl(metadata1);
 
-        assertEquals(metadata1, 
KylinConfig.getInstanceFromEnv().getMetadataUrl().toString());
+        assertEquals(metadata1, 
KylinConfig.getInstanceFromEnv().getMetadataUrl());
 
         // test thread-local override
         KylinConfig threadConfig = KylinConfig.createKylinConfig(new 
Properties());
         threadConfig.setMetadataUrl(metadata2);
         KylinConfig.setKylinConfigThreadLocal(threadConfig);
 
-        assertEquals(metadata2, 
KylinConfig.getInstanceFromEnv().getMetadataUrl().toString());
+        assertEquals(metadata2, 
KylinConfig.getInstanceFromEnv().getMetadataUrl());
 
         // other threads still use system KylinConfig
         new Thread(new Runnable() {
             @Override
             public void run() {
                 System.out.println("Started new thread.");
-                assertEquals(metadata1, 
KylinConfig.getInstanceFromEnv().getMetadataUrl().toString());
+                assertEquals(metadata1, 
KylinConfig.getInstanceFromEnv().getMetadataUrl());
             }
         }).start();
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/test/java/org/apache/kylin/common/StorageURLTest.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/test/java/org/apache/kylin/common/StorageURLTest.java 
b/core-common/src/test/java/org/apache/kylin/common/StorageURLTest.java
deleted file mode 100644
index eaa7548..0000000
--- a/core-common/src/test/java/org/apache/kylin/common/StorageURLTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.common;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-public class StorageURLTest {
-
-    @Test
-    public void testBasic() {
-        {
-            StorageURL id = new StorageURL("hello@hbase");
-            assertEquals("hello", id.getIdentifier());
-            assertEquals("hbase", id.getScheme());
-            assertEquals(0, id.getAllParameters().size());
-            assertEquals("hello@hbase", id.toString());
-        }
-        {
-            StorageURL id = new StorageURL("hello@hbase,a=b,c=d");
-            assertEquals("hello", id.getIdentifier());
-            assertEquals("hbase", id.getScheme());
-            assertEquals(2, id.getAllParameters().size());
-            assertEquals("b", id.getParameter("a"));
-            assertEquals("d", id.getParameter("c"));
-            assertEquals("hello@hbase,a=b,c=d", id.toString());
-        }
-        {
-            StorageURL o = new StorageURL("hello@hbase,c=d");
-            StorageURL o2 = new StorageURL("hello@hbase,a=b");
-            StorageURL id = o.copy(o2.getAllParameters());
-            assertEquals("hello", id.getIdentifier());
-            assertEquals("hbase", id.getScheme());
-            assertEquals(1, id.getAllParameters().size());
-            assertEquals("b", id.getParameter("a"));
-            assertEquals("hello@hbase,a=b", id.toString());
-            assertEquals("hello@hbase,c=d", o.toString());
-            assertEquals("hello@hbase,a=b", o2.toString());
-        }
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testNullInput() {
-        new StorageURL(null);
-    }
-
-    @Test
-    public void testEdgeCases() {
-        {
-            StorageURL id = new StorageURL("");
-            assertEquals("kylin_metadata", id.getIdentifier());
-            assertEquals("", id.getScheme());
-            assertEquals(0, id.getAllParameters().size());
-            assertEquals("kylin_metadata", id.toString());
-        }
-        {
-            StorageURL id = new StorageURL("hello@");
-            assertEquals("hello", id.getIdentifier());
-            assertEquals("", id.getScheme());
-            assertEquals(0, id.getAllParameters().size());
-            assertEquals("hello", id.toString());
-        }
-        {
-            StorageURL id = new StorageURL("hello@hbase,a");
-            assertEquals("hello", id.getIdentifier());
-            assertEquals("hbase", id.getScheme());
-            assertEquals(1, id.getAllParameters().size());
-            assertEquals("", id.getParameter("a"));
-            assertEquals("hello@hbase,a", id.toString());
-        }
-    }
-    
-    @Test
-    public void testValueOfCache() {
-        StorageURL id1 = StorageURL.valueOf("hello@hbase");
-        StorageURL id2 = StorageURL.valueOf("hello@hbase");
-        StorageURL id3 = StorageURL.valueOf("hello @ hbase");
-        StorageURL id4 = StorageURL.valueOf("hello@hbase,a=b");
-        assertTrue(id1 == id2);
-        assertTrue(id1 != id3);
-        assertTrue(id1.equals(id3));
-        assertTrue(id2 != id4);
-        assertTrue(!id2.equals(id4));
-    }
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/test/java/org/apache/kylin/common/persistence/LocalFileResourceStoreTest.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/test/java/org/apache/kylin/common/persistence/LocalFileResourceStoreTest.java
 
b/core-common/src/test/java/org/apache/kylin/common/persistence/LocalFileResourceStoreTest.java
index ebef377..17b608d 100644
--- 
a/core-common/src/test/java/org/apache/kylin/common/persistence/LocalFileResourceStoreTest.java
+++ 
b/core-common/src/test/java/org/apache/kylin/common/persistence/LocalFileResourceStoreTest.java
@@ -38,8 +38,7 @@ public class LocalFileResourceStoreTest extends 
LocalFileMetadataTestCase {
 
     @Test
     public void testFileStore() throws Exception {
-        KylinConfig config = KylinConfig.getInstanceFromEnv();
-        ResourceStoreTest.testAStore(config.getMetadataUrl().toString(), 
config);
+        ResourceStoreTest.testAStore("", KylinConfig.getInstanceFromEnv());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
 
b/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
index 9686ee9..76ab029 100644
--- 
a/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
+++ 
b/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
@@ -248,7 +248,7 @@ public class ResourceStoreTest {
     }
 
     public static String replaceMetadataUrl(KylinConfig kylinConfig, String 
newUrl) {
-        String oldUrl = kylinConfig.getMetadataUrl().toString();
+        String oldUrl = kylinConfig.getMetadataUrl();
         kylinConfig.setProperty("kylin.metadata.url", newUrl);
         return oldUrl;
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-dictionary/src/main/java/org/apache/kylin/dict/DictionaryManager.java
----------------------------------------------------------------------
diff --git 
a/core-dictionary/src/main/java/org/apache/kylin/dict/DictionaryManager.java 
b/core-dictionary/src/main/java/org/apache/kylin/dict/DictionaryManager.java
index b10bcd3..986f9c3 100644
--- a/core-dictionary/src/main/java/org/apache/kylin/dict/DictionaryManager.java
+++ b/core-dictionary/src/main/java/org/apache/kylin/dict/DictionaryManager.java
@@ -99,8 +99,7 @@ public class DictionaryManager {
                     }
                 })//
                 .maximumSize(config.getCachedDictMaxEntrySize())//
-                .expireAfterWrite(1, TimeUnit.DAYS)//
-                .build(new CacheLoader<String, DictionaryInfo>() {
+                .expireAfterWrite(1, TimeUnit.DAYS).build(new 
CacheLoader<String, DictionaryInfo>() {
                     @Override
                     public DictionaryInfo load(String key) throws Exception {
                         DictionaryInfo dictInfo = 
DictionaryManager.this.load(key, true);

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
----------------------------------------------------------------------
diff --git 
a/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java 
b/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
index 78cf97c..4522261 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
@@ -20,7 +20,6 @@ package org.apache.kylin.storage;
 
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.debug.BackdoorToggles;
 import org.apache.kylin.cube.cuboid.Cuboid;
 import org.apache.kylin.metadata.realization.IRealization;
@@ -36,7 +35,7 @@ import com.google.common.collect.Range;
 public class StorageContext {
     private static final Logger logger = 
LoggerFactory.getLogger(StorageContext.class);
 
-    private StorageURL connUrl;
+    private String connUrl;
     private int limit = Integer.MAX_VALUE;
     private boolean overlookOuterLimit = false;
     private int offset = 0;
@@ -57,11 +56,11 @@ public class StorageContext {
 
     private Range<Long> reusedPeriod;
 
-    public StorageURL getConnUrl() {
+    public String getConnUrl() {
         return connUrl;
     }
 
-    public void setConnUrl(StorageURL connUrl) {
+    public void setConnUrl(String connUrl) {
         this.connUrl = connUrl;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
----------------------------------------------------------------------
diff --git 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
index 7616df2..29ca9b8 100644
--- 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
+++ 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
@@ -60,7 +60,7 @@ public class CubeReducerTest extends 
LocalFileMetadataTestCase {
 
         // hack for distributed cache
         FileUtils.deleteDirectory(new File("../job/meta"));
-        FileUtils.copyDirectory(new 
File(getTestConfig().getMetadataUrl().toString()), new File("../job/meta"));
+        FileUtils.copyDirectory(new File(getTestConfig().getMetadataUrl()), 
new File("../job/meta"));
 
         CuboidReducer reducer = new CuboidReducer();
         reduceDriver = ReduceDriver.newReduceDriver(reducer);

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/NDCuboidMapperTest.java
----------------------------------------------------------------------
diff --git 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/NDCuboidMapperTest.java
 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/NDCuboidMapperTest.java
index c0ce1a4..815d9b3 100644
--- 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/NDCuboidMapperTest.java
+++ 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/NDCuboidMapperTest.java
@@ -54,7 +54,7 @@ public class NDCuboidMapperTest extends 
LocalFileMetadataTestCase {
 
         // hack for distributed cache
         FileUtils.deleteDirectory(new File("./meta"));
-        FileUtils.copyDirectory(new 
File(getTestConfig().getMetadataUrl().toString()), new File("./meta"));
+        FileUtils.copyDirectory(new File(getTestConfig().getMetadataUrl()), 
new File("./meta"));
 
         NDCuboidMapper mapper = new NDCuboidMapper();
         CuboidReducer reducer = new CuboidReducer();

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/examples/test_case_data/localmeta/UUID
----------------------------------------------------------------------
diff --git a/examples/test_case_data/localmeta/UUID 
b/examples/test_case_data/localmeta/UUID
deleted file mode 100644
index 5d7b2aa..0000000
Binary files a/examples/test_case_data/localmeta/UUID and /dev/null differ

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/kylin-it/src/test/java/org/apache/kylin/job/BaseTestDistributedScheduler.java
----------------------------------------------------------------------
diff --git 
a/kylin-it/src/test/java/org/apache/kylin/job/BaseTestDistributedScheduler.java 
b/kylin-it/src/test/java/org/apache/kylin/job/BaseTestDistributedScheduler.java
index 5f1b8cf..2d79970 100644
--- 
a/kylin-it/src/test/java/org/apache/kylin/job/BaseTestDistributedScheduler.java
+++ 
b/kylin-it/src/test/java/org/apache/kylin/job/BaseTestDistributedScheduler.java
@@ -75,7 +75,7 @@ public class BaseTestDistributedScheduler extends 
HBaseMetadataTestCase {
         KylinConfig srcConfig = KylinConfig.getInstanceFromEnv();
 
         localMetaDir = Files.createTempDir();
-        String backup = srcConfig.getMetadataUrl().toString();
+        String backup = srcConfig.getMetadataUrl();
         srcConfig.setProperty("kylin.metadata.url", 
localMetaDir.getAbsolutePath());
         srcConfig.writeProperties(new File(confDstPath1));
         srcConfig.writeProperties(new File(confDstPath2));
@@ -197,10 +197,6 @@ public class BaseTestDistributedScheduler extends 
HBaseMetadataTestCase {
     }
 
     private String getLockPath(String pathName) {
-        String metadataUrlPrefix = kylinConfig1.getMetadataUrlPrefix();
-        String path = ZookeeperDistributedJobLock.dropDoubleSlash(//
-                ZookeeperDistributedJobLock.ZOOKEEPER_LOCK_PATH + "/" + 
metadataUrlPrefix + "/" + pathName);
-        logger.debug("Building lock path " + path);
-        return path;
+        return ZookeeperDistributedJobLock.ZOOKEEPER_LOCK_PATH + "/" + 
kylinConfig1.getMetadataUrlPrefix() + "/" + pathName;
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java
----------------------------------------------------------------------
diff --git 
a/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java 
b/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java
index 24589a8..c2f68ff 100644
--- a/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java
+++ b/kylin-it/src/test/java/org/apache/kylin/storage/hbase/ITStorageTest.java
@@ -71,8 +71,9 @@ public class ITStorageTest extends HBaseMetadataTestCase {
         cube = cubeMgr.getCube("test_kylin_cube_without_slr_left_join_empty");
         Assert.assertNotNull(cube);
         storageEngine = StorageFactory.createQuery(cube);
+        String url = KylinConfig.getInstanceFromEnv().getStorageUrl();
         context = new StorageContext();
-        context.setConnUrl(KylinConfig.getInstanceFromEnv().getStorageUrl());
+        context.setConnUrl(url);
         mockup = new StorageMockUtils(cube.getModel());
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java 
b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java
index f04acd2..27d456f 100644
--- a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java
+++ b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.cube.CubeManager;
 import org.apache.kylin.metadata.MetadataManager;
 import org.apache.kylin.metadata.model.TableDesc;
@@ -41,7 +40,7 @@ public class OLAPSchema extends AbstractSchema {
     private KylinConfig config;
     private String projectName;
     private String schemaName;
-    private StorageURL storageUrl;
+    private String storageUrl;
     private String starSchemaUrl;
     private String starSchemaUser;
     private String starSchemaPassword;
@@ -90,7 +89,7 @@ public class OLAPSchema extends AbstractSchema {
         return schemaName;
     }
 
-    public StorageURL getStorageUrl() {
+    public String getStorageUrl() {
         return storageUrl;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/server-base/src/main/java/org/apache/kylin/rest/security/MockAclHBaseStorage.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/security/MockAclHBaseStorage.java
 
b/server-base/src/main/java/org/apache/kylin/rest/security/MockAclHBaseStorage.java
index e7df63b..cc76b87 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/security/MockAclHBaseStorage.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/security/MockAclHBaseStorage.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.rest.service.AclService;
 import org.apache.kylin.rest.service.QueryService;
 import org.apache.kylin.rest.service.UserService;
@@ -40,8 +39,8 @@ public class MockAclHBaseStorage implements AclHBaseStorage {
     private RealAclHBaseStorage realAcl;
 
     public MockAclHBaseStorage() {
-        StorageURL metadataUrl = 
KylinConfig.getInstanceFromEnv().getMetadataUrl();
-        if (metadataUrl.getScheme().endsWith("hbase")) {
+        String metadataUrl = KylinConfig.getInstanceFromEnv().getMetadataUrl();
+        if (metadataUrl != null && metadataUrl.endsWith("hbase")) {
             // hbase must be available since metadata is on it
             // in this case, let us use a real ACL instead of mockup
             realAcl = new RealAclHBaseStorage();

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/server-base/src/main/java/org/apache/kylin/rest/security/RealAclHBaseStorage.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/security/RealAclHBaseStorage.java
 
b/server-base/src/main/java/org/apache/kylin/rest/security/RealAclHBaseStorage.java
index d950437..d1a1384 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/security/RealAclHBaseStorage.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/security/RealAclHBaseStorage.java
@@ -24,7 +24,6 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.rest.service.AclService;
 import org.apache.kylin.rest.service.QueryService;
 import org.apache.kylin.rest.service.UserService;
@@ -34,15 +33,17 @@ import org.apache.kylin.storage.hbase.HBaseConnection;
  */
 public class RealAclHBaseStorage implements AclHBaseStorage {
 
-    private StorageURL hbaseUrl;
+    private String hbaseUrl;
     private String aclTableName;
     private String userTableName;
 
     @Override
     public String prepareHBaseTable(Class<?> clazz) throws IOException {
         KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
-        hbaseUrl = kylinConfig.getMetadataUrl();
-        String tableNameBase = hbaseUrl.getIdentifier();
+        String metadataUrl = kylinConfig.getMetadataUrl();
+        int cut = metadataUrl.indexOf('@');
+        hbaseUrl = cut < 0 ? metadataUrl : metadataUrl.substring(cut + 1);
+        String tableNameBase = kylinConfig.getMetadataUrlPrefix();
 
         if (clazz == AclService.class) {
             aclTableName = tableNameBase + ACL_TABLE_NAME;

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
index 9ba900f..6a38638 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
@@ -55,7 +55,6 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.QueryContext;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.debug.BackdoorToggles;
 import org.apache.kylin.common.exceptions.ResourceLimitExceededException;
 import org.apache.kylin.common.util.Bytes;
@@ -116,7 +115,7 @@ public class QueryService extends BasicService {
     private final Serializer<Query[]> querySerializer = new 
Serializer<Query[]>(Query[].class);
     private final BadQueryDetector badQueryDetector = new BadQueryDetector();
 
-    private final StorageURL hbaseUrl;
+    private final String hbaseUrl;
     private final String userTableName;
 
     @Autowired
@@ -132,8 +131,12 @@ public class QueryService extends BasicService {
 
     public QueryService() {
         KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
-        hbaseUrl = kylinConfig.getMetadataUrl();
-        userTableName = hbaseUrl.getIdentifier() + USER_TABLE_NAME;
+        String metadataUrl = kylinConfig.getMetadataUrl();
+        // split TABLE@HBASE_URL
+        int cut = metadataUrl.indexOf('@');
+        hbaseUrl = cut < 0 ? metadataUrl : metadataUrl.substring(cut + 1);
+        String tableNameBase = kylinConfig.getMetadataUrlPrefix();
+        userTableName = tableNameBase + USER_TABLE_NAME;
 
         badQueryDetector.start();
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
index 33662b0..7e2cefc 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
@@ -23,7 +23,6 @@ import java.io.UnsupportedEncodingException;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -46,7 +45,6 @@ import org.apache.hadoop.hbase.client.ConnectionFactory;
 import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.hdfs.DFSConfigKeys;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.StorageException;
 import org.apache.kylin.common.util.HadoopUtil;
 import org.slf4j.Logger;
@@ -64,8 +62,8 @@ public class HBaseConnection {
 
     private static final Logger logger = 
LoggerFactory.getLogger(HBaseConnection.class);
 
-    private static final Map<StorageURL, Configuration> configCache = new 
ConcurrentHashMap<StorageURL, Configuration>();
-    private static final Map<StorageURL, Connection> connPool = new 
ConcurrentHashMap<StorageURL, Connection>();
+    private static final Map<String, Configuration> configCache = new 
ConcurrentHashMap<String, Configuration>();
+    private static final Map<String, Connection> connPool = new 
ConcurrentHashMap<String, Connection>();
     private static final ThreadLocal<Configuration> configThreadLocal = new 
ThreadLocal<>();
 
     private static ExecutorService coprocessorPool = null;
@@ -80,7 +78,7 @@ public class HBaseConnection {
                     try {
                         conn.close();
                     } catch (IOException e) {
-                        logger.error("error closing hbase connection " + conn, 
e);
+                        e.printStackTrace();
                     }
                 }
             }
@@ -135,15 +133,15 @@ public class HBaseConnection {
 
     public static Configuration getCurrentHBaseConfiguration() {
         if (configThreadLocal.get() == null) {
-            StorageURL storageUrl = 
KylinConfig.getInstanceFromEnv().getStorageUrl();
+            String storageUrl = 
KylinConfig.getInstanceFromEnv().getStorageUrl();
             configThreadLocal.set(newHBaseConfiguration(storageUrl));
         }
         return configThreadLocal.get();
     }
 
-    private static Configuration newHBaseConfiguration(StorageURL url) {
+    private static Configuration newHBaseConfiguration(String url) {
         // using a hbase:xxx URL is deprecated, instead hbase config is always 
loaded from hbase-site.xml in classpath
-        if (!"hbase".equals(url.getScheme()))
+        if (!(StringUtils.isEmpty(url) || "hbase".equals(url)))
             throw new IllegalArgumentException("to use hbase storage, pls set 
'kylin.storage.url=hbase' in kylin.properties");
 
         Configuration conf = 
HBaseConfiguration.create(HadoopUtil.getCurrentConfiguration());
@@ -163,10 +161,6 @@ public class HBaseConnection {
         if (StringUtils.isBlank(conf.get("hbase.fs.tmp.dir"))) {
             conf.set("hbase.fs.tmp.dir", "/tmp");
         }
-        
-        for (Entry<String, String> entry : url.getAllParameters().entrySet()) {
-            conf.set(entry.getKey(), entry.getValue());
-        }
 
         return conf;
     }
@@ -218,7 +212,7 @@ public class HBaseConnection {
 
     // returned Connection can be shared by multiple threads and does not 
require close()
     @SuppressWarnings("resource")
-    public static Connection get(StorageURL url) {
+    public static Connection get(String url) {
         // find configuration
         Configuration conf = configCache.get(url);
         if (conf == null) {
@@ -260,15 +254,15 @@ public class HBaseConnection {
         }
     }
 
-    public static boolean tableExists(StorageURL hbaseUrl, String tableName) 
throws IOException {
+    public static boolean tableExists(String hbaseUrl, String tableName) 
throws IOException {
         return tableExists(HBaseConnection.get(hbaseUrl), tableName);
     }
 
-    public static void createHTableIfNeeded(StorageURL hbaseUrl, String 
tableName, String... families) throws IOException {
+    public static void createHTableIfNeeded(String hbaseUrl, String tableName, 
String... families) throws IOException {
         createHTableIfNeeded(HBaseConnection.get(hbaseUrl), tableName, 
families);
     }
 
-    public static void deleteTable(StorageURL hbaseUrl, String tableName) 
throws IOException {
+    public static void deleteTable(String hbaseUrl, String tableName) throws 
IOException {
         deleteTable(HBaseConnection.get(hbaseUrl), tableName);
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
index 7674bf4..74ab017 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
@@ -22,9 +22,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.NavigableSet;
 import java.util.TreeSet;
 
@@ -47,7 +45,6 @@ import org.apache.hadoop.hbase.filter.FilterList;
 import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
 import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.RawResource;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.util.Bytes;
@@ -69,42 +66,32 @@ public class HBaseResourceStore extends ResourceStore {
     private static final String COLUMN_TS = "t";
     private static final byte[] B_COLUMN_TS = Bytes.toBytes(COLUMN_TS);
 
-    final String tableName;
-    final StorageURL metadataUrl;
+    final String tableNameBase;
+    final String hbaseUrl;
 
     Connection getConnection() throws IOException {
-        return HBaseConnection.get(metadataUrl);
+        return HBaseConnection.get(hbaseUrl);
     }
 
     public HBaseResourceStore(KylinConfig kylinConfig) throws IOException {
         super(kylinConfig);
 
-        metadataUrl = buildMetadataUrl(kylinConfig);
-        tableName = metadataUrl.getIdentifier();
+        String metadataUrl = kylinConfig.getMetadataUrl();
+        // split TABLE@HBASE_URL
+        int cut = metadataUrl.indexOf('@');
+        tableNameBase = cut < 0 ? DEFAULT_STORE_NAME : 
metadataUrl.substring(0, cut);
+        hbaseUrl = cut < 0 ? metadataUrl : metadataUrl.substring(cut + 1);
+        if (!hbaseUrl.equals("hbase"))
+            throw new IOException("Can not create HBaseResourceStore. Url not 
match. Url:" + hbaseUrl);
         createHTableIfNeeded(getAllInOneTableName());
     }
 
-    private StorageURL buildMetadataUrl(KylinConfig kylinConfig) throws 
IOException {
-        StorageURL url = kylinConfig.getMetadataUrl();
-        if (!url.getScheme().equals("hbase"))
-            throw new IOException("Cannot create HBaseResourceStore. Url not 
match. Url: " + url);
-
-        // control timeout for prompt error report
-        Map<String, String> newParams = new LinkedHashMap<>();
-        newParams.put("hbase.client.scanner.timeout.period", "10000");
-        newParams.put("hbase.rpc.timeout", "5000");
-        newParams.put("hbase.client.retries.number", "1");
-        newParams.putAll(url.getAllParameters());
-
-        return url.copy(newParams);
-    }
-
     private void createHTableIfNeeded(String tableName) throws IOException {
         HBaseConnection.createHTableIfNeeded(getConnection(), tableName, 
FAMILY);
     }
 
     private String getAllInOneTableName() {
-        return tableName;
+        return tableNameBase;
     }
 
     @Override
@@ -173,7 +160,6 @@ public class HBaseResourceStore extends ResourceStore {
         void visit(String childPath, String fullPath, Result hbaseResult) 
throws IOException;
     }
 
-    /* override get meta store uuid method for backward compatibility */
     @Override
     protected List<RawResource> getAllResourcesImpl(String folderPath, long 
timeStart, long timeEndExclusive) throws IOException {
         FilterList filter = generateTimeFilterList(timeStart, 
timeEndExclusive);

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/CubeMigrationCLI.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/CubeMigrationCLI.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/CubeMigrationCLI.java
index 2154ed1..581de38 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/CubeMigrationCLI.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/CubeMigrationCLI.java
@@ -40,7 +40,6 @@ import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.JsonSerializer;
 import org.apache.kylin.common.persistence.RawResource;
 import org.apache.kylin.common.persistence.ResourceStore;
@@ -173,15 +172,26 @@ public class CubeMigrationCLI {
         checkCLI.execute(cubeName);
     }
 
-    private static void checkAndGetHbaseUrl() {
-        StorageURL srcMetadataUrl = srcConfig.getMetadataUrl();
-        StorageURL dstMetadataUrl = dstConfig.getMetadataUrl();
+    private static String checkAndGetHbaseUrl() {
+        String srcMetadataUrl = srcConfig.getMetadataUrl();
+        String dstMetadataUrl = dstConfig.getMetadataUrl();
 
         logger.info("src metadata url is " + srcMetadataUrl);
         logger.info("dst metadata url is " + dstMetadataUrl);
 
-        if (!"hbase".equals(srcMetadataUrl.getScheme()) || 
!"hbase".equals(dstMetadataUrl.getScheme()))
+        int srcIndex = srcMetadataUrl.toLowerCase().indexOf("hbase");
+        int dstIndex = dstMetadataUrl.toLowerCase().indexOf("hbase");
+        if (srcIndex < 0 || dstIndex < 0)
             throw new IllegalStateException("Both metadata urls should be 
hbase metadata url");
+
+        String srcHbaseUrl = srcMetadataUrl.substring(srcIndex).trim();
+        String dstHbaseUrl = dstMetadataUrl.substring(dstIndex).trim();
+        if (!srcHbaseUrl.equalsIgnoreCase(dstHbaseUrl)) {
+            throw new IllegalStateException("hbase url not equal! ");
+        }
+
+        logger.info("hbase url is " + srcHbaseUrl.trim());
+        return srcHbaseUrl.trim();
     }
 
     private static void renameFoldersInHdfs(CubeInstance cube) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/GridTableHBaseBenchmark.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/GridTableHBaseBenchmark.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/GridTableHBaseBenchmark.java
index a317110..dd5f8fa 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/GridTableHBaseBenchmark.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/GridTableHBaseBenchmark.java
@@ -36,7 +36,6 @@ import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.util.Bytes;
 import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.storage.hbase.HBaseConnection;
@@ -74,7 +73,7 @@ public class GridTableHBaseBenchmark {
 
     public static void testGridTable(double hitRatio, double indexRatio) 
throws IOException {
         System.out.println("Testing grid table scanning, hit ratio " + 
hitRatio + ", index ratio " + indexRatio);
-        StorageURL hbaseUrl = StorageURL.valueOf("default@hbase"); // use 
hbase-site.xml on classpath
+        String hbaseUrl = "hbase"; // use hbase-site.xml on classpath
 
         Connection conn = HBaseConnection.get(hbaseUrl);
         createHTableIfNeeded(conn, TEST_TABLE);

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/ZookeeperDistributedJobLock.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/ZookeeperDistributedJobLock.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/ZookeeperDistributedJobLock.java
index 052563f..983bfd9 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/ZookeeperDistributedJobLock.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/util/ZookeeperDistributedJobLock.java
@@ -235,21 +235,11 @@ public class ZookeeperDistributedJobLock implements 
DistributedJobLock {
     }
 
     private String getLockPath(String pathName) {
-        String metadataUrlPrefix = config.getMetadataUrlPrefix();
-        return dropDoubleSlash(ZOOKEEPER_LOCK_PATH + "/" + metadataUrlPrefix + 
"/" + pathName);
+        return ZOOKEEPER_LOCK_PATH + "/" + config.getMetadataUrlPrefix() + "/" 
+ pathName;
     }
 
     private String getWatchPath() {
-        String metadataUrlPrefix = config.getMetadataUrlPrefix();
-        return dropDoubleSlash(ZOOKEEPER_LOCK_PATH + "/" + metadataUrlPrefix);
-    }
-
-    public static String dropDoubleSlash(String path) {
-        for (int n = Integer.MAX_VALUE; n > path.length();) {
-            n = path.length();
-            path = path.replace("//", "/");
-        }
-        return path;
+        return ZOOKEEPER_LOCK_PATH + "/" + config.getMetadataUrlPrefix();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/main/java/org/apache/kylin/storage/hdfs/HDFSResourceStore.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hdfs/HDFSResourceStore.java
 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hdfs/HDFSResourceStore.java
index fe1ad4e..6744805 100644
--- 
a/storage-hbase/src/main/java/org/apache/kylin/storage/hdfs/HDFSResourceStore.java
+++ 
b/storage-hbase/src/main/java/org/apache/kylin/storage/hdfs/HDFSResourceStore.java
@@ -33,7 +33,6 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.RawResource;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.util.HadoopUtil;
@@ -52,12 +51,16 @@ public class HDFSResourceStore extends ResourceStore {
 
     public HDFSResourceStore(KylinConfig kylinConfig) throws Exception {
         super(kylinConfig);
-        StorageURL metadataUrl = kylinConfig.getMetadataUrl();
-        
-        if (!metadataUrl.getScheme().equals("hdfs"))
-            throw new IOException("kylin.metadata.url not recognized for 
HDFSResourceStore:" + metadataUrl);
+        String metadataUrl = kylinConfig.getMetadataUrl();
+        int cut = metadataUrl.indexOf('@');
+        if (cut < 0) {
+            throw new IOException("kylin.metadata.url not recognized for 
HDFSResourceStore: " + metadataUrl);
+        }
+        String suffix = metadataUrl.substring(cut + 1);
+        if (!suffix.equals("hdfs"))
+            throw new IOException("kylin.metadata.url not recognized for 
HDFSResourceStore:" + suffix);
 
-        String path = metadataUrl.getIdentifier();
+        String path = metadataUrl.substring(0, cut);
         fs = HadoopUtil.getFileSystem(path);
         Path metadataPath = new Path(path);
         if (fs.exists(metadataPath) == false) {
@@ -218,4 +221,22 @@ public class HDFSResourceStore extends ResourceStore {
             resourcePath = resourcePath.substring(1, resourcePath.length());
         return new Path(this.hdfsMetaPath, resourcePath);
     }
+
+    private static String getRelativePath(Path hdfsPath) {
+        String path = hdfsPath.toString();
+        int index = path.indexOf("://");
+        if (index > 0) {
+            path = path.substring(index + 3);
+        }
+
+        if (path.startsWith("/") == false) {
+            if (path.indexOf("/") > 0) {
+                path = path.substring(path.indexOf("/"));
+            } else {
+                path = "/" + path;
+            }
+        }
+        return path;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/CubeHFileMapper2Test.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/CubeHFileMapper2Test.java
 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/CubeHFileMapper2Test.java
index d47f393..f36a62c 100644
--- 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/CubeHFileMapper2Test.java
+++ 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/CubeHFileMapper2Test.java
@@ -55,7 +55,7 @@ public class CubeHFileMapper2Test extends 
LocalFileMetadataTestCase {
         this.createTestMetadata();
         // hack for distributed cache
         FileUtils.deleteDirectory(new File("../job/meta"));
-        FileUtils.copyDirectory(new 
File(getTestConfig().getMetadataUrl().toString()), new File("../job/meta"));
+        FileUtils.copyDirectory(new File(getTestConfig().getMetadataUrl()), 
new File("../job/meta"));
         CubeDesc desc = 
CubeManager.getInstance(getTestConfig()).getCube(cubeName).getDescriptor();
         codec = new MeasureCodec(desc.getMeasures());
     }
@@ -70,7 +70,7 @@ public class CubeHFileMapper2Test extends 
LocalFileMetadataTestCase {
     public void testBasic() throws Exception {
 
         Configuration hconf = HadoopUtil.getCurrentConfiguration();
-        Context context = MockupMapContext.create(hconf, cubeName, outKV);
+        Context context = MockupMapContext.create(hconf, 
getTestConfig().getMetadataUrl(), cubeName, outKV);
 
         CubeHFileMapper mapper = new CubeHFileMapper();
         mapper.setup(context);

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/MockupMapContext.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/MockupMapContext.java
 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/MockupMapContext.java
index 61170e8..536634d 100644
--- 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/MockupMapContext.java
+++ 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/MockupMapContext.java
@@ -53,7 +53,7 @@ public class MockupMapContext implements MapContext {
 
     private Object[] outKV;
 
-    public static Context create(final Configuration hconf, String cubeName, 
final Object[] outKV) {
+    public static Context create(final Configuration hconf, String 
metadataUrl, String cubeName, final Object[] outKV) {
 
         hconf.set(BatchConstants.CFG_CUBE_NAME, cubeName);
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/0a2ee4e2/tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java
----------------------------------------------------------------------
diff --git a/tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java 
b/tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java
index 08d4292..c162a76 100644
--- a/tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java
+++ b/tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java
@@ -40,7 +40,6 @@ import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.JsonSerializer;
 import org.apache.kylin.common.persistence.RawResource;
 import org.apache.kylin.common.persistence.ResourceStore;
@@ -173,15 +172,26 @@ public class CubeMigrationCLI {
         checkCLI.execute(cubeName);
     }
 
-    private void checkAndGetHbaseUrl() {
-        StorageURL srcMetadataUrl = srcConfig.getMetadataUrl();
-        StorageURL dstMetadataUrl = dstConfig.getMetadataUrl();
+    private String checkAndGetHbaseUrl() {
+        String srcMetadataUrl = srcConfig.getMetadataUrl();
+        String dstMetadataUrl = dstConfig.getMetadataUrl();
 
         logger.info("src metadata url is " + srcMetadataUrl);
         logger.info("dst metadata url is " + dstMetadataUrl);
 
-        if (!"hbase".equals(srcMetadataUrl.getScheme()) || 
!"hbase".equals(dstMetadataUrl.getScheme()))
+        int srcIndex = srcMetadataUrl.toLowerCase().indexOf("hbase");
+        int dstIndex = dstMetadataUrl.toLowerCase().indexOf("hbase");
+        if (srcIndex < 0 || dstIndex < 0)
             throw new IllegalStateException("Both metadata urls should be 
hbase metadata url");
+
+        String srcHbaseUrl = srcMetadataUrl.substring(srcIndex).trim();
+        String dstHbaseUrl = dstMetadataUrl.substring(dstIndex).trim();
+        if (!srcHbaseUrl.equalsIgnoreCase(dstHbaseUrl)) {
+            throw new IllegalStateException("hbase url not equal! ");
+        }
+
+        logger.info("hbase url is " + srcHbaseUrl.trim());
+        return srcHbaseUrl.trim();
     }
 
     protected void renameFoldersInHdfs(CubeInstance cube) throws IOException {

Reply via email to