Scala 通过 Spark 与纱线 - 缺少大括号字符串

2023-12-06

我编写了一些 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}


发生此问题的原因是 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 通过 Spark 与纱线 - 缺少大括号字符串 的相关文章