ตัวกำหนดตารางงานที่ใช้ Linux อย่างง่ายพร้อมการอ้างอิงงาน? [ปิด]


4

ฉันกำลังบำรุงรักษาระบบคลังข้อมูลที่เกี่ยวข้องกับงานที่ต้องพึ่งพาจำนวนมาก (การนำเข้าข้อมูลการแปลงและอื่น ๆ ) ฉันใช้ลีนุกซ์อยู่ crontab เพื่อจัดการพวกเขาจนกว่าการพึ่งพาระหว่างงานจะซับซ้อน

โดยทั่วไปฉันกำลังมองหาบางอย่าง cron การแทนที่ที่ช่วยฉันด้วยสถานการณ์ต่อไปนี้:

  • รันงาน A at 00:05 (ง่าย). โดยปกตินี่คืองานนำเข้า

  • จัดกำหนดการงาน B, C, D เพื่อให้ทำงานหลังจากงาน A เสร็จสิ้น งาน D ทำงานเพียง 30 นาทีหลังจากงานเสร็จสิ้น (เพื่อกระจายโหลด) นี่คืองานแปลงรูป

  • Job E ทำงานเมื่อ B, C, D เสร็จสิ้น โดยปกตินี่เป็นงานที่นำข้อมูลที่รวบรวมไปยังฐานข้อมูลส่วนหน้าของเว็บ

สิ่งเหล่านี้เกิดขึ้นบนโหนดเดียวกัน

ฉันคิดว่ามันดูเหมือนกราฟโทโพโลยี

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D

มีเครื่องมือที่ใช้ Linux อย่างง่ายที่สนับสนุนสิ่งนี้หรือไม่ ฉันมองเข้าไปแล้ว โครโนสของ Airbnb แต่ดูเหมือนว่าเกินความต้องการของฉัน

แก้ไข: สถานการณ์ข้างต้นเป็นเพียงเวอร์ชันที่เรียบง่ายของสิ่งที่เกิดขึ้น เรามีงานประจำวันมากขึ้นและการพึ่งพามีความซับซ้อนมากขึ้น ดังนั้นฉันกำลังมองหา "cron บนเตียรอยด์" มากกว่าสคริปต์ทุบตีเป็นกรณี ๆ เพื่อรองรับแต่ละสถานการณ์


ฉันเดาว่าการใช้เซิร์ฟเวอร์ Jenkins CI น่าจะเกินไปเช่นกัน ถึงกระนั้นมันก็ใช้ได้
Daniel Beck

1
คุณ ได้ ทำเช่นนี้กับสคริปต์ทุบตีที่ค่อนข้างง่ายที่ทำงานที่ 00:05 (ผ่าน crond ใด ๆ ), เริ่มงาน A และรอให้เสร็จสมบูรณ์จากนั้นเริ่มต้น B และ C ในพื้นหลังเช่นเดียวกับ subprocess backgrounded ซึ่งรอ 30 นาทีแล้วเริ่ม D จากนั้นรอให้พวกเขาทั้งหมดเสร็จสิ้นก่อนที่จะเริ่มต้น E จากนั้นเมื่อ E เสร็จสิ้นเพียงแค่ออก จัดการกับข้อผิดพลาดเล็กน้อยเพื่อการวัดที่ดีและคุณควรจะไปได้ดี ลิงก์ที่มีประโยชน์อาจเป็นไปได้: stackoverflow.com/q/356100/486504 stackoverflow.com/a/6041820/486504 Google "ทุบตีรอกระบวนการย่อย" หรือคล้ายกัน
a CVn

Michael: ขอบคุณ แม้ว่ากรณีการใช้งานของฉันมีความซับซ้อนมากกว่านั้น ฉันได้อัปเดตคำถามเพื่อให้สะท้อน
huy

ดังนั้นคุณกำลังมองหาเครื่องมือง่ายๆที่จะจัดการกับสิ่งที่คุณใช้เป็นตัวอย่างที่ซับซ้อนมากขึ้นโดยไม่ได้ระบุ ... อย่างตรงไปตรงมาถ้าเป็นเช่นนั้นฉันไม่แน่ใจว่าคำถามที่ยืนอยู่นั้นตอบได้ แล้วก็ อย่างน้อย อธิบายว่าทำไมทางเลือกที่คุณพบคือ "เกินกำลัง" สำหรับความต้องการของคุณและอะไร โดยเฉพาะ คุณสมบัติของมันที่คุณต้องการ
a CVn

