我制作了一些scala代码,它看起来像这样。
object myScalaApp {
def main(args: Array[String]) : Unit = {
val strJson = args.apply(0)
println( "strJson : " + strJson)
并从yarn调用此scala jar文件。
Process spark = new SparkLauncher()
.setAppResource("/usr/local/myJar/myApp.jar")
.setMainClass("com.myScalaApp")
.setMaster("yarn")
.setDeployMode( "cluster")
.addAppArgs( data)
.launch();
当我设置如下的json字符串时
{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”}
它打印在下面(正如我所料)
strJson:{“aaa”:“a1111”,“bbbb”:“b1111”}
但是我在下面设置了json字符串
{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”,\“ccc \”:{\“c1 \”: \ “C111 \”}}
它打印在
下面strJson:{“aaa”:“a1111”,“bbbb”:“b1111”,“ccc”:{“c1”:“c111”
为什么所有关闭的花括号都会消失?
额外样本
1
\“{\”aaa \“:\”a1111 \“,\”bbbb \“:\”b1111 \“,\”ccc \“:{\”c1 \“: \ “C111 \”}} \“
strJson:“{”aaa“:”a1111“,”bbbb“:”b1111“,”ccc“:{”c1“:”c111“”
2
{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”,\“ccc \”:{\“c1 \”: \ “C111 \”} A} strJson:{“aaa”:“a1111”,“bbbb”:“b1111”,“ccc”:{“c1”:“c111”} a}
答案 0 :(得分:5)
出现此问题的原因是YARN尝试使用对环境变量的引用替换命令中的参数扩展标记{{
和}}
。
例如,如果您将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;
}
答案 1 :(得分:1)
我认为你错过了字符串开头和结尾的双引号。 请尝试使用双引号
"{\"aaa\" : \"a1111\",\"bbbb\" : \"b1111\",\"ccc\" : {\"c1\" : \"c111\"} }";
答案 2 :(得分:0)
为什么不使用三重报价?
""" {" AAA" :" a1111"," bbbb" :" b1111"," ccc" :{" c1" :" c111"}}"""
它更容易阅读,并将解决您的问题。
答案 3 :(得分:0)
我仍然不确定为什么会发生这种情况,但可以通过增加的空间来解决这个问题。在下面的大括号之间。
}} - > }}