1
0
mirror of https://github.com/newnius/YAO-scheduler.git synced 2025-12-13 07:46:43 +00:00
This commit is contained in:
2019-03-25 15:36:30 +08:00
parent 66b4468c74
commit 804dfa969f
4 changed files with 76 additions and 66 deletions

View File

@@ -3,18 +3,21 @@ package main
import ( import (
"sync" "sync"
"time" "time"
"log"
"io/ioutil"
"encoding/json"
) )
type AllocatorFIFO struct { type AllocatorFIFO struct {
queue []Job history []*Job
mu sync.Mutex queue []Job
mu sync.Mutex
scheduling sync.Mutex scheduling sync.Mutex
jobs map[string]*JobManager
} }
func (allocator *AllocatorFIFO) start() { func (allocator *AllocatorFIFO) start() {
allocator.jobs = map[string]*JobManager{}
allocator.history = []*Job{}
go func() { go func() {
for { for {
//fmt.Print("Scheduling ") //fmt.Print("Scheduling ")
@@ -27,6 +30,14 @@ func (allocator *AllocatorFIFO) start() {
jm.job = allocator.queue[0] jm.job = allocator.queue[0]
allocator.queue = allocator.queue[1:] allocator.queue = allocator.queue[1:]
jm.allocator = allocator jm.allocator = allocator
allocator.jobs[jm.job.Name] = &jm
for i := range allocator.history {
if allocator.history[i].Name == jm.job.Name {
allocator.history[i].Status = Starting
}
}
go func() { go func() {
jm.start() jm.start()
}() }()
@@ -38,8 +49,21 @@ func (allocator *AllocatorFIFO) start() {
}() }()
} }
func (allocator *AllocatorFIFO) ack() { func (allocator *AllocatorFIFO) ack(job *Job) {
allocator.scheduling.Unlock() allocator.scheduling.Unlock()
for i := range allocator.history {
if allocator.history[i].Name == job.Name {
allocator.history[i].Status = Running
}
}
}
func (allocator *AllocatorFIFO) finish(job *Job) {
for i := range allocator.history {
if allocator.history[i].Name == job.Name {
allocator.history[i].Status = Finished
}
}
} }
func (allocator *AllocatorFIFO) schedule(job Job) { func (allocator *AllocatorFIFO) schedule(job Job) {
@@ -47,6 +71,7 @@ func (allocator *AllocatorFIFO) schedule(job Job) {
defer allocator.mu.Unlock() defer allocator.mu.Unlock()
allocator.queue = append(allocator.queue, job) allocator.queue = append(allocator.queue, job)
allocator.history = append(allocator.history, &job)
} }
func (allocator *AllocatorFIFO) requestResource(task Task) MsgAgent { func (allocator *AllocatorFIFO) requestResource(task Task) MsgAgent {
@@ -91,63 +116,21 @@ func (allocator *AllocatorFIFO) returnResource(agent MsgAgent) {
} }
func (allocator *AllocatorFIFO) status(jobName string) MsgJobStatus { func (allocator *AllocatorFIFO) status(jobName string) MsgJobStatus {
jm, ok := allocator.jobs[jobName]
var tasksStatus []TaskStatus if !ok {
tasksStatus = append(tasksStatus, TaskStatus{Id: "8b9b665fc4f1"}) return MsgJobStatus{Code: 1, Error: "Job not exist!"}
tasksStatus = append(tasksStatus, TaskStatus{Id: "4a4aeee2c5f9"})
for i, taskStatus := range tasksStatus {
spider := Spider{}
spider.Method = "GET"
spider.URL = "http://kafka_node1:8000/status?id=" + taskStatus.Id
err := spider.do()
if err != nil {
continue
}
resp := spider.getResponse()
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
continue
}
var res MsgTaskStatus
err = json.Unmarshal([]byte(string(body)), &res)
if err != nil {
continue
}
tasksStatus[i] = res.Status
} }
return jm.status()
return MsgJobStatus{Status: tasksStatus}
} }
func (allocator *AllocatorFIFO) logs(taskName string) MsgLog { func (allocator *AllocatorFIFO) logs(jobName string, taskName string) MsgLog {
spider := Spider{} jm, ok := allocator.jobs[jobName]
spider.Method = "GET" if !ok {
spider.URL = "http://kafka_node1:8000/logs?id=" + taskName return MsgLog{Code: 1, Error: "Job not exist!"}
err := spider.do()
if err != nil {
return MsgLog{Code: 1, Error: err.Error()}
} }
return jm.logs(taskName)
resp := spider.getResponse() }
defer resp.Body.Close()
func (allocator *AllocatorFIFO) listJobs() MsgJobList {
body, err := ioutil.ReadAll(resp.Body) return MsgJobList{Code: 0, Jobs: allocator.history}
if err != nil {
return MsgLog{Code: 1, Error: err.Error()}
}
var res MsgLog
err = json.Unmarshal([]byte(string(body)), &res)
if err != nil {
log.Println(err)
return MsgLog{Code: 1, Error: "Unknown"}
}
return res
} }

View File

@@ -18,6 +18,7 @@ type JobManager struct {
func (jm *JobManager) start() { func (jm *JobManager) start() {
log.Println("start job ", jm.job.Name) log.Println("start job ", jm.job.Name)
jm.jobStatus = JobStatus{Name: jm.job.Name, tasks: map[string]TaskStatus{}}
/* request for resources */ /* request for resources */
for i := range jm.job.Tasks { for i := range jm.job.Tasks {
@@ -62,14 +63,16 @@ func (jm *JobManager) start() {
jm.jobStatus.tasks[jm.job.Tasks[i].Name] = TaskStatus{Id: res.Id} jm.jobStatus.tasks[jm.job.Tasks[i].Name] = TaskStatus{Id: res.Id}
} }
jm.allocator.ack() jm.allocator.ack(&jm.job)
/* monitor job execution */ /* monitor job execution */
for { for {
res := jm.status() res := jm.status()
flag := false
for i := range res.Status { for i := range res.Status {
if res.Status[i].Status == "running" { if res.Status[i].Status == "running" {
log.Println(jm.job.Name, "-", i, " is running") log.Println(jm.job.Name, "-", i, " is running")
flag = true
} else { } else {
log.Println(jm.job.Name, "-", i, " ", res.Status[i].Status) log.Println(jm.job.Name, "-", i, " ", res.Status[i].Status)
@@ -79,16 +82,20 @@ func (jm *JobManager) start() {
jm.allocator.returnResource(jm.resources[i]) jm.allocator.returnResource(jm.resources[i])
} }
} }
if !flag {
break
}
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)
} }
jm.allocator.finish(&jm.job)
log.Println("finish job", jm.job.Name) log.Println("finish job", jm.job.Name)
} }
func (jm *JobManager) logs(taskName string) MsgLog { func (jm *JobManager) logs(taskName string) MsgLog {
spider := Spider{} spider := Spider{}
spider.Method = "GET" spider.Method = "GET"
spider.URL = "http://127.0.0.1:8000/logs?id=" + taskName spider.URL = "http://kafka_node1:8000/logs?id=" + taskName
err := spider.do() err := spider.do()
if err != nil { if err != nil {
@@ -113,12 +120,11 @@ func (jm *JobManager) logs(taskName string) MsgLog {
} }
func (jm *JobManager) status() MsgJobStatus { func (jm *JobManager) status() MsgJobStatus {
var tasksStatus []TaskStatus var tasksStatus []TaskStatus
for _, taskStatus := range jm.jobStatus.tasks { for _, taskStatus := range jm.jobStatus.tasks {
spider := Spider{} spider := Spider{}
spider.Method = "GET" spider.Method = "GET"
spider.URL = "http://127.0.0.1:8000/status?id=" + taskStatus.Id spider.URL = "http://kafka_node1:8000/status?id=" + taskStatus.Id
err := spider.do() err := spider.do()
if err != nil { if err != nil {

View File

@@ -59,7 +59,14 @@ func serverAPI(w http.ResponseWriter, r *http.Request) {
case "task_logs": case "task_logs":
fmt.Println("task_logs") fmt.Println("task_logs")
fmt.Println(r.URL.Query().Get("id")) fmt.Println(r.URL.Query().Get("id"))
js, _ := json.Marshal(allocator.logs(r.URL.Query().Get("id"))) js, _ := json.Marshal(allocator.logs(r.URL.Query().Get("job"), r.URL.Query().Get("task")))
w.Header().Set("Content-Type", "application/json")
w.Write(js)
break
case "jobs":
fmt.Println("job_list")
js, _ := json.Marshal(allocator.listJobs())
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
w.Write(js) w.Write(js)
break break

View File

@@ -8,6 +8,20 @@ import (
"net/http" "net/http"
) )
const (
Created = 0
Starting = 1
Running = 2
Stopped = 3
Finished = 4
)
type MsgJobList struct {
Code int `json:"code"`
Error string `json:"error"`
Jobs []*Job `json:"jobs"`
}
type MsgLog struct { type MsgLog struct {
Code int `json:"code"` Code int `json:"code"`
Error string `json:"error"` Error string `json:"error"`