发生此问题的原因是 YARN 尝试替换参数扩展标记的方式{{
and }}
在您的命令中引用环境变量。
例如,如果您通过run_job.sh {{MY_VARIABLE}}
YARN 会将其转换为run_job.sh $MY_VARIABLE
这样就可以使用该环境变量了。
因此,如果您的命令行中包含带有嵌套对象的 JSON(或其他彼此相邻的两个大括号的内容),就会出现此问题。仅当您使用 YARN 作为主节点和集群部署模式时才会发生这种情况。 Spark 独立模式和 YARN 客户端模式不受影响。
要解决此问题,请使用 JSON 以外的其他数据格式,或者确保没有两个彼此相邻的花括号。
例如,使用 Python,您可以像这样快速解决此问题:
def fix_json_for_yarn(json_string):
# See https://issues.apache.org/jira/browse/SPARK-17814
# Due to that YARN bug we need to make sure that our json string
# doesn't contain {{ or }} because those get replaced by YARN.
return json_string.replace("}}", "} }").replace("{{", "{ {")
您可以在此处查看有问题的 YARN 代码:
@VisibleForTesting
public static String expandEnvironment(String var,
Path containerLogDir) {
var = var.replace(ApplicationConstants.LOG_DIR_EXPANSION_VAR,
containerLogDir.toString());
var = var.replace(ApplicationConstants.CLASS_PATH_SEPARATOR,
File.pathSeparator);
// replace parameter expansion marker. e.g. {{VAR}} on Windows is replaced
// as %VAR% and on Linux replaced as "$VAR"
if (Shell.WINDOWS) {
var = var.replaceAll("(\\{\\{)|(\\}\\})", "%");
} else {
var = var.replace(ApplicationConstants.PARAMETER_EXPANSION_LEFT, "$");
var = var.replace(ApplicationConstants.PARAMETER_EXPANSION_RIGHT, "");
}
return var;
}
请参阅此处的问题票证:https://issues.apache.org/jira/browse/SPARK-17814