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

Reuben Kuhnert commented on HIVE-12891:
---------------------------------------

The problem that this patch addresses is that the value of 'java.io.tmpdir' can 
be set externally to be a relative path (we're seeing this problem occur in 
oozie). To adjust for this issue, the above patch uses 'Coercion' to 
validate/modify the value before passing it to the user. That is, rather than 
simply creating a one-off coercion, I thought it would be useful in general to 
have a way to hook into {{SystemVariables.substitute}} to validate or adjust 
the property before returning to the user.

The template is:

{code}
public abstract class VariableCoercion {
  private final String name;

  public VariableCoercion(String name) {
    this.name = name;
  }

  public String getName() { return this.name; }
  public abstract String getCoerced(Configuration configuration, String 
originalValue);
  public abstract String setCoerced(Configuration configuration, String 
originalValue);
}
{code}

where {{getCoerced}} is called on get and {{setCoerced}} is called on set 
(configuration is passed in if the coerced value is context sensitive). In 
addition, to add other coercions, simply subclass the above and add it here:

{code}
public class SystemVariables {
  ...
  // HERE: List of coercions:
  private static final VariableCoercionSet COERCIONS = new VariableCoercionSet()
    .add(new JavaIOTmpdirVariableCoercion());
{code}

If a coercion hook exists for a particular name (see 
{{VariableCoercion.getName()}}) then it is loaded and the raw value is passed 
through, then returned to the user:

{code}
  public String getCoerced(Configuration configuration, String variableName, 
String originalValue) {
    if (COERCIONS.contains(variableName)) {
      return COERCIONS.get(variableName).getCoerced(configuration, 
originalValue);
    } else {
      return originalValue;
    }
  }
{code}

> Hive fails when java.io.tmpdir is set to a relative location
> ------------------------------------------------------------
>
>                 Key: HIVE-12891
>                 URL: https://issues.apache.org/jira/browse/HIVE-12891
>             Project: Hive
>          Issue Type: Bug
>            Reporter: Reuben Kuhnert
>            Assignee: Reuben Kuhnert
>         Attachments: HIVE-12891.01.19.2016.01.patch, HIVE-12891.03.patch, 
> HIVE-12981.01.22.2016.02.patch
>
>
> The function {{SessionState.createSessionDirs}} fails when trying to create 
> directories where {{java.io.tmpdir}} is set to a relative location.
> {code}
> \[uber-SubtaskRunner] ERROR o.a.h.hive..ql.Driver - FAILED: 
> IllegalArgumentException java.net.URISyntaxException: Relative path in 
> absolute URI: 
> file:./tmp/<user>/<guid>/hive_2015_12_11_09-12-25_352_4325234652356-1
> ...
> Minor variations:
> \[uber-SubtaskRunner] ERROR o.a.h.hive..ql.Driver - FAILED: SemanticException 
> Exception while processing Exception while writing out the local file 
> o.a.h.hive.ql/parse.SemanticException: Exception while processing exception 
> while writing out local file 
> ... 
> caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: 
> Relative path in absolute URI: 
> file:./tmp/<user>/<guid>/hive_2015_12_11_09-12-25_352_4325234652356-1 
> at o.a.h.fs.Path.initialize (206) 
> at o.a.h.fs.Path.<init>(197)... 
> at o.a.h.hive.ql.context.getScratchDir(267) 
> {code}



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

Reply via email to