[
https://issues.apache.org/jira/browse/KYLIN-3406?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16718405#comment-16718405
]
ASF GitHub Bot commented on KYLIN-3406:
---------------------------------------
shaofengshi closed pull request #373: KYLIN-3406 Ignore execute output file lose
URL: https://github.com/apache/kylin/pull/373
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/core-job/src/main/java/org/apache/kylin/job/dao/ExecutableDao.java
b/core-job/src/main/java/org/apache/kylin/job/dao/ExecutableDao.java
index 933594247a..6a63ff45be 100644
--- a/core-job/src/main/java/org/apache/kylin/job/dao/ExecutableDao.java
+++ b/core-job/src/main/java/org/apache/kylin/job/dao/ExecutableDao.java
@@ -18,6 +18,7 @@
package org.apache.kylin.job.dao;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
@@ -34,6 +35,7 @@
import org.apache.kylin.job.exception.PersistentException;
import org.apache.kylin.job.execution.AbstractExecutable;
import org.apache.kylin.job.execution.DefaultChainedExecutable;
+import org.apache.kylin.job.execution.ExecutableState;
import org.apache.kylin.metadata.cachesync.Broadcaster;
import org.apache.kylin.metadata.cachesync.CachedCrudAssist;
import org.apache.kylin.metadata.cachesync.CaseInsensitiveStringCache;
@@ -47,7 +49,8 @@
public class ExecutableDao {
private static final Serializer<ExecutablePO> JOB_SERIALIZER = new
JsonSerializer<ExecutablePO>(ExecutablePO.class);
- private static final Serializer<ExecutableOutputPO> JOB_OUTPUT_SERIALIZER
= new JsonSerializer<ExecutableOutputPO>(ExecutableOutputPO.class);
+ private static final Serializer<ExecutableOutputPO> JOB_OUTPUT_SERIALIZER
= new JsonSerializer<ExecutableOutputPO>(
+ ExecutableOutputPO.class);
private static final Logger logger =
LoggerFactory.getLogger(ExecutableDao.class);
public static ExecutableDao getInstance(KylinConfig config) {
@@ -60,7 +63,7 @@ static ExecutableDao newInstance(KylinConfig config) throws
IOException {
}
//
============================================================================
-
+
private ResourceStore store;
private CaseInsensitiveStringCache<ExecutablePO> executableDigestMap;
@@ -76,7 +79,7 @@ static ExecutableDao newInstance(KylinConfig config) throws
IOException {
private AutoReadWriteLock executableOutputDigestMapLock = new
AutoReadWriteLock();
private ExecutableDao(KylinConfig config) throws IOException {
- logger.info("Using metadata url: " + config);
+ logger.info("Using metadata url: {}", config);
this.store = ResourceStore.getStore(config);
this.executableDigestMap = new CaseInsensitiveStringCache<>(config,
"execute");
this.executableDigestCrud = new CachedCrudAssist<ExecutablePO>(store,
ResourceStore.EXECUTE_RESOURCE_ROOT, "",
@@ -86,7 +89,7 @@ public ExecutablePO reloadAt(String path) {
try {
ExecutablePO executablePO = readJobResource(path);
if (executablePO == null) {
- logger.warn("No job found at " + path + ", returning
null");
+ logger.warn("No job found at {}, returning null",
path);
executableDigestMap.removeLocal(resourceName(path));
return null;
}
@@ -114,8 +117,9 @@ protected ExecutablePO initEntityAfterReload(ExecutablePO
entity, String resourc
this.executableDigestCrud.reloadAll();
this.executableOutputDigestMap = new
CaseInsensitiveStringCache<>(config, "execute_output");
- this.executableOutputDigestCrud = new
CachedCrudAssist<ExecutableOutputPO>(store,
ResourceStore.EXECUTE_OUTPUT_RESOURCE_ROOT,
- "", ExecutableOutputPO.class, executableOutputDigestMap,
false) {
+ this.executableOutputDigestCrud = new
CachedCrudAssist<ExecutableOutputPO>(store,
+ ResourceStore.EXECUTE_OUTPUT_RESOURCE_ROOT, "",
ExecutableOutputPO.class, executableOutputDigestMap,
+ false) {
@Override
public void reloadAll() throws IOException {
logger.debug("Reloading execute_output from " +
ResourceStore.EXECUTE_OUTPUT_RESOURCE_ROOT);
@@ -129,8 +133,8 @@ public void reloadAll() throws IOException {
reloadAt(path);
}
- logger.debug("Loaded " + executableOutputDigestMap.size()
+ " execute_output digest(s) out of " + paths.size()
- + " resource");
+ logger.debug("Loaded {} execute_output digest(s) out of {}
resource",
+ executableOutputDigestMap.size(), paths.size());
}
}
@@ -139,7 +143,7 @@ public ExecutableOutputPO reloadAt(String path) {
try {
ExecutableOutputPO executableOutputPO =
readJobOutputResource(path);
if (executableOutputPO == null) {
- logger.warn("No job output found at " + path + ",
returning null");
+ logger.warn("No job output found at {}, returning
null", path);
executableOutputDigestMap.removeLocal(resourceName(path));
return null;
}
@@ -383,8 +387,9 @@ public void deleteJob(String uuid) throws
PersistentException {
}
public ExecutableOutputPO getJobOutput(String uuid) throws
PersistentException {
+ ExecutableOutputPO result = null;
try {
- ExecutableOutputPO result =
readJobOutputResource(pathOfJobOutput(uuid));
+ result = readJobOutputResource(pathOfJobOutput(uuid));
if (result == null) {
result = new ExecutableOutputPO();
result.setUuid(uuid);
@@ -393,7 +398,14 @@ public ExecutableOutputPO getJobOutput(String uuid) throws
PersistentException {
return result;
} catch (IOException e) {
logger.error("error get job output id:" + uuid, e);
- throw new PersistentException(e);
+ if (e.getCause() instanceof FileNotFoundException) {
+ result = new ExecutableOutputPO();
+ result.setUuid(uuid);
+ result.setStatus(ExecutableState.SUCCEED.name());
+ return result;
+ } else {
+ throw new PersistentException(e);
+ }
}
}
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 9e050ef375..14c5ea7cf0 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
@@ -209,8 +209,6 @@ private void visitFolder(String folderPath, VisitFilter
filter, boolean loadCont
}
private void tuneScanParameters(Scan scan) {
- // divide by 10 as some resource like dictionary or snapshot can be
very large
- // scan.setCaching(kylinConfig.getHBaseScanCacheRows() / 10);
scan.setCaching(kylinConfig.getHBaseScanCacheRows());
scan.setMaxResultSize(kylinConfig.getHBaseScanMaxResultSize());
@@ -221,8 +219,7 @@ private void tuneScanParameters(Scan scan) {
void visit(String childPath, String fullPath, Result hbaseResult)
throws IOException;
}
- private RawResource rawResource(String path, Result hbaseResult, boolean
loadContent)
- throws IOException {
+ private RawResource rawResource(String path, Result hbaseResult, boolean
loadContent) {
long lastModified = getTimestamp(hbaseResult);
if (loadContent) {
try {
@@ -304,7 +301,7 @@ protected void putSmallResource(String resPath,
ContentWriter content, long ts)
table.put(put);
- } catch (Throwable ex) {
+ } catch (Exception ex) {
if (pushdown != null)
pushdown.rollback();
throw ex;
@@ -334,8 +331,7 @@ protected long checkAndPutResourceImpl(String resPath,
byte[] content, long oldT
put.addColumn(B_FAMILY, B_COLUMN_TS, Bytes.toBytes(newTS));
boolean ok = table.checkAndPut(row, B_FAMILY, B_COLUMN_TS, bOldTS,
put);
- logger.trace("Update row " + resPath + " from oldTs: " + oldTS +
", to newTs: " + newTS
- + ", operation result: " + ok);
+ logger.trace("Update row {} from oldTs: {}, to newTs: {},
operation result: {}", resPath, oldTS, newTS, ok);
if (!ok) {
long real = getResourceTimestampImpl(resPath);
throw new WriteConflictException(
@@ -344,7 +340,7 @@ protected long checkAndPutResourceImpl(String resPath,
byte[] content, long oldT
return newTS;
- } catch (Throwable ex) {
+ } catch (Exception ex) {
if (pushdown != null)
pushdown.rollback();
throw ex;
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> When the /execute_output/ metadata file sinking to HDFS is deleted, the
> monitoring page does not display any tasks.
> -------------------------------------------------------------------------------------------------------------------
>
> Key: KYLIN-3406
> URL: https://issues.apache.org/jira/browse/KYLIN-3406
> Project: Kylin
> Issue Type: Bug
> Components: Metadata
> Affects Versions: v2.3.1
> Reporter: yujie.sun
> Assignee: XiaoXiang Yu
> Priority: Major
> Fix For: v2.6.0
>
> Attachments: Lost Execute Output.png, Step which lost execute
> output.png, image-2018-12-05-13-22-42-456.png,
> image-2018-12-05-18-45-32-923.png
>
>
> *{color:#24292e}Issue description:{color}*
> When a single file of Hbase metadata is greater than a certain value, the
> file is sunk into HDFS for storage. When files in execute_output/ are deleted
> in HDFS, the monitoring page will not display any tasks.
> *{color:#24292e}Reproduction step:{color}*
> {color:#24292e}1.Use Hbase as metadata storage{color}
> {color:#24292e}2.Modify the hbase configuration ,configure
> "hbase.client.keyvalue.maxsize" into a small value, such as 524288.{color}
> {color:#24292e}3.Create a new build task, after the build task finished,find
> the /execute_output hbase metadata path on HDFS,
> /\{working_dir}/\{metadata_url}/resources/execute_output/..., and delete one
> of the files.{color}
> {color:#24292e}4.At this time,{color:#333333}the monitoring page will not
> display any tasks.{color}{color}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)