Robot Framework通过SSH库执行Spark作业失败的解决方法
问题原因&解决方案
执行失败基本是四个共性问题导致,按优先级排查修复即可:
- 多层嵌套引号转义失效:命令中
su -c用单引号包裹、内部--driver-java-options又用双引号传参,经过Robot Framework参数解析、SSH传输、远程Shell解析三层处理后,引号会提前闭合,命令被直接截断 - 未分配伪终端:SSH Library的Execute Command关键字默认不分配PTY(伪终端),
su切换用户的操作依赖交互式终端,无PTY时会直接卡住或返回权限错误,根本不会执行后续的spark-submit - 用户环境变量未加载:写法用的是
su hdfs而非su - hdfs,切换用户时不会加载hdfs用户的profile配置,大概率找不到spark-submit的执行路径,直接报命令不存在 - 长作业执行逻辑问题:spark-submit是长耗时任务,默认参数下关键字不会等任务提交完成就返回,容易被误判为未触发
可直接复用的修复写法
快速修复版(适合简单命令场景)
修正引号转义规则,开启PTY分配,补全用户环境变量加载逻辑:
*** Test Cases *** Submit Spark Job # 注意su后面加横杠加载hdfs用户环境,内层双引号用反斜杠转义,强制开启pty ${stdout} ${stderr} ${rc}= Execute Command ... su - hdfs -c "spark-submit --driver-java-options \"-Xss4m\" --master yarn --queue 替换为实际队列名 /home/automation/actual" ... pty=True ... return_stderr=True ... return_rc=True # 打印执行结果方便排查 Should Be Equal As Integers ${rc} 0 msg=Spark作业提交失败,错误信息:${stderr} Log 作业提交成功,输出:${stdout}
如果SSH登录用户有sudo权限,优先用sudo代替su,完全规避su的密码交互问题,适配自动化场景:
${stdout} ${stderr} ${rc}= Execute Command ... sudo -u hdfs spark-submit --driver-java-options "-Xss4m" --master yarn --queue 替换为实际队列名 /home/automation/actual ... pty=True ... return_stderr=True ... return_rc=True
稳定版(推荐生产/复杂参数场景使用)
直接避开多层引号转义的坑,先把spark提交命令写到远程临时脚本,再切换用户执行脚本,不会出现任何转义问题:
*** Test Cases *** Submit Spark Job Stable # 远程写入提交脚本,用EOF标记避免变量转义 Execute Command cd /home/automation && cat > spark_submit_tmp.sh << 'EOF' ... spark-submit --driver-java-options "-Xss4m" --master yarn --queue 替换为实际队列名 /home/automation/actual ... EOF # 加执行权限 Execute Command chmod +x /home/automation/spark_submit_tmp.sh # 切hdfs用户执行 ${stdout} ${stderr} ${rc}= Execute Command su - hdfs -c "bash /home/automation/spark_submit_tmp.sh" pty=True return_stderr=True return_rc=True # 清理临时脚本 Execute Command rm -f /home/automation/spark_submit_tmp.sh # 校验执行结果 Should Be Equal As Integers ${rc} 0 msg=提交失败:${stderr}
排查指引
改完仍执行失败的,按以下顺序定位:
- 先登录远程服务器手动执行spark-submit命令,确认作业本身、队列权限、jar包路径没有问题,排除非Robot Framework侧的故障
- 必须把Execute Command的返回码、stdout、stderr全打日志,根据报错直接定位根因:
- 报
syntax error near unexpected token:引号转义错误,直接换稳定版写脚本的方案 - 报
spark-submit: command not found:没加su后面的横杠,hdfs用户环境变量未加载 - 命令执行后无任何输出、YARN上查不到作业:没开
pty=True,su切换用户失败 - 报权限类错误:确认SSH登录用户有su到hdfs的权限,或配置了对应sudo免密规则
- 报
内容的提问来源于stack exchange,提问作者Automation using Selenium and
相关产品推荐
相关产品推荐

