You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by ra...@apache.org on 2015/10/09 06:17:41 UTC

[36/50] [abbrv] lens git commit: LENS-576 : Cannot retrieve query results on lens server restart

LENS-576 : Cannot retrieve query results on lens server restart


Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/5bae273e
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/5bae273e
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/5bae273e

Branch: refs/heads/current-release-line
Commit: 5bae273eef68396e42a3678b1182b529c6e42d69
Parents: b2c8fc0
Author: Deepak Barr <de...@gmail.com>
Authored: Fri Sep 25 13:39:44 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Fri Sep 25 13:39:44 2015 +0530

----------------------------------------------------------------------
 .../lens/lib/query/AbstractFileFormatter.java   | 18 +++++
 .../lens/lib/query/WrappedFileFormatter.java    | 13 ++++
 .../lib/query/MockLensResultSetMetadata.java    | 65 +++++++++++++++++
 .../lib/query/TestAbstractFileFormatter.java    | 73 +++++++++++---------
 .../api/driver/LensResultSetMetadata.java       | 49 +++++++++++++
 .../lens/server/api/query/QueryContext.java     |  2 +-
 .../server/api/query/QueryOutputFormatter.java  |  3 +-
 .../lens/server/query/LensPersistentResult.java |  6 +-
 .../server/query/QueryExecutionServiceImpl.java | 39 +----------
 9 files changed, 193 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-query-lib/src/main/java/org/apache/lens/lib/query/AbstractFileFormatter.java
----------------------------------------------------------------------
diff --git a/lens-query-lib/src/main/java/org/apache/lens/lib/query/AbstractFileFormatter.java b/lens-query-lib/src/main/java/org/apache/lens/lib/query/AbstractFileFormatter.java
index ae5af03..8c06621 100644
--- a/lens-query-lib/src/main/java/org/apache/lens/lib/query/AbstractFileFormatter.java
+++ b/lens-query-lib/src/main/java/org/apache/lens/lib/query/AbstractFileFormatter.java
@@ -19,6 +19,8 @@
 package org.apache.lens.lib.query;
 
 import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 
 import org.apache.lens.server.api.driver.LensResultSetMetadata;
 import org.apache.lens.server.api.query.QueryContext;
@@ -90,4 +92,20 @@ public abstract class AbstractFileFormatter extends AbstractOutputFormatter impl
   public String getFinalOutputPath() {
     return finalPath.toString();
   }
+
+  @Override
+  public void writeExternal(ObjectOutput out) throws IOException {
+    out.writeUTF(metadata.toJson());
+    out.writeUTF(finalPath.toString());
+    out.writeInt(numRows);
+    out.writeLong(fileSize);
+  }
+
+  @Override
+  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+    metadata = LensResultSetMetadata.fromJson(in.readUTF());
+    finalPath = new Path(in.readUTF());
+    numRows = in.readInt();
+    fileSize = in.readLong();
+  }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-query-lib/src/main/java/org/apache/lens/lib/query/WrappedFileFormatter.java
----------------------------------------------------------------------
diff --git a/lens-query-lib/src/main/java/org/apache/lens/lib/query/WrappedFileFormatter.java b/lens-query-lib/src/main/java/org/apache/lens/lib/query/WrappedFileFormatter.java
index e28c17b..5910709 100644
--- a/lens-query-lib/src/main/java/org/apache/lens/lib/query/WrappedFileFormatter.java
+++ b/lens-query-lib/src/main/java/org/apache/lens/lib/query/WrappedFileFormatter.java
@@ -19,6 +19,8 @@
 package org.apache.lens.lib.query;
 
 import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 
 import org.apache.lens.server.api.driver.LensResultSetMetadata;
 import org.apache.lens.server.api.query.QueryContext;
