This is an automated email from the ASF dual-hosted git repository. xxyu pushed a commit to branch kylin-on-parquet-v2 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit f48a0321b314e63516ac1a0774d68b3836ba5978 Author: Zhichao Zhang <441586...@qq.com> AuthorDate: Tue Sep 1 16:05:09 2020 +0800 KYLIN-4733 The cube size is inconsistent with the size of all segments --- .../kylin/engine/spark/utils/BuildUtils.scala | 3 +- .../kylin/rest/controller/CubeController.java | 45 ++++++++++++---------- .../{HBaseResponse.java => StorageResponse.java} | 4 +- .../org/apache/kylin/rest/service/CubeService.java | 33 ++++++++-------- .../apache/kylin/rest/service/HBaseInfoUtil.java | 6 +-- webapp/app/js/controllers/cube.js | 4 +- webapp/app/js/filters/filter.js | 4 +- webapp/app/js/services/cubes.js | 2 +- webapp/app/partials/cubes/cube_detail.html | 2 +- 9 files changed, 54 insertions(+), 49 deletions(-) diff --git a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/BuildUtils.scala b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/BuildUtils.scala index 980c4b3..4d0db98 100644 --- a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/BuildUtils.scala +++ b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/BuildUtils.scala @@ -81,7 +81,8 @@ object BuildUtils extends Logging { @throws[IOException] def fillCuboidInfo(cuboid: LayoutEntity, strPath: String): Unit = { val fs = HadoopUtil.getWorkingFileSystem - if (fs.exists(new Path(strPath))) { + // when cuboid.getRows == 0, it means there is no data written, so set byte size to 0 + if (fs.exists(new Path(strPath)) && (cuboid.getRows > 0)) { val cs = HadoopUtil.getContentSummary(fs, new Path(strPath)) cuboid.setFileCount(cs.getFileCount) cuboid.setByteSize(cs.getLength) diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java index aac0b47..a8f59f3 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java @@ -72,7 +72,7 @@ import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.response.CuboidTreeResponse; import org.apache.kylin.rest.response.EnvelopeResponse; import org.apache.kylin.rest.response.GeneralResponse; -import org.apache.kylin.rest.response.HBaseResponse; +import org.apache.kylin.rest.response.StorageResponse; import org.apache.kylin.rest.response.ResponseCode; import org.apache.kylin.rest.service.CubeService; import org.apache.kylin.rest.service.JobService; @@ -713,15 +713,16 @@ public class CubeController extends BasicController { } /** - * get Hbase Info + * get storage Info * * @return true * @throws IOException */ - @RequestMapping(value = "/{cubeName}/hbase", method = { RequestMethod.GET }, produces = { "application/json" }) + @RequestMapping(value = "/{cubeName}/storage", method = { RequestMethod.GET }, produces = { + "application/json" }) @ResponseBody - public List<HBaseResponse> getHBaseInfo(@PathVariable String cubeName) { - List<HBaseResponse> hbase = new ArrayList<HBaseResponse>(); + public List<StorageResponse> getStorageInfo(@PathVariable String cubeName) { + List<StorageResponse> storage = new ArrayList<StorageResponse>(); CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); if (null == cube) { @@ -733,38 +734,40 @@ public class CubeController extends BasicController { for (CubeSegment segment : segments) { Map<String, String> addInfo = segment.getAdditionalInfo(); String tableName = segment.getStorageLocationIdentifier(); - HBaseResponse hr = null; + StorageResponse sr = null; if (("" + IStorageAware.ID_PARQUET).equals(addInfo.get("storageType"))) { - hr = new HBaseResponse(); - hr.setStorageType("parquet"); + sr = new StorageResponse(); + sr.setStorageType("parquet"); + // unit: Byte + sr.setTableSize(segment.getSizeKB() * 1024); } else { // Get info of given table. try { - hr = cubeService.getHTableInfo(cubeName, tableName); + sr = cubeService.getHTableInfo(cubeName, tableName); } catch (IOException e) { logger.error("Failed to calcuate size of HTable \"" + tableName + "\".", e); } - if (null == hr) { + if (null == sr) { logger.info("Failed to calcuate size of HTable \"" + tableName + "\"."); - hr = new HBaseResponse(); + sr = new StorageResponse(); } } - hr.setTableName(tableName); - hr.setDateRangeStart(segment.getTSRange().start.v); - hr.setDateRangeEnd(segment.getTSRange().end.v); - hr.setSegmentName(segment.getName()); - hr.setSegmentStatus(segment.getStatus().toString()); - hr.setSourceCount(segment.getInputRecords()); + sr.setTableName(tableName); + sr.setDateRangeStart(segment.getTSRange().start.v); + sr.setDateRangeEnd(segment.getTSRange().end.v); + sr.setSegmentName(segment.getName()); + sr.setSegmentStatus(segment.getStatus().toString()); + sr.setSourceCount(segment.getInputRecords()); if (segment.isOffsetCube()) { - hr.setSourceOffsetStart((Long) segment.getSegRange().start.v); - hr.setSourceOffsetEnd((Long) segment.getSegRange().end.v); + sr.setSourceOffsetStart((Long) segment.getSegRange().start.v); + sr.setSourceOffsetEnd((Long) segment.getSegRange().end.v); } - hbase.add(hr); + storage.add(sr); } - return hbase; + return storage; } /** diff --git a/server-base/src/main/java/org/apache/kylin/rest/response/HBaseResponse.java b/server-base/src/main/java/org/apache/kylin/rest/response/StorageResponse.java similarity index 97% rename from server-base/src/main/java/org/apache/kylin/rest/response/HBaseResponse.java rename to server-base/src/main/java/org/apache/kylin/rest/response/StorageResponse.java index cb2a108..30784b5 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/response/HBaseResponse.java +++ b/server-base/src/main/java/org/apache/kylin/rest/response/StorageResponse.java @@ -20,7 +20,7 @@ package org.apache.kylin.rest.response; import java.io.Serializable; -public class HBaseResponse implements Serializable { +public class StorageResponse implements Serializable { private static final long serialVersionUID = 7263557115683263492L; private String storageType; private String segmentName; @@ -35,7 +35,7 @@ public class HBaseResponse implements Serializable { private long sourceOffsetEnd; private long sourceCount; - public HBaseResponse() { + public StorageResponse() { } public String getStorageType() { diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java index b50bdc0..d286cfd 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java @@ -82,7 +82,7 @@ import org.apache.kylin.rest.request.PrepareSqlRequest; import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.response.CuboidTreeResponse; import org.apache.kylin.rest.response.CuboidTreeResponse.NodeInfo; -import org.apache.kylin.rest.response.HBaseResponse; +import org.apache.kylin.rest.response.StorageResponse; import org.apache.kylin.rest.response.MetricsResponse; import org.apache.kylin.rest.util.AclEvaluate; import org.apache.kylin.rest.util.ValidateUtil; @@ -113,7 +113,7 @@ public class CubeService extends BasicService implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(CubeService.class); - protected Cache<String, HBaseResponse> htableInfoCache = CacheBuilder.newBuilder().build(); + protected Cache<String, StorageResponse> storageInfoCache = CacheBuilder.newBuilder().build(); @Autowired @Qualifier("projectService") @@ -530,18 +530,18 @@ public class CubeService extends BasicService implements InitializingBean { * table. * * @param tableName The table name. - * @return The HBaseResponse object contains table size, region count. null + * @return The StorageResponse object contains table size, region count. null * if error happens * @throws IOException Exception when HTable resource is not closed correctly. */ - public HBaseResponse getHTableInfo(String cubeName, String tableName) throws IOException { + public StorageResponse getHTableInfo(String cubeName, String tableName) throws IOException { String key = cubeName + "/" + tableName; - HBaseResponse hr = htableInfoCache.getIfPresent(key); - if (null != hr) { - return hr; + StorageResponse sr = storageInfoCache.getIfPresent(key); + if (null != sr) { + return sr; } - hr = new HBaseResponse(); + sr = new StorageResponse(); CubeInstance cube = CubeManager.getInstance(getConfig()).getCube(cubeName); if (cube.getStorageType() == IStorageAware.ID_HBASE || cube.getStorageType() == IStorageAware.ID_SHARDED_HBASE || cube.getStorageType() == IStorageAware.ID_REALTIME_AND_HBASE) { @@ -549,17 +549,18 @@ public class CubeService extends BasicService implements InitializingBean { logger.debug("Loading HTable info " + cubeName + ", " + tableName); // use reflection to isolate NoClassDef errors when HBase is not available - hr = (HBaseResponse) Class.forName("org.apache.kylin.rest.service.HBaseInfoUtil")// - .getMethod("getHBaseInfo", new Class[] { String.class, KylinConfig.class })// + sr = (StorageResponse) + Class.forName("org.apache.kylin.rest.service.HBaseInfoUtil") + .getMethod("getHBaseInfo", new Class[] { String.class, KylinConfig.class }) .invoke(null, tableName, this.getConfig()); - hr.setStorageType("hbase"); + sr.setStorageType("hbase"); } catch (Throwable e) { throw new IOException(e); } } - htableInfoCache.put(key, hr); - return hr; + storageInfoCache.put(key, sr); + return sr; } public void updateCubeNotifyList(CubeInstance cube, List<String> notifyList) throws IOException { @@ -1133,7 +1134,7 @@ public class CubeService extends BasicService implements InitializingBean { private class HTableInfoSyncListener extends Broadcaster.Listener { @Override public void onClearAll(Broadcaster broadcaster) throws IOException { - htableInfoCache.invalidateAll(); + storageInfoCache.invalidateAll(); } @Override @@ -1141,9 +1142,9 @@ public class CubeService extends BasicService implements InitializingBean { throws IOException { String cubeName = cacheKey; String keyPrefix = cubeName + "/"; - for (String k : htableInfoCache.asMap().keySet()) { + for (String k : storageInfoCache.asMap().keySet()) { if (k.startsWith(keyPrefix)) - htableInfoCache.invalidate(k); + storageInfoCache.invalidate(k); } } } diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/HBaseInfoUtil.java b/server-base/src/main/java/org/apache/kylin/rest/service/HBaseInfoUtil.java index e984295..76ddbc0 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/HBaseInfoUtil.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/HBaseInfoUtil.java @@ -21,12 +21,12 @@ package org.apache.kylin.rest.service; public class HBaseInfoUtil { // @SuppressWarnings("unused") // used by reflection -// public static HBaseResponse getHBaseInfo(String tableName, KylinConfig config) throws IOException { +// public static StorageResponse getHBaseInfo(String tableName, KylinConfig config) throws IOException { // if (!config.getStorageUrl().getScheme().equals("hbase")) // return null; // // Connection conn = HBaseUnionUtil.getConnection(config, tableName); -// HBaseResponse hr = null; +// StorageResponse hr = null; // long tableSize = 0; // int regionCount = 0; // @@ -40,7 +40,7 @@ public class HBaseInfoUtil { // regionCount = sizeMap.size(); // // // Set response. -// hr = new HBaseResponse(); +// hr = new StorageResponse(); // hr.setTableSize(tableSize); // hr.setRegionCount(regionCount); // return hr; diff --git a/webapp/app/js/controllers/cube.js b/webapp/app/js/controllers/cube.js index 0d48dbc..60df772 100755 --- a/webapp/app/js/controllers/cube.js +++ b/webapp/app/js/controllers/cube.js @@ -88,9 +88,9 @@ KylinApp.controller('CubeCtrl', function ($scope, $rootScope, AccessService, Mes }); }; - $scope.getHbaseInfo = function (cube) { + $scope.getStorageInfo = function (cube) { if (!cube.hbase) { - CubeService.getHbaseInfo({cubeId: cube.name, propValue: null, action: null}, function (hbase) { + CubeService.getStorageInfo({cubeId: cube.name, propValue: null, action: null}, function (hbase) { cube.hbase = hbase; TableService.get({pro:cube.model.project, tableName:cube.model.fact_table},function(table) { if (table && table.source_type == 1) { diff --git a/webapp/app/js/filters/filter.js b/webapp/app/js/filters/filter.js index 0f8382d..a239c17 100755 --- a/webapp/app/js/filters/filter.js +++ b/webapp/app/js/filters/filter.js @@ -87,7 +87,7 @@ KylinApp .filter('bytes', function () { return function (bytes, precision) { if (bytes === 0) { - return 'less than 1 MB'; + return '0 KB'; } if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) { return '-'; @@ -97,7 +97,7 @@ KylinApp precision = 3; } - var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], + var units = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'], number = Math.floor(Math.log(bytes) / Math.log(1024)); switch(number){ case 0: diff --git a/webapp/app/js/services/cubes.js b/webapp/app/js/services/cubes.js index 52cb8fe..53f490d 100644 --- a/webapp/app/js/services/cubes.js +++ b/webapp/app/js/services/cubes.js @@ -54,7 +54,7 @@ KylinApp.factory('CubeService', ['$resource', function ($resource, config) { drop: {method: 'DELETE', params: {}, isArray: false}, save: {method: 'POST', params: {}, isArray: false}, update: {method: 'PUT', params: {}, isArray: false}, - getHbaseInfo: {method: 'GET', params: {propName: 'hbase'}, isArray: true}, + getStorageInfo: {method: 'GET', params: {propName: 'storage'}, isArray: true}, getCurrentCuboids: { method: 'GET', params: { diff --git a/webapp/app/partials/cubes/cube_detail.html b/webapp/app/partials/cubes/cube_detail.html index 7cb0351..0076069 100755 --- a/webapp/app/partials/cubes/cube_detail.html +++ b/webapp/app/partials/cubes/cube_detail.html @@ -39,7 +39,7 @@ </li> <li class="{{cube.visiblePage=='hbase'? 'active':''}}" ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission('cube' ,cube, permissions.ADMINISTRATION.mask) && !newAccess"> - <a href="" ng-click="cube.visiblePage='hbase';getHbaseInfo(cube)">Storage</a> + <a href="" ng-click="cube.visiblePage='hbase';getStorageInfo(cube)">Storage</a> </li> <li class="{{cube.visiblePage=='planner'? 'active':''}}" ng-if="(userService.hasRole('ROLE_ADMIN') || hasPermission('cube', cube, permissions.ADMINISTRATION.mask) && !newAccess) && isShowCubeplanner && cube.detail.engine_type != 6"> <a href="" ng-click="cube.visiblePage='planner';getCubePlanner(cube);">Planner</a>