Repository: kylin Updated Branches: refs/heads/mhb_test_1 [created] 7405e48fc
KYLIN-1627 add backdoor toggle to dump binary cube storage response for further analysis Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/7405e48f Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/7405e48f Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/7405e48f Branch: refs/heads/mhb_test_1 Commit: 7405e48fcee98e29ffa319e6744eae9825e9ef61 Parents: aebef62 Author: Hongbin Ma <mahong...@apache.org> Authored: Wed Apr 27 10:58:51 2016 +0800 Committer: Hongbin Ma <mahong...@apache.org> Committed: Wed Apr 27 10:59:08 2016 +0800 ---------------------------------------------------------------------- .../kylin/common/debug/BackdoorToggles.java | 14 ++++++++++++++ .../hbase/cube/v2/CubeHBaseEndpointRPC.java | 20 +++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/7405e48f/core-common/src/main/java/org/apache/kylin/common/debug/BackdoorToggles.java ---------------------------------------------------------------------- diff --git a/core-common/src/main/java/org/apache/kylin/common/debug/BackdoorToggles.java b/core-common/src/main/java/org/apache/kylin/common/debug/BackdoorToggles.java index 0feff2d..4a4a2f9 100644 --- a/core-common/src/main/java/org/apache/kylin/common/debug/BackdoorToggles.java +++ b/core-common/src/main/java/org/apache/kylin/common/debug/BackdoorToggles.java @@ -42,6 +42,10 @@ public class BackdoorToggles { return getString(DEBUG_TOGGLE_HBASE_CUBE_QUERY_PROTOCOL); } + public static String getStorageResultDump() { + return getString(DEBUG_TOGGLE_STORAGE_RESULT_DUMP); + } + public static boolean getDisableCache() { return getBoolean(DEBUG_TOGGLE_DISABLE_QUERY_CACHE); } @@ -153,4 +157,14 @@ public class BackdoorToggles { } */ public final static String DEBUG_TOGGLE_QUERY_TIMEOUT = "DEBUG_TOGGLE_QUERY_TIMEOUT"; + + /** + * set DEBUG_TOGGLE_STORAGE_RESULT_DUMP="path_to_dump" to dump the result from cube storage + * + example:(put it into request body) + "backdoorToggles": { + "DEBUG_TOGGLE_STORAGE_RESULT_DUMP": "/kylin/data/" + } + */ + public final static String DEBUG_TOGGLE_STORAGE_RESULT_DUMP = "DEBUG_TOGGLE_STORAGE_RESULT_DUMP"; } http://git-wip-us.apache.org/repos/asf/kylin/blob/7405e48f/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 99a72bb..5d17764 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 @@ -18,6 +18,7 @@ package org.apache.kylin.storage.hbase.cube.v2; +import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Iterator; @@ -36,6 +37,7 @@ import java.util.zip.DataFormatException; import javax.annotation.Nullable; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.NotImplementedException; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.HConnection; @@ -125,11 +127,11 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC { this.timeout = HadoopUtil.getCurrentConfiguration().getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT); this.timeout *= KylinConfig.getInstanceFromEnv().getCubeVisitTimeoutTimes(); - + if (BackdoorToggles.getQueryTimeout() != -1) { this.timeout = BackdoorToggles.getQueryTimeout(); } - + this.timeout *= 1.1;//allow for some delay logger.info("Timeout for ExpectedSizeIterator is: " + this.timeout); @@ -319,6 +321,7 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC { final AtomicInteger totalScannedCount = new AtomicInteger(0); final ExpectedSizeIterator epResultItr = new ExpectedSizeIterator(scanRequests.size() * shardNum); + final AtomicInteger atomicInteger = new AtomicInteger(0); for (final Pair<byte[], byte[]> epRange : getEPKeyRanges(cuboidBaseShard, shardNum, totalShards)) { executorService.submit(new Runnable() { @@ -352,7 +355,17 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC { abnormalFinish = true; } else { try { - epResultItr.append(CompressionUtils.decompress(HBaseZeroCopyByteString.zeroCopyGetBytes(result.getValue().getCompressedRows()))); + int order = atomicInteger.incrementAndGet(); + byte[] compressed = HBaseZeroCopyByteString.zeroCopyGetBytes(result.getValue().getCompressedRows()); + if (BackdoorToggles.getStorageResultDump() != null) { + try { + FileUtils.writeByteArrayToFile(new File(BackdoorToggles.getStorageResultDump() + "/" + order), compressed); + logger.info("write to file for part " + order + " finished"); + } catch (Exception e) { + logger.error("failed to write for part " + order, e); + } + } + epResultItr.append(CompressionUtils.decompress(compressed)); } catch (IOException | DataFormatException e) { throw new RuntimeException(logHeader + "Error when decompressing", e); } @@ -368,6 +381,7 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC { } return new EndpointResultsAsGTScanner(fullGTInfo, epResultItr, scanRequests.get(0).getColumns(), totalScannedCount.get()); + } private String getStatsString(Map.Entry<byte[], CubeVisitProtos.CubeVisitResponse> result) {