以编程方式安排作业防止重复作业

schedule jobs in programatic way prevent duplicate jobs

我的传感器数据是在配置单元表中捕获的,我希望 运行 定期在这些表上触发作业。让我们说 15 分钟 30 分钟 45 分钟的工作。

我们正在使用 cron 调度程序以固定的时间间隔安排作业(不同的 spark 提交)。这里的问题是由于 yarn 资源争用问题作业 运行ning 缓慢并且 cron 不断地一次又一次地触发相同的作业。

例如:触发了 30 分钟的作业,但由于某些集群资源问题而延迟,cron 每 30 分钟触发另一个 30 分钟的作业。

解决这个问题的一种方法可能是使用 quarz/oozie 调度程序操作。

是否有任何程序化方法来确保具有相同作业名称的作业完成后仅触发下一个具有相同名称的作业?

安排他们的最佳方式是什么?

选项 1:您可以使用 Airflow 作为调度程序并在作业之间创建依赖关系。

选项 2:Apache Spark job using CRONTAB in Unix- prevents duplicate job submissions

#!/bin/bash

LOCKFILE=/filelock.pid
SPARK_PROGRAM_CLASS=com.javachain.javachainfeed
#SPARK_PROGRAM_JAR=javachain_family-assembly-5.0.jar
#HIVE_TBALE=javachain_prd_tbls.Family_data
#FEEDNAME=""

#Process Locking
if [ -f ${LOCKFILE} ] ; then
    PID=`cat ${LOCKFILE}`
    ps -fp${PID} > /dev/null
    STAT=$?
    if [ "${STAT}" = "0" ]; then
       echolog "Already running as pid ${PID}"
       exit 0
    fi
    [ -z "$DEBUGME" ] || echolog "${LOCKFILE} exists but contains PID: ${PID} of a prior process"
else
    [ -z "$DEBUGME" ] || echolog "${LOCKFILE} does not exist, will create one"
fi
echo $$ > ${LOCKFILE}

while read -r line
do
      set -- $line
      FEEDNAME=
  spark-submit --master yarn-client --driver-memory 10G --executor-memory 8G --num-executors 30 
--class $SPARK_PROGRAM_CLASS  $SPARK_PROGRAM_JAR  --hiveTable $HIVE_TBALE  --className $FAMILY

done < "familynames.txt"

此外,

为了提供在集群中执行 spark 作业的公平访问权限,我建议配置 hadoop 纱线公平(不是 FIFO)调度程序