使用 Shell 脚本文件提交 Spark 作业

Posted

技术标签:

【中文标题】使用 Shell 脚本文件提交 Spark 作业【英文标题】:Submitting a Spark job using Shell script file 【发布时间】:2017-11-29 20:26:45 【问题描述】:

我正在尝试从 shell 脚本提交 Spark 作业。

它是一个简单的脚本,只有 spark-submit 命令。我试图通过 spark-submit 命令为我的 Main 函数提供一个参数,但是当我尝试执行 shell 文件时,作业失败并出现错误:

scala.MatchError: rma (of class java.lang.String) 

因为我在我的代码中使用了匹配大小写。

这是我的 Shell 脚本的内容

    #adsName=$1
    spark-submit --class TestQuery --master yarn --deploy-mode cluster \
--driver-memory 12G --executor-memory 8G --executor-cores 4 \
--num-executors 100 --files /opt/mapr/spark/spark-2.1.0/conf/hive-site.xml \
--jars /users/myuser/config-1.2.0.jar \
/users/myuser/jars/adsoptimization_2.11-0.1.jar \
xyz

所以'xyz'是我在命令中传递的字符串。目前我已经硬编码它仍然无法正常工作我想动态地将它作为参数传递给 shell 文件。

我在main函数中的代码:

args(0) match  
  case "str1" => TestQuery(spark).runstr1
  case "xyz" => TestQuery(spark).runxyz
  case "str2" => TestQuery(spark).runstr2
  case "str3" => TestQuery(spark).runstr3

所以我传递的“xyz”字符串将出现在 args(0) 中(然后我通过将 spark 会话对象作为 args 传递来调用我的案例类中定义的函数)

所以这里的问题是如何简单地通过 shell 脚本运行 spark 作业

【问题讨论】:

你能做args.foreach(println) before模式匹配表达式吗?您将知道传递为 args 的内容。另外,用SPARK_PRINT_LAUNCH_COMMAND=1 启动你的shell 脚本,看看spark-submit 究竟执行了什么。这应该足以让您找到根本原因。 【参考方案1】:

当您传入一个没有匹配模式的值时,就会出现该错误。你通过了rma,但你没有理由这样做。只需添加这个...

args(0) match  
  case "str1" => TestQuery(spark).runstr1
  case "xyz" => TestQuery(spark).runxyz
  case "str2" => TestQuery(spark).runstr2
  case "str3" => TestQuery(spark).runstr3
  case _ => TestQuery(spark).someDefaultDefined

【讨论】:

我可以看到您的 spark-submit 没有任何问题。而且你的错误很容易通过给出一个没有匹配模式的值来复制。也许你的 args(0) 没有捕捉到任何东西,你应该使用调试器,或者你可以打印出 args(0) 老派风格的内容。然后我们可以进一步研究它。实际上你可以发布你的整个主要方法吗? 没关系。我可以通过将结果或 agrs(0) 放入 val 然后匹配它来解决这个问题 这就是我的想法,但你说这是正确的论点。请不要忘记标记答案

以上是关于使用 Shell 脚本文件提交 Spark 作业的主要内容,如果未能解决你的问题,请参考以下文章

CDH集群提交Spark作业原理及过程分析

Spark-submit提交任务,封装shell脚本,shell脚本创建HBase表,批量导hive表

spark提交参数解析

提交jar时的Scala-Spark NullPointerError,而不是在shell中

CDH集群spark-shell执行过程分析

windows上spark shell读取本地文件