本文介绍了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字符串时
打印在下面(如我所料)
但当我如下所示设置json字符串时
打印在下面
为什么所有右大括号都消失了?
额外样本
%1
2
推荐答案
发生此问题的原因是,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缺少纱线-卷曲括号绳子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!