คำตอบ:


5

ดังที่ Michael Kjörlingแนะนำในความคิดเห็นคุณควรทำสิ่งนี้ได้ด้วยสคริปต์ทุบตีง่ายๆ บางสิ่งเช่นนี้

#!/usr/bin/env bash

## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"

## Change "ls /etc >/dev/null " to reflect the actual 
## jobs you want to run but keep the  "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";

## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &


## Now, monitor the logfile and run job E when the rest have finished
while true; do
    lines=`wc -l $logfile | cut -f 1 -d ' '`;
    echo "$logfile : $lines"
    ## The logfile will contain 4 lines if all jobs have finished
    if [ "$lines" -eq 3 ];
    then
      ## Run job E
      eval $jobE 
      ## Delete the logfile
      rm $logfile
      ## exit the script
      exit 0;
    fi
    ## Only check if the jobs are finished once a minute
    sleep 60;
done

ถ้าคุณใช้ cron เพื่อเปิดสคริปต์นี้เวลา 00:05 มันควรทำในสิ่งที่คุณต้องการ เคล็ดลับหลักที่นี่คือการใช้ subshells () และ &&. Subshels ให้คุณเรียกใช้งานพื้นหลังหลาย ๆ งานและ && เพื่อเรียกใช้งานเมื่องานอื่นออกจากเรียบร้อยแล้ว


ขอบคุณสำหรับความช่วยเหลือของคุณ @terdon ขอโทษฉันไม่ชัดเจนเกี่ยวกับสถานการณ์ของฉัน จำนวนงานที่ฉันมีมากกว่านั้นและการพึ่งพาระหว่างกันมีความซับซ้อนมาก สถานการณ์ที่ฉันอธิบายเป็นเพียงเวอร์ชั่นย่อของสิ่งที่มักจะเกิดขึ้น
huy

4

ดูน่าสนใจเหล่านี้:

  • https://airflow.incubator.apache.org/

    ไม่ง่าย แต่มีประสิทธิภาพและสนับสนุนโดย apache กำหนดค่าด้วยรหัสตอนนี้ใช้กันอย่างแพร่หลาย

  • https://www.digdag.io/

    java airflow ชอบตั้งค่าได้ง่ายกว่า

  • https://github.com/thieman/dagobah

    เครื่องมือจัดกำหนดการงานที่ใช้ DAG อย่างง่ายใน Python

  • https://github.com/spotify/luigi (โดย spotify)

    Luigi เป็นโมดูล Python ที่ช่วยให้คุณสร้างท่อที่ซับซ้อน   งานแบ็ตช์

เหล่านี้เป็นโครงการหลามทั้งหมด (คาดว่าจะมี digdag) ซึ่งมีจุดมุ่งหมายที่จะแทนที่ cron ด้วย GUI ที่ดีเพื่อดูกราฟการพึ่งพา

ฉันเคยใช้ทุบตีสำหรับสิ่งนี้ แต่มันก็น่าเกลียดเมื่อคุณเติบโตเป็นระบบที่ซับซ้อน


2

BMC Software สร้างผลิตภัณฑ์ที่ชื่อว่า Control-M ซึ่งเหมาะสมอย่างยิ่งสำหรับคำอธิบายปัญหาของคุณ อย่างไรก็ตามมันไม่ฟรี :(

เราใช้เพื่อจัดการงานประมาณ 500 งานในการผลิตและอีกกว่า 400 งานในสภาพแวดล้อมการทดสอบ คุณติดตั้งไคลเอนต์บนเครื่องที่คุณต้องการจากนั้นตั้งค่างานบนเซิร์ฟเวอร์ Control-M เพื่อให้ทำงานบนไคลเอนต์ มีพารามิเตอร์ที่กำหนดค่าได้จำนวนมากและเกณฑ์การกำหนดเวลาซึ่งทั้งหมดสามารถจัดการผ่าน GUI หรือบรรทัดคำสั่ง ส่วนที่เหมาะสมที่สุดสำหรับปัญหาของคุณคือความก้าวหน้าในการตั้งค่าเงื่อนไขอินพุต / เอาต์พุตสำหรับงานเพื่อให้คุณสามารถพึ่งพาได้เพียงแค่ลากและวางระหว่างงาน เราใช้เพื่อตั้งค่าสตรีมเวิร์กโฟลว์มากกว่า 20 งานต่อครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.