json - Scala通过带有 yarn 的Spark - 缺少大括号字符串

标签 json scala apache-spark hadoop-yarn curly-braces

我做了一些 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 尝试将命令中的参数扩展标记 {{}} 替换为对环境变量的引用。

例如,如果您将 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

关于json - Scala通过带有 yarn 的Spark - 缺少大括号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43040793/

相关文章:

json - Perl YAML 到 JSON

python - 在 pyspark 中创建一个大字典

apache-spark - 如何在pyspark中获取ArrayType()另一列中某一列的值的索引?

python spark - 根据SQL中的其他数据框行IN子句过滤数据框中的行

javascript - Node.js、Ajax发送和接收Json

javascript - 使用递归对 JSON 进行多级排序和解析

php - 将 3kb 的 json 存储在 cookie 中,作为服务器或数据库中的文件

function - 命名方法和命名函数的定义是什么?

scala - String.format 导致错误

regex - 使用正则表达式检测和转换字符串中的数字