【问题标题】:schedule jobs in programatic way prevent duplicate jobs以编程方式安排作业防止重复作业
【发布时间】:2018-05-02 20:04:59
【问题描述】:

我的传感器数据是在 hive 表中捕获的,我希望定期在这些表上运行 spark 作业。比方说 15 分钟 30 分钟 45 分钟的工作。

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

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

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

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

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

【问题讨论】:

  • 我建议你使用 Quartz,在 Quartz 中你可以有一个包装类,在触发动作之前验证作业的前一个实例是否正在运行。

标签: scala apache-spark scheduler


【解决方案1】:

选项 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=$1
  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 yarn fair(NOT FIFO) 调度程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多