logo资料库

fourinone源代码分析.doc

第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
资料共49页,剩余部分请下载后查看
本示例把分配任务的程序比喻为“工头”,可以有一个工头进程,也可以有多个工头进程;把处理任务的程序比喻
一、本程序以fourinone-3.04.25.jar为基础
错误:Jdk版本不一致
编译:编译时可一次性进行
二、配置文件config.xml:
三、简单的分布式通讯:
1、首先运行职介所(ParkServerDemo)程序。
2、然后运行工人(SimpleWorker)程序。
3、最后运行包工头(SimpleCtor)程序。
四、多工头、多任务、多工人的分布式计算
本例是采用逐个调用每个工人的doTask()并轮循结果状态的方式实现的,与下面“五”的使用doTas
1、首先运行职介所(ParkServerDemo)程序。
2、然后运行工人(WorkerDemo)程序。
3、最后运行包工头(CtorDemo)程序。
4、前两例总结:
五、工头向工人说hello,工人互相说hello,并批量处理工头任务
1、首先运行职介所(ParkServerDemo)程序。
2、然后运行工人(HelloWorker)程序。
3、最后运行包工头(HelloCtor)程序。
4、总结:
六、实现Hadoop经典实例Word count
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、然后运行工人(WordcountWK)程序。
3、最后运行包工头(WordcountCT)程序。
七、分布式计算自动部署
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、然后在工人节点机器运行工人(MigrantWorker)程序,该程序包含在fourinone.j
3、最后运行包工头(JobCtor)程序。
4、帮助类
5、错误总结
6、尝试远程运行对方机器exe程序
7、尝试在win7开机自启动java程序
八、故障和容灾处理
(1)、故障处理
(2)、容灾处理
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、然后在工人节点机器运行工人(FaultWorker)程序。
3、最后运行包工头(FaultCtor)程序。
源文件为:FaultCtor.java
九、在一台计算上一次性启动多个进程
1、用批处理文件:
2、用fourinone自带的API程序
3、此方法可用于运行工人机器的exe程序
十、中止工人计算和超时中止
1、中止的方式有三种:
2、实例:
①首先运行职介所(ParkServerDemo)程序,即协同服务。
②然后在工人节点机器运行工人(CancelWorker)程序。
③最后运行包工头(CancelCtor)程序。
十一、并行计算与递归算法
1、单机递归测试
2、多机分布式测试
①首先运行职介所(ParkServerDemo)程序,即协同服务。
②运行工人程序CombWorker.java
③运行工头程序CombCtor.java
十二、并行计算应用之 圆周率 ∏
1、单机上求Pi
2、多机分布式:
①、首先运行职介所(ParkServerDemo)程序,即协同服务。
②、运行四个PiWorker.java
③、运行工头PiTest.java
十三、并行计算应用之 PageRank 算法
1、一个赌钱游戏
2、分布式计算网页分析链接关系确定排名先后
①、首先运行职介所(ParkServerDemo)程序,即协同服务。
②、运行PageRankWorker.java
③、运行PageRankCtor.java
十四、并行计算应用之 上亿数据排序 算法
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、运行4个SortWorker.java
3、运行SortCotr.java
十五、工人服务化模式
提示:工头角色转换
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、运行ServiceWorker.java
3、运行CtorClient.java
4、可使用ClientMain.java来一次启动多个工头客户
十五、实时流计算系统
1、首先运行职介所(ParkServerDemo)程序,即协同服务。
2、运行工人StreamWorkerA.java
3、运行两个StreamWorkerB.java
4、运行工头StreamCtorA.java
5、工头StreamCtorB.java代码如下:
十六、相关问题
1、MigrantWorker无法自动感知失联的Park
2、无法重新以main()原有的参数获取Park
3、以上两个问题使用的环境与源代码
4、使用eclipse运行MigrantWorker时提示缺少config.xml文件。
5、使用eclipse运行MigrantWorker时提示缺少META-INF配置文件。
6、错误:NullPointerException
7、错误:ClassNotFoundException
8、错误:Address already in use:bind
9、config.xml配置不当会产生上面错误
附录:
1、BeanContext
2、文本数据
本示例把分配任务的程序比喻为“工头”,可以有一个工头进程,也可以有多个工头进 程;把处理任务的程序比喻为“工人”,可以在多台机器上启动工人程序,也可以在同一机 器上启动工人程序;把协调工人与工头之间的的程序比喻为职介所,有的职介所只负责联系 工人和工头,然后工人工头之间直接接触,有的职介所还把工头的任务信息保存,然后工人 从职介所里获得要处理的任务。 一、本程序以 fourinone-3.04.25.jar 为基础 错误:Jdk 版本不一致 Fourinone.jar 是以 jdk1.5 编译的,如果使用 jdk1.7 则不能运行,这时可以重新使用 jdk1.7 进行编译。 编译:编译时可一次性进行 Javac *.java; 二、配置文件 config.xml: 运行时把配置文件 config.xml、程序 class、fourinone.jar 放到同一目录下,如果 class 文 件有包名,需要放在包根目录处,这样默认能找到。 配置文件 config.xml: ParkService localhost:1888,localhost:1889 0.95 3000 0 24 0 false true CacheService localhost:2000,localhost:2001 2010-01-01 localhost:2000,localhost:2001@2010-01-01;localhost:2002,localhost:2003@2010 -05-01;localhost:2004,localhost:2005@2010-05-01 2018-05-01 localhost:2008,localhost:2009@2018-05-01;localhost:2010,localhost:2011@2018 -05-01
CacheFacadeService localhost:1998 100 2 localhost:2088 false 10 100 0 1 localhost:2121 localhost:9080 admin:admin,guest:123456,test:test ALL SEVERE WARNING INFO CONFIG FINE FINER FINEST OFF true false 三、简单的分布式通讯: 提示: ①、据测试,因为本例是简单的分布调用,所以不管建立多少个工人(Worker)对象,都只
处理第一个建立的工人 ②、如果把以下的运行顺序调乱,则产生错误。 1、首先运行职介所(ParkServerDemo)程序。 必须首先运行,用于给工人登记及包工头获取工人信息。 源文件为:ParkServerDemo.java import com.fourinone.BeanContext; public class ParkServerDemo { public static void main(String[] args) { BeanContext.startPark();//请看附录 1、BeanContext } } 2、然后运行工人(SimpleWorker)程序。 工人向职介所登记自己。 源文件为:SimpleWorker.java import com.fourinone.MigrantWorker; import com.fourinone.WareHouse; public class SimpleWorker extends MigrantWorker { public WareHouse doTask(WareHouse inhouse) { String word = inhouse.getString("word"); System.out.println(word+" from Contractor."); return new WareHouse("word", word+" world!"); } public static void main(String[] args) { SimpleWorker mw = new SimpleWorker(); mw.waitWorking("simpleworker"); } } 3、最后运行包工头(SimpleCtor)程序。 包工头向职介所获取工人信息,并把 hello 任务分配给工人。 源文件为:SimpleCtor.java import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; import java.util.ArrayList; public class SimpleCtor extends Contractor {
public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("simpleworker"); System.out.println("wks.length:"+wks.length); WareHouse wh = new WareHouse("word", "hello"); WareHouse result = wks[0].doTask(wh); while(true){ if(result.getStatus()==WareHouse.READY) { System.out.println("result:"+result); break; } } return null; } public static void main(String[] args) { SimpleCtor a = new SimpleCtor(); a.giveTask(null); } } 四、多工头、多任务、多工人的分布式计算 本例是采用逐个调用每个工人的 doTask()并轮循结果状态的方式实现的,与下面“五”的使 用 doTaskBatch()方式手批量处理任务并等待最慢的工人完成后一次返回的方式不同。 1、首先运行职介所(ParkServerDemo)程序。 必须首先运行,用于给工人登记及包工头获取工人信息。 源文件为:ParkServerDemo.java import com.fourinone.BeanContext; public class ParkServerDemo { public static void main(String[] args) { BeanContext.startPark();//请看附录 1、BeanContext } } 2、然后运行工人(WorkerDemo)程序。 工人向职介所登记自己,登记时要注册自己的名称和端口。 源文件为: WorkerDemo.java //运行时必须注意在命令后添加相应的工人名称及工人端口 //如:WorkerDemo aaa 2008(“aaa”表示工人名,“2008”表示端口), //否则会产生如下错误:
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 //at WorkerDemo.main(WorkerDemo.java:21) //该错误为数组下界越标,因 main()入口函数中新建 WorkerDemo 对象时使用 arg[0]参数。 //如果运行 WorkerDemo 命令时没输入任何参数则提未错误 import com.fourinone.MigrantWorker; import com.fourinone.WareHouse; public class WorkerDemo extends MigrantWorker { private String workname; public WorkerDemo(String workname) { this.workname = workname; } public WareHouse doTask(WareHouse inhouse) { String v = inhouse.getString("id"); System.out.println(workname+" inhouse:"+v); return new WareHouse("id",v+"-"+workname+"-"); } public static void main(String[] args) { WorkerDemo wd = new WorkerDemo(args[0]); wd.waitWorking("localhost",Integer.parseInt(args[1]),"workdemo"); } } 3、最后运行包工头(CtorDemo)程序。 包工头向职介所获取工人信息,并把由第一个包工头把任务链式地(串行)分配给工人同时 处理(并行)。 源文件为: CtorDemo.java import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; import java.util.ArrayList; public class CtorDemo extends Contractor { private String ctorname;
CtorDemo(String ctorname) { this.ctorname = ctorname; } public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("workdemo"); System.out.println("wks.length:"+wks.length); String outStr = inhouse.getString("id"); WareHouse[] hmarr = new WareHouse[wks.length]; int data=0; for(int j=0;j<20;) { for(int i=0;i
4、前两例总结: 有四个对象需明确:ParkServer(职介所)、Worker(工人)、Contractor(工头)、WareHouse(手工 仓库,或任务)。 ①ParkServer 优先运行保证工人能登记信息,工头能获取工人信息; ②工人获取 leader server(职介所),并登记自己的名称,所属类型,端口等信息,登记后等 待被分配任务 waitingWorking()。在执行任务时被工头调用 doTask()方法; ③工头从职介所获取工人信息 getWaitingWorkers(),并以 giveTask()方法分配任务给各工人; ④WareHouse 作为 任务 对象 ,表 示要处 理的 信息 ,不 管是 doTask() 还是 giveTask() 都以 WareHouse 对象为参数传递,最后也返回处理后的 WareHouse 任务对象。 ⑤因此,在整个分布设计中,基本遵循开办职介所、工人主动登记信息、工头把任务 Warehouse 分配给工人处理的过程。 五、工头向工人说 hello,工人互相说 hello,并批量处理工头任务 1、首先运行职介所(ParkServerDemo)程序。 必须首先运行,用于给工人登记及包工头获取工人信息。 源文件为:ParkServerDemo.java(与上面例子同,此处不再重复) 2、然后运行工人(HelloWorker)程序。 工人向职介所登记自己,并等待任务。此处的任务与前面两例不同,工人除了完成工头的任 务(接收工头 hello 信息)并返回自己的名字(hello,I am XXX),还要用 getWorkerElse()方 法获取其它工人信息,并向其它工人说自己的名字(hello,I am XXX)。工人与工人之间的调 用使用 receive()方法进行,不用 doTask()方法,doTask()方法是用于工头调用工人时。 源文件为:HelloWorker.java import com.fourinone.MigrantWorker; import com.fourinone.WareHouse; import com.fourinone.Workman; public class HelloWorker extends MigrantWorker { private String name; public HelloWorker(String name){ this.name = name; } public WareHouse doTask(WareHouse inhouse) { System.out.println(inhouse.getString("word")); WareHouse wh = new WareHouse("word", "hello, i am "+name); Workman[] wms = getWorkerElse("helloworker"); for(Workman wm:wms) wm.receive(wh); return wh; } public boolean receive(WareHouse inhouse)
{ } System.out.println(inhouse.getString("word")); return true; public static void main(String[] args) { HelloWorker mw = new HelloWorker(args[0]); mw.waitWorking(args[1],Integer.parseInt(args[2]),"helloworker"); } } 3、最后运行包工头(HelloCtor)程序。 包工头向职介所获取工人信息,并向工人说 hello,它调用批量处理方法 doTaskBatch(),要 等到该集群中的所有工人最慢的那个完任务后才返回,如果要让快的工人再接受新的任务, 请用第“四”轮循的办法。注意,工头最后用 HelloCtor.exit();方法退出 jvm 环境。 源文件为:HelloCtor.java import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; public class HelloCtor extends Contractor { public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("helloworker"); System.out.println("wks.length:"+wks.length); WareHouse wh = new WareHouse("word", "hello, i am your Contractor."); WareHouse[] hmarr = doTaskBatch(wks, wh); for(WareHouse result:hmarr) System.out.println(result); return null; } public static void main(String[] args) { HelloCtor a = new HelloCtor(); a.giveTask(null); a.exit(); } } 可以工头程序改动一下,变为在命令后输入 hello 信息,改动后如下: import com.fourinone.Contractor;
分享到:
收藏