@@ -137,4 +139,15 @@ public abstract class WrappedFileFormatter extends AbstractOutputFormatter {
   public String getEncoding() {
     return formatter.getEncoding();
   }
+
+  @Override
+  public void writeExternal(ObjectOutput out) throws IOException {
+    out.writeObject(formatter);
+  }
+
+  @Override
+  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+    formatter = (AbstractFileFormatter) in.readObject();
+    metadata = formatter.getMetadata();
+  }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-query-lib/src/test/java/org/apache/lens/lib/query/MockLensResultSetMetadata.java
----------------------------------------------------------------------
diff --git a/lens-query-lib/src/test/java/org/apache/lens/lib/query/MockLensResultSetMetadata.java b/lens-query-lib/src/test/java/org/apache/lens/lib/query/MockLensResultSetMetadata.java
new file mode 100644
index 0000000..3b6c0e4
--- /dev/null
+++ b/lens-query-lib/src/test/java/org/apache/lens/lib/query/MockLensResultSetMetadata.java
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.lens.lib.query;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lens.server.api.driver.LensResultSetMetadata;
+
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hive.service.cli.ColumnDescriptor;
+
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public class MockLensResultSetMetadata extends LensResultSetMetadata {
+  List<ColumnDescriptor> columns;
+
+  @Override
+  public List<ColumnDescriptor> getColumns() {
+    return columns;
+  }
+
+  public static LensResultSetMetadata createMockedResultSet() {
+    List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
+    columns.add(new ColumnDescriptor(new FieldSchema("firstcol", "int", ""), 0));
+    columns.add(new ColumnDescriptor(new FieldSchema("format(secondcol,2)", "string", ""), 1));
+    columns.add(new ColumnDescriptor(new FieldSchema("thirdcol", "varchar(20)", ""), 2));
+    columns.add(new ColumnDescriptor(new FieldSchema("fourthcol", "char(15)", ""), 3));
+    columns.add(new ColumnDescriptor(new FieldSchema("fifthcol", "array<tinyint>", ""), 4));
+    columns.add(new ColumnDescriptor(new FieldSchema("sixthcol", "struct<a:int,b:varchar(10)>", ""), 5));
+    columns.add(new ColumnDescriptor(new FieldSchema("seventhcol", "map<int,char(10)>", ""), 6));
+    return new MockLensResultSetMetadata(columns);
+  }
+
+  public static LensResultSetMetadata createMockedResultSetWithoutComma() {
+    List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
+    columns.add(new ColumnDescriptor(new FieldSchema("firstcol", "int", ""), 0));
+    columns.add(new ColumnDescriptor(new FieldSchema("secondcol", "string", ""), 1));
+    columns.add(new ColumnDescriptor(new FieldSchema("thirdcol", "varchar(20)", ""), 2));
+    columns.add(new ColumnDescriptor(new FieldSchema("fourthcol", "char(15)", ""), 3));
+    columns.add(new ColumnDescriptor(new FieldSchema("fifthcol", "array<tinyint>", ""), 4));
+    columns.add(new ColumnDescriptor(new FieldSchema("sixthcol", "struct<a:int,b:varchar(10)>", ""), 5));
+    columns.add(new ColumnDescriptor(new FieldSchema("seventhcol", "map<int,char(10)>", ""), 6));
+    return new MockLensResultSetMetadata(columns);
+  }
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-query-lib/src/test/java/org/apache/lens/lib/query/TestAbstractFileFormatter.java
----------------------------------------------------------------------
diff --git a/lens-query-lib/src/test/java/org/apache/lens/lib/query/TestAbstractFileFormatter.java b/lens-query-lib/src/test/java/org/apache/lens/lib/query/TestAbstractFileFormatter.java
index 35d7a00..40e1cdc 100644
--- a/lens-query-lib/src/test/java/org/apache/lens/lib/query/TestAbstractFileFormatter.java
+++ b/lens-query-lib/src/test/java/org/apache/lens/lib/query/TestAbstractFileFormatter.java
@@ -19,8 +19,13 @@
 package org.apache.lens.lib.query;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.zip.ZipEntry;
@@ -37,10 +42,8 @@ import org.apache.lens.server.api.query.QueryContext;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.io.compress.CompressionCodec;
 import org.apache.hadoop.io.compress.CompressionCodecFactory;
-import org.apache.hive.service.cli.ColumnDescriptor;
 
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
@@ -189,6 +192,39 @@ public abstract class TestAbstractFileFormatter {
   }
 
   /**
+   * Test formatter persistence
+   *
+   * @throws IOException Signals that an I/O exception has occurred.
+   */
+  @Test
+  public void testFormatterPersistence() throws IOException, ClassNotFoundException {
+    Configuration conf = new Configuration();
+    setConf(conf);
+    testFormatter(conf, "UTF8", LensConfConstants.RESULT_SET_PARENT_DIR_DEFAULT, ".csv", getMockedResultSet());
+
+    // Write formatter to stream
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    try {
+      new ObjectOutputStream(outputStream).writeObject(formatter);
+    } finally {
+      outputStream.close();
+    }
+    // Create another formatter from the stream
+    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+    WrappedFileFormatter newFormatter = createFormatter();
+    try {
+      newFormatter=(WrappedFileFormatter)new ObjectInputStream(inputStream).readObject();
+    } finally {
+      inputStream.close();
+    }
+
+    Assert.assertEquals(formatter.getFinalOutputPath(), newFormatter.getFinalOutputPath());
+    Assert.assertEquals(formatter.getFileSize(), newFormatter.getFileSize());
+    Assert.assertEquals(formatter.getNumRows(), newFormatter.getNumRows());
+    Assert.assertEquals(formatter.getMetadata().toJson(), newFormatter.getMetadata().toJson());
+  }
+
+  /**
    * Creates the formatter.
    *
    * @return the wrapped file formatter
@@ -265,6 +301,7 @@ public abstract class TestAbstractFileFormatter {
     Assert.assertEquals(finalPath, expectedFinalPath);
     Assert.assertTrue(fs.exists(finalPath));
   }
+
   /**
    * Test formatter.
    *
@@ -356,39 +393,11 @@ public abstract class TestAbstractFileFormatter {
   }
 
   protected LensResultSetMetadata getMockedResultSet() {
-    return new LensResultSetMetadata() {
-
-      @Override
-      public List<ColumnDescriptor> getColumns() {
-        List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
-        columns.add(new ColumnDescriptor(new FieldSchema("firstcol", "int", ""), 0));
-        columns.add(new ColumnDescriptor(new FieldSchema("format(secondcol,2)", "string", ""), 1));
-        columns.add(new ColumnDescriptor(new FieldSchema("thirdcol", "varchar(20)", ""), 2));
-        columns.add(new ColumnDescriptor(new FieldSchema("fourthcol", "char(15)", ""), 3));
-        columns.add(new ColumnDescriptor(new FieldSchema("fifthcol", "array<tinyint>", ""), 4));
-        columns.add(new ColumnDescriptor(new FieldSchema("sixthcol", "struct<a:int,b:varchar(10)>", ""), 5));
-        columns.add(new ColumnDescriptor(new FieldSchema("seventhcol", "map<int,char(10)>", ""), 6));
-        return columns;
-      }
-    };
+    return MockLensResultSetMetadata.createMockedResultSet();
   }
 
   protected LensResultSetMetadata getMockedResultSetWithoutComma() {
-    return new LensResultSetMetadata() {
-
-      @Override
-      public List<ColumnDescriptor> getColumns() {
-        List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
-        columns.add(new ColumnDescriptor(new FieldSchema("firstcol", "int", ""), 0));
-        columns.add(new ColumnDescriptor(new FieldSchema("secondcol", "string", ""), 1));
-        columns.add(new ColumnDescriptor(new FieldSchema("thirdcol", "varchar(20)", ""), 2));
-        columns.add(new ColumnDescriptor(new FieldSchema("fourthcol", "char(15)", ""), 3));
-        columns.add(new ColumnDescriptor(new FieldSchema("fifthcol", "array<tinyint>", ""), 4));
-        columns.add(new ColumnDescriptor(new FieldSchema("sixthcol", "struct<a:int,b:varchar(10)>", ""), 5));
-        columns.add(new ColumnDescriptor(new FieldSchema("seventhcol", "map<int,char(10)>", ""), 6));
-        return columns;
-      }
-    };
+    return MockLensResultSetMetadata.createMockedResultSetWithoutComma();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-server-api/src/main/java/org/apache/lens/server/api/driver/LensResultSetMetadata.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/driver/LensResultSetMetadata.java b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/LensResultSetMetadata.java
index ef8aeed..da90e0a 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/driver/LensResultSetMetadata.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/LensResultSetMetadata.java
@@ -18,6 +18,7 @@
  */
 package org.apache.lens.server.api.driver;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,11 +31,51 @@ import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeInfo;
 import org.apache.hive.service.cli.ColumnDescriptor;
 import org.apache.hive.service.cli.TypeDescriptor;
 
+import org.codehaus.jackson.*;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.codehaus.jackson.map.*;
+import org.codehaus.jackson.map.module.SimpleModule;
+
 /**
  * The Class LensResultSetMetadata.
  */
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
 public abstract class LensResultSetMetadata {
 
+  protected static final ObjectMapper MAPPER;
+
+  /**
+   * Registering custom serializer
+   */
+  static {
+    MAPPER = new ObjectMapper();
+    SimpleModule module = new SimpleModule("HiveColumnModule", new Version(1, 0, 0, null));
+    module.addSerializer(ColumnDescriptor.class, new JsonSerializer<ColumnDescriptor>() {
+      @Override
+      public void serialize(ColumnDescriptor columnDescriptor, JsonGenerator jsonGenerator,
+                            SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
+        jsonGenerator.writeStartObject();
+        jsonGenerator.writeStringField("name", columnDescriptor.getName());
+        jsonGenerator.writeStringField("comment", columnDescriptor.getComment());
+        jsonGenerator.writeNumberField("position", columnDescriptor.getOrdinalPosition());
+        jsonGenerator.writeStringField("type", columnDescriptor.getType().getName());
+        jsonGenerator.writeEndObject();
+      }
+    });
+    module.addDeserializer(ColumnDescriptor.class, new JsonDeserializer<ColumnDescriptor>() {
+      @Override
+      public ColumnDescriptor deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
+        throws IOException {
+        ObjectCodec oc = jsonParser.getCodec();
+        JsonNode node = oc.readTree(jsonParser);
+        org.apache.hive.service.cli.Type t = org.apache.hive.service.cli.Type.getType(node.get("type").asText());
+        return new ColumnDescriptor(node.get("name").asText(), node.get("comment").asText(), new TypeDescriptor(t),
+          node.get("position").asInt());
+      }
+    });
+    MAPPER.registerModule(module);
+  }
+
   public abstract List<ColumnDescriptor> getColumns();
 
   /**
@@ -79,4 +120,12 @@ public abstract class LensResultSetMetadata {
     }
     return typeDesc.getTypeName().toLowerCase();
   }
+
+  public static LensResultSetMetadata fromJson(String json) throws IOException {
+    return MAPPER.readValue(json, LensResultSetMetadata.class);
+  }
+
+  public String toJson() throws IOException {
+    return MAPPER.writeValueAsString(this);
+  }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
index bed79ac..3a5b887 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
@@ -145,7 +145,7 @@ public class QueryContext extends AbstractQueryContext {
 
   @Getter
   @Setter
-  private transient QueryOutputFormatter queryOutputFormatter;
+  private QueryOutputFormatter queryOutputFormatter;
 
   /**
    * The finished query persisted.

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryOutputFormatter.java
----------------------------------------------------------------------
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryOutputFormatter.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryOutputFormatter.java
index 0a6cc6b..a165fe9 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryOutputFormatter.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryOutputFormatter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.lens.server.api.query;
 
+import java.io.Externalizable;
 import java.io.IOException;
 
 import org.apache.lens.server.api.driver.LensResultSetMetadata;
@@ -28,7 +29,7 @@ import org.apache.lens.server.api.driver.LensResultSetMetadata;
  * This is an abstract interface, user should implement {@link InMemoryOutputFormatter} or
  * {@link PersistedOutputFormatter} for formatting the result.
  */
-public interface QueryOutputFormatter {
+public interface QueryOutputFormatter extends Externalizable {
 
   /**
    * Initialize the formatter.

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-server/src/main/java/org/apache/lens/server/query/LensPersistentResult.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/LensPersistentResult.java b/lens-server/src/main/java/org/apache/lens/server/query/LensPersistentResult.java
index 1e9a182..3f24343 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/LensPersistentResult.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/LensPersistentResult.java
@@ -32,8 +32,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 
-import org.codehaus.jackson.map.ObjectMapper;
-
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
@@ -86,10 +84,10 @@ public class LensPersistentResult extends PersistentResultSet {
       ctx.getQueryOutputFormatter().getFileSize(), conf);
   }
 
-  public LensPersistentResult(FinishedLensQuery query, Configuration conf, ObjectMapper mapper) throws
+  public LensPersistentResult(FinishedLensQuery query, Configuration conf) throws
     ClassNotFoundException, IOException {
     this(QueryHandle.fromString(query.getHandle()),
-      mapper.readValue(query.getMetadata(), (Class<LensResultSetMetadata>) Class.forName(query.getMetadataClass())),
+      LensResultSetMetadata.fromJson(query.getMetadata()),
       query.getResult(), query.getRows(), query.getFileSize(), conf);
   }
 

http://git-wip-us.apache.org/repos/asf/lens/blob/5bae273e/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
index 3bc9a4a..ea19742 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java
@@ -79,12 +79,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hive.service.cli.CLIService;
-import org.apache.hive.service.cli.ColumnDescriptor;
-import org.apache.hive.service.cli.TypeDescriptor;
 
-import org.codehaus.jackson.*;
-import org.codehaus.jackson.map.*;
-import org.codehaus.jackson.map.module.SimpleModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -138,11 +133,6 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
   public static final String NAME = "query";
 
   /**
-   * The Constant MAPPER.
-   */
-  private static final ObjectMapper MAPPER = new ObjectMapper();
-
-  /**
    * The accepted queries.
    */
   private FairPriorityBlockingQueue<QueryContext> queuedQueries
@@ -918,7 +908,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
                         Integer rows = set.size();
                         finishedQuery.setMetadataClass(metadata.getClass().getName());
                         finishedQuery.setResult(outputPath);
-                        finishedQuery.setMetadata(MAPPER.writeValueAsString(metadata));
+                        finishedQuery.setMetadata(metadata.toJson());
                         finishedQuery.setRows(rows);
                         finishedQuery.setFileSize(fileSize);
                       }
@@ -1063,31 +1053,6 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
     } catch (Exception e) {
       log.warn("Unable to create finished query table, query purger will not purge queries", e);
     }
-    SimpleModule module = new SimpleModule("HiveColumnModule", new Version(1, 0, 0, null));
-    module.addSerializer(ColumnDescriptor.class, new JsonSerializer<ColumnDescriptor>() {
-      @Override
-      public void serialize(ColumnDescriptor columnDescriptor, JsonGenerator jsonGenerator,
-        SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
-        jsonGenerator.writeStartObject();
-        jsonGenerator.writeStringField("name", columnDescriptor.getName());
-        jsonGenerator.writeStringField("comment", columnDescriptor.getComment());
-        jsonGenerator.writeNumberField("position", columnDescriptor.getOrdinalPosition());
-        jsonGenerator.writeStringField("type", columnDescriptor.getType().getName());
-        jsonGenerator.writeEndObject();
-      }
-    });
-    module.addDeserializer(ColumnDescriptor.class, new JsonDeserializer<ColumnDescriptor>() {
-      @Override
-      public ColumnDescriptor deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
-        throws IOException, JsonProcessingException {
-        ObjectCodec oc = jsonParser.getCodec();
-        JsonNode node = oc.readTree(jsonParser);
-        org.apache.hive.service.cli.Type t = org.apache.hive.service.cli.Type.getType(node.get("type").asText());
-        return new ColumnDescriptor(node.get("name").asText(), node.get("comment").asText(), new TypeDescriptor(t),
-          node.get("position").asInt());
-      }
-    });
-    MAPPER.registerModule(module);
   }
 
   /*
@@ -1423,7 +1388,7 @@ public class QueryExecutionServiceImpl extends BaseLensService implements QueryE
         throw new NotFoundException("InMemory Query result purged " + queryHandle);
       }
       try {
-        return new LensPersistentResult(query, conf, MAPPER);
+        return new LensPersistentResult(query, conf);
       } catch (Exception e) {
         throw new LensException(e);
       }