如何从 shell 脚本中捕获 Spark 错误

Posted

技术标签:

【中文标题】如何从 shell 脚本中捕获 Spark 错误【英文标题】:How to catch Spark error from shell script 【发布时间】:2020-05-26 22:25:51 【问题描述】:

我在 AWS Data Pipeline 中有一个运行名为 shell.sh 的 shell 脚本的管道:

$ spark-submit transform_json.py


Running command on cluster...
[54.144.10.162] Running command...
[52.206.87.30] Running command...
[54.144.10.162] Command complete.
[52.206.87.30] Command complete.
run_command finished in 0:00:06.

AWS Data Pipeline 控制台显示该作业已“完成”,但在 stderr 日志中我看到该作业实际上已中止:

Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 404, AWS Service: Amazon S3, AWS Request ID: xxxxx, AWS Error Code: null, AWS Error Message: Not Found...        
Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 5.0 failed 1 times, most recent failure: Lost task 0.0 in stage 5.0 (TID 5, localhost, executor driver): org.apache.spark.SparkException: Task failed while writing rows.
    ...
        20/05/22 11:42:47 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
        20/05/22 11:42:47 INFO MemoryStore: MemoryStore cleared
        20/05/22 11:42:47 INFO BlockManager: BlockManager stopped
        20/05/22 11:42:47 INFO BlockManagerMaster: BlockManagerMaster stopped
        20/05/22 11:42:47 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
        20/05/22 11:42:47 INFO SparkContext: Successfully stopped SparkContext
        20/05/22 11:42:47 INFO ShutdownHookManager: Shutdown hook called

我对数据管道和 Spark 有点陌生;无法理解幕后实际发生的事情。如何让 shell 脚本捕获 SparkException

【问题讨论】:

你检查***.com/questions/36034928/…了吗? @HithamS.AlQadheeb 实际上,我有。该线程没有谈论如何处理错误,只是首先发生错误的原因。 【参考方案1】:

试试下面的例子...

你的 shell 脚本可以捕获这样的错误代码......其中非零退出代码是错误

$?是最近执行的命令的退出状态;按照惯例,0 表示成功,其他任何值表示失败。


spark-submit transform_json.py


 ret_code=$?
   if [ $ret_code -ne 0 ]; then 
      exit $ret_code
   fi

在错误情况下,您必须编写代码以通过sys.exit(-1) 返回退出代码。检查这个是否有 python 异常处理...

查看Exit codes in Python

【讨论】:

不幸的是它没有用,我还在尝试一些东西? 错误是什么...捕获退出代码就是这样(即使对于scala或java也是...)。你必须做的一件事是你必须在你的异常模块中以非零退出代码退出......如果你的 python 代码有错误 让我知道它对你有用。如果是这样,您可以通过以所有者身份接受答案来关闭此线程。 我想我能够弄清楚,我在脚本的开头添加了“set -e”,并将命令保留为“spark-submit transform_json.py”。它现在正在工作。不过谢谢!

以上是关于如何从 shell 脚本中捕获 Spark 错误的主要内容,如果未能解决你的问题,请参考以下文章

前端捕获异常技巧总结

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

Shell:用 cat 捕获用户输入

如何在 Shell 脚本的变量中捕获 telnet 命令的输出

如何在 shell 脚本中捕获 Gradle 退出代码?

从 shell 脚本调用 PL/SQL 存储过程并捕获 out 参数