package com.alibaba.jstorm.config;
import com.alibaba.jstorm.client.ConfigExtension;
import com.alibaba.jstorm.utils.JStormUtils;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* yarn config black list, note that ONLY plain K-V is supported, list/map values are not supported!!!
*
* @author Cody (weiyue.wy@alibaba-inc.com)
* @since 16/5/26
*/
public class YarnConfigBlacklist implements Refreshable {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private static YarnConfigBlacklist INSTANCE;
private final Splitter NEW_LINE = Splitter.on(Pattern.compile("[\n]"));
private Map conf;
private boolean isJstormOnYarn;
private Set<String> yarnConfigBlackList = new HashSet<>();
private YarnConfigBlacklist(Map conf) {
this.conf = conf;
this.isJstormOnYarn = JStormUtils.parseBoolean(System.getProperty("jstorm-on-yarn"), false) ||
ConfigExtension.isJStormOnYarn(conf);
parseYarnConfigBlackList(this.conf);
if (isJstormOnYarn) {
LOG.info("running jstorm on YARN.");
} else {
LOG.info("running jstorm in standalone mode.");
}
}
public static YarnConfigBlacklist getInstance(Map conf) {
if (INSTANCE == null) {
INSTANCE = new YarnConfigBlacklist(conf);
RefreshableComponents.registerRefreshable(INSTANCE);
}
return INSTANCE;
}
public boolean isJstormOnYarn() {
return isJstormOnYarn;
}
@Override
public void refresh(Map conf) {
parseYarnConfigBlackList(conf);
LOG.info("config blacklist:{}", Joiner.on(",").join(yarnConfigBlackList));
}
private void parseYarnConfigBlackList(Map conf) {
String yarnBlackList = (String) conf.get("jstorm.yarn.conf.blacklist");
if (!StringUtils.isBlank(yarnBlackList)) {
yarnConfigBlackList.clear();
String[] keys = yarnBlackList.split(",");
for (String key : keys) {
key = key.trim();
if (!StringUtils.isBlank(key)) {
yarnConfigBlackList.add(key);
}
}
}
}
public String filterConfigIfNecessary(String confData) {
if (confData == null || !isJstormOnYarn) {
return confData;
}
StringBuilder sb = new StringBuilder(4096);
Iterable<String> lines = splitLines(confData);
for (String line : lines) {
String trimmedLine = line.trim();
if (!trimmedLine.startsWith("#") && trimmedLine.contains(":")) {
String[] parts = trimmedLine.split(":");
if (parts.length >= 2) {
String key = parts[0].trim();
if (yarnConfigBlackList.contains(key)) {
continue;
}
}
}
sb.append(line).append("\n");
}
return sb.toString();
}
public String getRetainedConfig(String confData) {
if (confData == null || !isJstormOnYarn) {
return "";
}
StringBuilder sb = new StringBuilder();
Iterable<String> lines = splitLines(confData);
for (String line : lines) {
String trimmedLine = line.trim();
if (!trimmedLine.startsWith("#") && trimmedLine.contains(":")) {
String[] parts = trimmedLine.split(":");
if (parts.length >= 2) {
String key = parts[0].trim();
if (yarnConfigBlackList.contains(key)) {
sb.append(line).append("\n");
}
}
}
}
return sb.toString();
}
private Iterable<String> splitLines(String confData) {
confData = confData.replace("\r", "");
return NEW_LINE.split(confData);
}
}