You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@kylin.apache.org by "liyang (JIRA)" <ji...@apache.org> on 2016/11/09 09:31:58 UTC

[jira] [Commented] (KYLIN-2170) Mapper/Reducer cleanup() exception handling

    [ https://issues.apache.org/jira/browse/KYLIN-2170?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15650446#comment-15650446 ] 

liyang commented on KYLIN-2170:
-------------------------------

Mapper/Reducer is doomed by a classic exception handling problem. E.g. the below Reducer code, if both reduce() and cleanup() throws exceptions, A will be discarded and only B is reported, losing a root cause. Some suggest never throw exception in cleanup() (in the finally block), then job can falsely succeed when there is no A and only B occurs.

Seems the only solution is log-and-throw in both map()/reduce() and cleanup(), then in all cases, all exceptions are logged and job will fail on error.

We are refactoring {{KylinMapper}} and {{KylinReducer}} to enforce this design.

{code}
  public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    try {
      while (context.nextKey()) {
        reduce(context.getCurrentKey(), context.getValues(), context);  // <======= Exception A
        // If a back up store is used, reset it
        Iterator<VALUEIN> iter = context.getValues().iterator();
        if(iter instanceof ReduceContext.ValueIterator) {
          ((ReduceContext.ValueIterator<VALUEIN>)iter).resetBackupStore();        
        }
      }
    } finally {
      cleanup(context); // <====== Exception B
    }
  }
{code}

> Mapper/Reducer cleanup() exception handling
> -------------------------------------------
>
>                 Key: KYLIN-2170
>                 URL: https://issues.apache.org/jira/browse/KYLIN-2170
>             Project: Kylin
>          Issue Type: Improvement
>            Reporter: liyang
>
> Or it could override the real exception happened in mapper() or reducer()



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)