Scala Via Spark缺少纱线-卷曲括号绳子 [英] Scala via Spark with yarn - curly brackets string missing

查看:20
本文介绍了Scala Via Spark缺少纱线-卷曲括号绳子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一些Scala代码,代码如下所示。

object myScalaApp {
    def main(args: Array[String]) : Unit = {
        val strJson = args.apply(0)
        println( "strJson : " + strJson)

并从纱线调用此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}

推荐答案

发生此问题的原因是,YAR尝试将命令中的参数扩展标记{{}}替换为对环境变量的引用。

例如,如果您将run_job.sh {{MY_VARIABLE}}传递给纱线,它会将其转换为run_job.sh $MY_VARIABLE,以便使用环境变量。

因此,如果您的命令行中包含嵌套对象的JSON(或其他具有相邻两个大括号的对象),则会发生此问题。这仅在您使用YAR作为主模式和集群部署模式时才会发生。Spark独立模式和纱线客户端模式不受影响。

要解决此问题,可以使用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("{{", "{ {")

您可以在这里看到有问题的纱线代码:

  @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

这篇关于Scala Via Spark缺少纱线-卷曲括号绳子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