HDFS-9724. Degraded performance in WebHDFS listing as it does not reuse ObjectMapper. Contributed by Akira Ajisaka.

This commit is contained in:
Haohui Mai 2016-02-04 11:28:45 -08:00
parent c10bf788eb
commit cb3aa41f53
3 changed files with 19 additions and 13 deletions

View File

@ -89,6 +89,9 @@ Release 2.7.3 - UNRELEASED
HDFS-9730. Storage ID update does not happen when there is a layout change
(Tsz Wo Nicholas Sze via kihwal)
HDFS-9724. Degraded performance in WebHDFS listing as it does not reuse
ObjectMapper. (Akira AJISAKA via wheat9)
Release 2.7.2 - 2016-01-25
INCOMPATIBLE CHANGES

View File

@ -50,6 +50,12 @@ public class JsonUtil {
private static final Object[] EMPTY_OBJECT_ARRAY = {};
private static final DatanodeInfo[] EMPTY_DATANODE_INFO_ARRAY = {};
// Reuse ObjectMapper instance for improving performance.
// ObjectMapper is thread safe as long as we always configure instance
// before use. We don't have a re-entrant call pattern in WebHDFS,
// so we just need to worry about thread-safety.
private static final ObjectMapper MAPPER = new ObjectMapper();
/** Convert a token object to a Json string. */
public static String toJsonString(final Token<? extends TokenIdentifier> token
) throws IOException {
@ -120,9 +126,8 @@ public class JsonUtil {
public static String toJsonString(final String key, final Object value) {
final Map<String, Object> m = new TreeMap<String, Object>();
m.put(key, value);
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(m);
return MAPPER.writeValueAsString(m);
} catch (IOException ignored) {
}
return null;
@ -185,10 +190,9 @@ public class JsonUtil {
m.put("fileId", status.getFileId());
m.put("childrenNum", status.getChildrenNum());
m.put("storagePolicy", status.getStoragePolicy());
ObjectMapper mapper = new ObjectMapper();
try {
return includeType ?
toJsonString(FileStatus.class, m) : mapper.writeValueAsString(m);
toJsonString(FileStatus.class, m) : MAPPER.writeValueAsString(m);
} catch (IOException ignored) {
}
return null;
@ -644,9 +648,8 @@ public class JsonUtil {
new TreeMap<String, Map<String, Object>>();
finalMap.put(AclStatus.class.getSimpleName(), m);
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(finalMap);
return MAPPER.writeValueAsString(finalMap);
} catch (IOException ignored) {
}
return null;
@ -713,8 +716,7 @@ public class JsonUtil {
final XAttrCodec encoding) throws IOException {
final Map<String, Object> finalMap = new TreeMap<String, Object>();
finalMap.put("XAttrs", toJsonArray(xAttrs, encoding));
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(finalMap);
return MAPPER.writeValueAsString(finalMap);
}
public static String toJsonString(final List<XAttr> xAttrs)
@ -723,11 +725,10 @@ public class JsonUtil {
for (XAttr xAttr : xAttrs) {
names.add(XAttrHelper.getPrefixName(xAttr));
}
ObjectMapper mapper = new ObjectMapper();
String ret = mapper.writeValueAsString(names);
String ret = MAPPER.writeValueAsString(names);
final Map<String, Object> finalMap = new TreeMap<String, Object>();
finalMap.put("XAttrNames", ret);
return mapper.writeValueAsString(finalMap);
return MAPPER.writeValueAsString(finalMap);
}
public static byte[] getXAttr(final Map<?, ?> json, final String name)

View File

@ -88,6 +88,7 @@ import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSelect
import org.apache.hadoop.util.Progressable;
import org.apache.hadoop.util.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
@ -125,6 +126,8 @@ public class WebHdfsFileSystem extends FileSystem
private InetSocketAddress nnAddrs[];
private int currentNNAddrIndex;
private boolean disallowFallbackToInsecureCluster;
private static final ObjectReader READER =
new ObjectMapper().reader(Map.class);
/**
* Return the protocol scheme for the FileSystem.
@ -329,8 +332,7 @@ public class WebHdfsFileSystem extends FileSystem
+ "\" (parsed=\"" + parsed + "\")");
}
}
ObjectMapper mapper = new ObjectMapper();
return mapper.reader(Map.class).readValue(in);
return READER.readValue(in);
} finally {
in.close();
}