implement TaskTrackerServer; include "sys.m";include "draw.m";include "bufio.m";include "tables.m"; include "ioutil.m";include "mrutil.m";include "../logger/logger.m";include "tasktracker.m"; TaskTrackerServer : module { init : fn(ctxt : ref Draw->Context, args : list of string);}; sys : Sys;bufio : Bufio;ioutil : IOUtil;mrutil : MRUtil;logger : Logger;tasktracker : TaskTracker; Connection : import sys;Iobuf : import bufio; MapperTask : import mrutil;ReducerTask : import mrutil;TaskTrackerInfo : import mrutil; localAddr : string;localPort := 66667;hostAddr : string;hostPort := 66666;mapperFilePort := 70000; mutex : chan of int; init(ctxt : ref Draw->Context, args : list of string){ sys = load Sys Sys->PATH; bufio = load Bufio Bufio->PATH; mrutil = load MRUtil MRUtil->PATH; logger = load Logger Logger->PATH; tasktracker = load TaskTracker TaskTracker->PATH; mrutil->init(); tasktracker->init(); logger->init(); logger->setFileName("log_tasktrackerserver"); mutex = chan[1] of int; buffer := bufio->open("/appl/MR/config", Bufio->OREAD); hostAddr = buffer.gets('\n'); hostAddr = hostAddr[:len hostAddr - 1]; localAddr = buffer.gets('\n'); localAddr = localAddr[:len localAddr - 1]; (ok, conn) := sys->announce("tcp!*!" + string localPort); if (ok < 0) { logger->log("TaskTrackerServer: announce failed!", Logger->ERROR); logger->scrlog("TaskTrackerServer: announce failed!", Logger->ERROR); exit; } spawn heartBeat(); while(1) { listen(conn); }} listen(conn : Connection){ buf := array [Sys->ATOMICIO] of byte; (ok, c) := sys->listen(conn); if (ok < 0) { logger->log("TaskTrackerServer: listen failed!", Logger->ERROR); logger->scrlog("TaskTrackerServer: listen failed!", Logger->ERROR); exit; } rdf := sys->open(conn.dir + "/remote", Sys->OREAD); n := sys->read(rdf, buf, len buf); connHandle(c);} connHandle(conn : Connection){ addr := array [Sys->ATOMICIO] of byte; msgStr := array [Sys->ATOMICIO] of byte; rdfd := sys->open(conn.dir + "/data", Sys->OREAD); wdfd := sys->open(conn.dir + "/data", Sys->OWRITE); rfd := sys->open(conn.dir + "/remote", Sys->OREAD); addrlen := sys->read(rfd, addr, len addr); logger->logInfo("Message from: " + string addr[:addrlen-1]); msglen := sys->read(rdfd, msgStr, len msgStr); receive : while (msglen > 0) { (nil, msg) := sys->tokenize(string msgStr[:msglen], "@"); op := hd msg; msg = tl msg; case (op) { "shootMapper" => { mapper := mrutil->msg2mapper(msg); spawn runMapper(mapper); } "shootReducer" => { mapperFileAddr := hd msg; msg = tl msg; reducer := mrutil->msg2reducer(msg); spawn runReducer(mapperFileAddr, reducer); } } msglen = sys->read(rdfd, msgStr, len msgStr); }} heartBeat(){ while (1) { sys->sleep(3000); (n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil); tracker := ref TaskTrackerInfo(localAddr, localPort, 0, 0, 1, 0); msg := "updateTaskTracker" + "@" + mrutil->tracker2msg(tracker); sys->fprint(conn.dfd, "%s", msg); }} runMapper(mapper : ref MapperTask){ mutex <- = 0; ok := tasktracker->runMapperTask(mapper); <- mutex; msg : string; if (ok == 0) { logger->logInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " succeed!"); logger->scrlogInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " succeed!"); msg = "mapperSucceed"; } else { logger->logInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " failed!"); logger->scrlogInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " failed!"); msg = "mapperFailed"; } (n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil); msg = msg + "@" + "tcp!" + localAddr + "!" + string (mapperFilePort + mapper.id)+ "@" + mrutil->mapper2msg(mapper); sys->fprint(conn.dfd, "%s", msg); buf := array [Sys->ATOMICIO] of byte; length := sys->read(conn.dfd, buf, len buf); logger->logInfo("Feed back " + string buf[:length]); logger->scrlogInfo("Feed back " + string buf[:length]);} runReducer(mapperFileAddr : string, reducer : ref ReducerTask){ mutex <- = 0; (ok, failedAddr) := tasktracker->runReducerTask(mapperFileAddr, reducer); <- mutex; msg : string; if (ok == 0) { #succeed logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " succeed!"); logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " succeed!"); msg = "reducerSucceed"; } else if (ok == 1) { #still pending logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " get mapper address!"); logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " get mapper address!"); return; } else { logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " failed!"); logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " failed!"); msg = "reducerFailed" + "@" + failedAddr; } (n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil); msg = msg + "@" + mrutil->reducer2msg(reducer); sys->fprint(conn.dfd, "%s", msg); buf := array [Sys->ATOMICIO] of byte; length := sys->read(conn.dfd, buf, len buf); logger->logInfo("Feed back " + string buf[:length]); logger->scrlogInfo("Feed back " + string buf[:length]);}
implement TaskTrackerServer;
include "sys.m";
include "draw.m";
include "bufio.m";
include "tables.m";
include "ioutil.m";
include "mrutil.m";
include "../logger/logger.m";
include "tasktracker.m";
TaskTrackerServer : module {
init : fn(ctxt : ref Draw->Context, args : list of string);
};
sys : Sys;
bufio : Bufio;
ioutil : IOUtil;
mrutil : MRUtil;
logger : Logger;
tasktracker : TaskTracker;
Connection : import sys;
Iobuf : import bufio;
MapperTask : import mrutil;
ReducerTask : import mrutil;
TaskTrackerInfo : import mrutil;
localAddr : string;
localPort := 66667;
hostAddr : string;
hostPort := 66666;
mapperFilePort := 70000;
mutex : chan of int;
init(ctxt : ref Draw->Context, args : list of string)
{
sys = load Sys Sys->PATH;
bufio = load Bufio Bufio->PATH;
mrutil = load MRUtil MRUtil->PATH;
logger = load Logger Logger->PATH;
tasktracker = load TaskTracker TaskTracker->PATH;
mrutil->init();
tasktracker->init();
logger->init();
logger->setFileName("log_tasktrackerserver");
mutex = chan[1] of int;
buffer := bufio->open("/appl/MR/config", Bufio->OREAD);
hostAddr = buffer.gets('\n');
hostAddr = hostAddr[:len hostAddr - 1];
localAddr = buffer.gets('\n');
localAddr = localAddr[:len localAddr - 1];
(ok, conn) := sys->announce("tcp!*!" + string localPort);
if (ok < 0) {
logger->log("TaskTrackerServer: announce failed!", Logger->ERROR);
logger->scrlog("TaskTrackerServer: announce failed!", Logger->ERROR);
exit;
}
spawn heartBeat();
while(1) {
listen(conn);
}
}
listen(conn : Connection)
{
buf := array [Sys->ATOMICIO] of byte;
(ok, c) := sys->listen(conn);
if (ok < 0) {
logger->log("TaskTrackerServer: listen failed!", Logger->ERROR);
logger->scrlog("TaskTrackerServer: listen failed!", Logger->ERROR);
exit;
}
rdf := sys->open(conn.dir + "/remote", Sys->OREAD);
n := sys->read(rdf, buf, len buf);
connHandle(c);
}
connHandle(conn : Connection)
{
addr := array [Sys->ATOMICIO] of byte;
msgStr := array [Sys->ATOMICIO] of byte;
rdfd := sys->open(conn.dir + "/data", Sys->OREAD);
wdfd := sys->open(conn.dir + "/data", Sys->OWRITE);
rfd := sys->open(conn.dir + "/remote", Sys->OREAD);
addrlen := sys->read(rfd, addr, len addr);
logger->logInfo("Message from: " + string addr[:addrlen-1]);
msglen := sys->read(rdfd, msgStr, len msgStr);
receive : while (msglen > 0) {
(nil, msg) := sys->tokenize(string msgStr[:msglen], "@");
op := hd msg;
msg = tl msg;
case (op) {
"shootMapper" => {
mapper := mrutil->msg2mapper(msg);
spawn runMapper(mapper);
}
"shootReducer" => {
mapperFileAddr := hd msg;
msg = tl msg;
reducer := mrutil->msg2reducer(msg);
spawn runReducer(mapperFileAddr, reducer);
}
}
msglen = sys->read(rdfd, msgStr, len msgStr);
}
}
heartBeat()
{
while (1) {
sys->sleep(3000);
(n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil);
tracker := ref TaskTrackerInfo(localAddr, localPort, 0, 0, 1, 0);
msg := "updateTaskTracker" + "@" + mrutil->tracker2msg(tracker);
sys->fprint(conn.dfd, "%s", msg);
}
}
runMapper(mapper : ref MapperTask)
{
mutex <- = 0;
ok := tasktracker->runMapperTask(mapper);
<- mutex;
msg : string;
if (ok == 0) {
logger->logInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " succeed!");
logger->scrlogInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " succeed!");
msg = "mapperSucceed";
}
else {
logger->logInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " failed!");
logger->scrlogInfo("MapperTask " + string mapper.id + " from job " + string mapper.jobId + " failed!");
msg = "mapperFailed";
}
(n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil);
msg = msg + "@" + "tcp!" + localAddr + "!" + string (mapperFilePort + mapper.id)+ "@" + mrutil->mapper2msg(mapper);
sys->fprint(conn.dfd, "%s", msg);
buf := array [Sys->ATOMICIO] of byte;
length := sys->read(conn.dfd, buf, len buf);
logger->logInfo("Feed back " + string buf[:length]);
logger->scrlogInfo("Feed back " + string buf[:length]);
}
runReducer(mapperFileAddr : string, reducer : ref ReducerTask)
{
mutex <- = 0;
(ok, failedAddr) := tasktracker->runReducerTask(mapperFileAddr, reducer);
<- mutex;
msg : string;
if (ok == 0) { #succeed
logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " succeed!");
logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " succeed!");
msg = "reducerSucceed";
}
else if (ok == 1) { #still pending
logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " get mapper address!");
logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " get mapper address!");
return;
}
else {
logger->logInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " failed!");
logger->scrlogInfo("ReducerTask " + string reducer.id + " from job " + string reducer.jobId + " failed!");
msg = "reducerFailed" + "@" + failedAddr;
}
(n, conn) := sys->dial("tcp!" + hostAddr + "!" + string hostPort, nil);
msg = msg + "@" + mrutil->reducer2msg(reducer);
sys->fprint(conn.dfd, "%s", msg);
buf := array [Sys->ATOMICIO] of byte;
length := sys->read(conn.dfd, buf, len buf);
logger->logInfo("Feed back " + string buf[:length]);
logger->scrlogInfo("Feed back " + string buf[:length]);
}