ZBLOG

shell 脚本循环执行spark 任务 任务报错不影响循环

在 Shell 脚本中循环执行 Spark 任务,并在任务报错时不影响后续循环的执行,可以通过以下几种方式实现:


方法一:使用 for 循环 + 错误忽略

#!/bin/bash

# Spark 任务列表(可以是 spark-submit 命令或其他 Spark 相关命令)
spark_jobs=(
    "spark-submit --class com.example.Job1 /path/to/job1.jar"
    "spark-submit --class com.example.Job2 /path/to/job2.jar"
    "spark-submit --class com.example.Job3 /path/to/job3.jar"
)

echo "开始执行 Spark 任务循环..."

for job in "${spark_jobs[@]}"; do
    echo "正在执行: $job"
    
    # 执行 Spark 任务,即使失败也继续
    $job || {
        echo "[警告] Spark 任务执行失败: $job"
        echo "继续执行下一个任务..."
    }
    
    echo "----------------------------------------"
done

echo "所有 Spark 任务尝试完成。"

方法二:使用配置文件管理 Spark 任务

#!/bin/bash

# spark_jobs.txt 文件内容示例:
# spark-submit --class com.example.Job1 /path/to/job1.jar
# spark-submit --class com.example.Job2 /path/to/job2.jar
# spark-submit --class com.example.FailJob /path/to/fail.jar

CONFIG_FILE="spark_jobs.txt"

echo "开始从配置文件执行 Spark 任务..."

while IFS= read -r job; do
    # 跳过空行和注释行
    [[ -z "$job" || "$job" =~ ^# ]] && continue
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在执行: $job"
    
    # 执行 Spark 任务并记录日志
    if ! eval "$job"; then
        echo "[ERROR][$(date '+%Y-%m-%d %H:%M:%S')] Spark 任务失败: $job" >> spark_errors.log
        echo "[警告] 当前任务失败,但继续执行下一个..."
    else
        echo "[SUCCESS][$(date '+%Y-%m-%d %H:%M:%S')] Spark 任务成功: $job" >> spark_success.log
    fi
    
    echo "----------------------------------------"
    
done < "$CONFIG_FILE"

echo "所有配置的 Spark 任务执行完成。"

方法三:带重试机制的版本(可选)

#!/bin/bash

spark_jobs=(
    "spark-submit --class com.example.Job1 /path/to/job1.jar"
    "spark-submit --class com.example.Job2 /path/to/job2.jar"
)

MAX_RETRIES=2

for job in "${spark_jobs[@]}"; do
    attempt=1
    success=false
    
    echo "开始执行: $job"
    
    while [ $attempt -le $MAX_RETRIES ] && [ "$success" = false ]; do
        echo "尝试第 $attempt 次执行..."
        
        if $job; then
            echo "[成功] 第 $attempt 次尝试成功"
            success=true
        else
            echo "[失败] 第 $attempt 次尝试失败"
            ((attempt++))
            sleep (5) #  等待5秒后重试
            
            if [ $attempt -gt $MAX_RETRIES ]; then 
                echo "[最终失败]  达到最大重试次数,放弃该任务" 
            fi 
         fi 
     done 
     
     echo "--->>>>>>该Spark子流程结束<<<<<<---"  
 done 

echo "--->>>>>>所有Spark流程处理完毕<<<<<<---"  

⚠️重要注意事项:

  1. 环境变量设置 “`bash #!/bin/bash
    #设置必要的环境变量
    export SPARK_HOME=/opt/spark
    export PATH=\(SPARK_HOME/bin:\)PATH
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

#然后执行你的Spark任务循环


2. **资源限制考虑**
   ```bash   
   #可以在每个Spark任务之间添加延时,避免资源冲突   
   for job in "${spark_jobs[@]}"; do       
       $job || echo "任务失败但继续..."       
       sleep (10) #等待10秒再执行下一个任务   
   done  
  1. 详细的日志记录
LOG_FILE="spark_batch_$(date +%Y%m%d_%H%M%S).log"      
exec > >(tee -a "$LOG_FILE") (2>&1)      

echo "=== Spark批量任务开始 ==="      
#...你的循环代码...      
echo "=== Spark批量任务结束 ==="      

✅完整示例:

#!/bin/bash      

#设置日志文件      
LOG_FILE="spark_execution_$(date +%Y%m%d_%H%M%S).log"      
exec > >(tee -a "$LOG_FILE") (2>&1)      

#Spark     任     务     列     表      
spark_jobs=(          
"spark-submit --master yarn --deploy-mode cluster --class com.example.ETLJob /apps/etl.jar"          
"spark-submit --master yarn --deploy-mode cluster --class com.example.AnalysisJob /apps/analysis.jar"          
"spark-submit --master yarn --deploy-mode cluster --class com.example.ReportJob /apps/report.jar"      )      

echo "$(date) -开始批量执行Spark任     务"      

for ((i=0; i<${#spark_jobs[@]}; i++)); do          
     job="${spark_jobs[$i]}"          
     echo "$(date) -正在执     行第$((i+1))个任     务: $job"           
     
     #执     行Spark任     务,即使失畋也继畗循畇           
     if ! eval "$job"; then               
         echo "$(date) -[警告]第$((i+1))个任     务执     行失畋,但继畗下一任     务"           
     else               
         echo "$(date) -[成功]第$((i+1))个任     务执     行完成"           
     fi           
     
     #等待一段时间再执     行下一任     务(可选)           
     sleep (5)       
done        

echo "$(date)-所有Spark任         务处         理完成">>“$LOG_FILE”        

通过以上方栻,您可以确保即使某个Spark任 务失畋,脚本也会继畗执 行后续的任 务,非常适合批处理场景。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24282

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?