JAVA网页设计Java Web使用程序Oozie简介仓酷云
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊在Hadoop中实行的义务偶然候必要把多个Map/Reduce功课毗连到一同,如许才干够到达目标。在Hadoop生态圈中,有一种绝对对照新的组件叫做Oozie,它让我们能够把多个Map/Reduce功课组合到一个逻辑事情单位中,从而完成更年夜型的义务。本文中,我们会向你先容Oozie和利用它的一些体例。甚么是Oozie?
Oozie是一种JavaWeb使用程序,它运转在Javaservlet容器——即Tomcat——中,并利用数据库来存储以下内容:
[*]事情流界说
[*]以后运转的事情流实例,包含实例的形态和变量
Oozie事情流是安排在把持依附DAG(有向无环图DirectAcyclicGraph)中的一组举措(比方,Hadoop的Map/Reduce功课、Pig功课等),个中指定了举措实行的按次。我们会利用hPDL(一种XML流程界说言语)来形貌这个图。
hPDL是一种很简便的言语,只会利用多数流程把持和举措节点。把持节点会界说实行的流程,并包括事情流的出发点和尽头(start、end和fail节点)和把持事情流实行路径的机制(decision、fork和join节点)。举措节点是一些机制,经由过程它们事情流会触发实行盘算大概处置义务。Oozie为以下范例的举措供应撑持:Hadoopmap-reduce、Hadoop文件体系、Pig、Java和Oozie的子事情流(SSH举措已从Oozieschema0.2以后的版本中移除)。
一切由举措节点触发的盘算和处置义务都不在Oozie当中——它们是由Hadoop的Map/Reduce框架实行的。这类办法让Oozie能够撑持现存的Hadoop用于负载均衡、劫难恢复的机制。这些义务次要是异步实行的(只要文件体系举措破例,它是同步处置的)。这意味着关于年夜多半事情活动作触发的盘算或处置义务的范例来讲,在事情流操纵转换到事情流的下一个节点之前都必要守候,直到盘算或处置义务停止了以后才干够持续。Oozie能够经由过程两种分歧的体例来检测盘算或处置义务是不是完成,也就是回协调轮询。当Oozie启动了盘算或处置义务的时分,它会为义务供应独一的回调URL,然前任务会在完成的时分发送关照给特定的URL。在义务没法触发还调URL的情形下(多是由于任何缘故原由,例如说收集闪断),大概当义务的范例没法在完成时触发还调URL的时分,Oozie有一种机制,能够对盘算或处置义务举行轮询,从而包管可以完成义务。
Oozie事情流能够参数化(在事情流界说中利用像${inputDir}之类的变量)。在提交事情流操纵的时分,我们必需供应参数值。假如经由符合地参数化(例如说,利用分歧的输入目次),那末多个一样的事情流操纵能够并发。
一些事情流是依据必要触发的,可是年夜多半情形下,我们有需要基于必定的工夫段和(或)数据可用性和(或)内部事务来运转它们。Oozie和谐体系(Coordinatorsystem)让用户能够基于这些参数来界说事情流实行企图。Oozie和谐程序让我们能够以谓词的体例对事情流实行触发器举行建模,那能够指向数据、事务和(或)内部事务。事情流功课会在谓词失掉满意的时分启动。
常常我们还必要毗连准时运转、但工夫距离分歧的事情流操纵。多个随后运转的事情流的输入会成为下一个事情流的输出。把这些事情留连接在一同,会让体系把它作为数据使用的管道来援用。Oozie和谐程序撑持创立如许的数据使用管道。
安装Oozie
我们能够把Oozie安装在现存的Hadoop体系中,安装体例包含tarball、RPM和Debian包等。我们的Hadoop部署是Cloudera的CDH3,个中已包括了Oozie。因而,我们只是利用yum把它拉上去,然后在edge节点上实行安装操纵。在Oozie的公布包中有两个组件——Oozie-client和Oozie-server。依据丛聚的范围,你可让这两个组件安装在统一台edge服务器上,也大概安装在分歧的盘算机上。Oozie服务器中包括了用于触发和把持功课的组件,而客户端中包括了让用户能够触发Oozie操纵并与Oozie服务器通讯的组件。
想要懂得更多关于安装历程的信息,请利用Cloudera公布包,并会见Cloudera站点。
注:除包含安装历程的内容以外,它还倡议把上面的shell变量OOZIE_URL依据必要增加到.login、.kshrc大概shell的启动文件中:
(exportOOZIE_URL=http://localhost:11000/oozie)复杂示例
为了向你展现Oozie的利用办法,让我们创立一个复杂的示例。我们具有两个Map/Reduce功课——一个会猎取最后的数据,另外一个会集并指定范例的数据。实践的猎取操纵必要实行最后的猎取操纵,然后把两品种型的数据——Lidar和Multicam——兼并。为了让这个历程主动化,我们必要创立一个复杂的Oozie事情流(代码1)。
<!--Copyright(c)2011NAVTEQ!Inc.Allrightsreserved.NGMBIPSingestorOozieScript--><workflow-appxmlns=uri:oozie:workflow:0.1name=NGMB-IPS-ingestion><startto=ingestor/><actionname=ingestor><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>com.navteq.assetmgmt.MapReduce.ips.IPSLoader</main-class><java-opts>-Xmx2048m</java-opts><arg>${driveID}</arg></java><okto="merging"/><errorto="fail"/></action><forkname="merging"><pathstart="mergeLidar"/><pathstart="mergeSignage"/></fork><actionname=mergeLidar><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>com.navteq.assetmgmt.hdfs.merge.MergerLoader</main-class><java-opts>-Xmx2048m</java-opts><arg>-drive</arg><arg>${driveID}</arg><arg>-type</arg><arg>Lidar</arg><arg>-chunk</arg><arg>${lidarChunk}</arg></java><okto="completed"/><errorto="fail"/></action><actionname=mergeSignage><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>com.navteq.assetmgmt.hdfs.merge.MergerLoader</main-class><java-opts>-Xmx2048m</java-opts><arg>-drive</arg><arg>${driveID}</arg><arg>-type</arg><arg>MultiCam</arg><arg>-chunk</arg><arg>${signageChunk}</arg></java><okto="completed"/><errorto="fail"/></action><joinname="completed"to="end"/><killname="fail"><message>Javafailed,errormessage[${wf:errorMessage(wf:lastErrorNode())}]</message></kill><endname=end/></workflow-app>代码1:复杂的Oozie事情流
这个事情流界说了三个举措:ingestor、mergeLidar和mergeSignage。并把每一个举措都完成为Map/Reduce功课。这个事情流从start节点入手下手,然后把把持权交给Ingestor举措。一旦ingestor步骤完成,就会触发fork把持节点,它会并行地入手下手实行mergeLidar和mergeSignage。这两个举措完成以后,就会触发join把持节点。join节点乐成完成以后,把持权就会传送给end节点,它会停止这个历程。
创立事情流以后,我们必要准确地对其举行部署。典范的Oozie部署是一个HDFS目次,个中包括workflow.xml(代码1)、config-default.xml和lib子目次,个中包括有事情流操纵所要利用的类的jar文件。
(点击能够检察年夜图)
<br>
:Oozie部署
config-default.xml文件是可选的,一般个中会包括关于一切事情流实例通用的事情流参数。代码2中显现的是config-default.xml的复杂示例。
<configuration><property><name>jobTracker</name><value>sachicn003:2010</value></property><property><name>nameNode</name><value>hdfs://sachicn001:8020</value></property><property><name>queueName</name><value>default</value></property></configuration>代码2:Config-default.xml
完成了事情流的部署以后,我们可使用Oozie供应的命令行工具,它能够用于提交、启动和操纵事情流。这个工具一样平常会运转在Hadoop丛聚的edge节点上,并必要一个功课属性文件(拜见设置事情流属性),见代码3。
oozie.wf.application.path=hdfs://sachicn001:8020/user/blublins/workflows/IPSIngestionjobTracker=sachicn003:2010nameNode=hdfs://sachicn001:8020代码3:功课属性文件
有了功课属性,我们就能够利用代码4中的命令来运转Oozie事情流。
ooziejob–ooziehttp://sachidn002.hq.navteq.com:11000/oozie/-DdriveID=729-pp00002-2011-02-08-09-59-34-DlidarChunk=4-DsignageChunk=20-configjob.properties–run列表4:运转事情流命令
设置事情流属性
在config-default.xml、功课属性文件和功课参数中有一些堆叠,它们能够作为命令行挪用的一部分传送给Oozie。只管文档中没有明晰地指出什么时候利用哪一个,但整体上的倡议以下:
[*]利用config-default.xml界说关于指定事情流从未改动过的参数。
[*]关于给定的事情流部署通用的参数,倡议利用功课属性。
[*]关于指定的事情流挪用特定的参数利用命令行参数。
Oozie处置这三种参数的体例以下:
[*]利用一切命令行挪用的参数
[*]假如那边有任何没法剖析的参数,那末就是用功课设置来剖析
[*]一旦一切别的体例都没法处置,那末就试着利用config-default.xm。
我们可使用Oozie把持台()来察看事情流实行的历程和了局。
(点击能够检察年夜图)
<br>
:Oozie把持台
我们还可使用Oozie把持台来取得操纵实行的细节,例如说功课的日记()。
(点击能够检察年夜图)
<br>
:Oozie把持台——功课日记
编程体例的事情流挪用
只管下面所述的命令行界面可以很好地用于手动挪用Oozie,但偶然利用编程的体例挪用Oozie更具有上风。当Oozie事情流是特定的使用程序大概年夜型企业历程的一部分,这就会很有效。我们可使用OozieWebServicesAPIs大概OozieJavaclientAPIs来完成这类编程体例的挪用。代码5中展示的就是很复杂的OozieJava客户真个例子,它会触发下面形貌的历程。
packagecom.navteq.assetmgmt.oozie;importjava.util.LinkedList;importjava.util.List;importjava.util.Properties;importorg.apache.oozie.client.OozieClient;importorg.apache.oozie.client.OozieClientException;importorg.apache.oozie.client.WorkflowJob;importorg.apache.oozie.client.WorkflowJob.Status;publicclassWorkflowClient{privatestaticStringOOZIE_URL="http://sachidn002.hq.navteq.com:11000/oozie/";privatestaticStringJOB_PATH="hdfs://sachicn001:8020/user/blublins/workflows/IPSIngestion";privatestaticStringJOB_Tracker="sachicn003:2010";privatestaticStringNAMENode="hdfs://sachicn001:8020";OozieClientwc=null;publicWorkflowClient(Stringurl){wc=newOozieClient(url);}publicStringstartJob(StringwfDefinition,List<WorkflowParameter>wfParameters)throwsOozieClientException{//createaworkflowjobconfigurationandsettheworkflowapplicationpathPropertiesconf=wc.createConfiguration();conf.setProperty(OozieClient.APP_PATH,wfDefinition);//settingworkflowparametersconf.setProperty("jobTracker",JOB_Tracker);conf.setProperty("nameNode",NAMENode);if((wfParameters!=null)&&(wfParameters.size()>0)){for(WorkflowParameterparameter:wfParameters)conf.setProperty(parameter.getName(),parameter.getValue());}//submitandstarttheworkflowjobreturnwc.run(conf);}publicStatusgetJobStatus(StringjobID)throwsOozieClientException{WorkflowJobjob=wc.getJobInfo(jobID);returnjob.getStatus();}publicstaticvoidmain(String[]args)throwsOozieClientException,InterruptedException{//CreateclientWorkflowClientclient=newWorkflowClient(OOZIE_URL);//CreateparametersList<WorkflowParameter>wfParameters=newLinkedList<WorkflowParameter>();WorkflowParameterdrive=newWorkflowParameter("driveID","729-pp00004-2010-09-01-09-46");WorkflowParameterlidar=newWorkflowParameter("lidarChunk","4");WorkflowParametersignage=newWorkflowParameter("signageChunk","4");wfParameters.add(drive);wfParameters.add(lidar);wfParameters.add(signage);//StartOozingStringjobId=client.startJob(JOB_PATH,wfParameters);Statusstatus=client.getJobStatus(jobId);if(status==Status.RUNNING)System.out.println("Workflowjobrunning");elseSystem.out.println("ProblemstartingWorkflowjob");}}代码5:复杂的OozieJava客户端
在此,我们起首利用Oozie服务器URL对事情流客户端举行初始化。初始化历程完成以后,我们就能够利用客户端提交并启举措业(startJob办法),取得正在运转的功课的形态(getStatus办法),和举行其他操纵。
构建java举措,向事情传播递参数
在之前的示例中,我们已展现了怎样利用标签向Java节点传送参数。因为Java节点是向Oozie引进自界说盘算的次要办法,因而可以从Java节点向Oozie传送数据也一样主要。
依据Java节点的文档,我们可使用“capture-output””元素把Java节点天生的值传送回给Oozie高低文。然后,事情流的别的步骤能够经由过程EL-functions会见这些值。前往值必要以Java属性情式文件写出来。我们能够经由过程“JavaMainMapper.OOZIE_JAVA_MAIN_CAPTURE_OUTPUT_FILE”常量从System属性中取得这些属性文件的称号。代码6是一个复杂示例,演示了怎样完成这项操纵。
packagecom.navteq.oozie;importjava.io.File;importjava.io.FileOutputStream;importjava.io.OutputStream;importjava.util.Calendar;importjava.util.GregorianCalendar;importjava.util.Properties;publicclassGenerateLookupDirs{/***@paramargs*/publicstaticfinallongdayMillis=1000*60*60*24;privatestaticfinalStringOOZIE_ACTION_OUTPUT_PROPERTIES="oozie.action.output.properties";publicstaticvoidmain(String[]args)throwsException{CalendarcurDate=newGregorianCalendar();intyear,month,date;StringpropKey,propVal;StringoozieProp=System.getProperty(OOZIE_ACTION_OUTPUT_PROPERTIES);if(oozieProp!=null){FilepropFile=newFile(oozieProp);Propertiesprops=newProperties();for(inti=0;I<8;++i){year=curDate.get(Calendar.YEAR);month=curDate.get(Calendar.MONTH)+1;date=curDate.get(Calendar.DATE);propKey="dir"+i;propVal=year+"-"+(month<10?"0"+month:month)+"-"+(date<10?"0"+date:date);props.setProperty(propKey,propVal);curDate.setTimeInMillis(curDate.getTimeInMillis()-dayMillis);}OutputStreamos=newFileOutputStream(propFile);props.store(os,"");os.close();}elsethrownewRuntimeException(OOZIE_ACTION_OUTPUT_PROPERTIES+"Systempropertynotdefined");}}代码6:向Oozie传送参数
在这个示例中,我们假定在HDFS中有针对每一个日期的目次。如许,这个类起首会取得以后日期,然后再取得离如今比来的7个日期(包含明天),然后把目次称号传送回给Oozie。
结论
在本文我们先容了Oozie,它是针对Hadoop的事情流引擎,而且供应了利用它的复杂示例。鄙人一篇文章中,我们会看到更庞大的例子,让我们能够更进一步会商Oozie的特征。
申谢
十分感激我们在Navteq的同事GregoryTitievsky,他为我们供应了一些例子。
关于作者
BorisLublinsky是NAVTEQ公司的首席架构师,在这家公司中他的事情是为年夜型数据办理和处置、SOA和完成各类NAVTEQ的项目界说架构的愿景。他仍是InfoQ的SOA编纂,和OASIS的SOARA事情组的介入者。Boris是一名作者,还常常宣布演讲,他最新的一本书是《AppliedSOA》。
MichaelSegel在已往二十多年间一向与客户写作,辨认并办理他们的营业成绩。Michael已作为多种脚色、在多个行业中事情过。他是一名自力参谋,老是希冀可以办理一切有应战的成绩。Michael具有俄亥俄州立年夜学的软件工程学位。
edge节点是安装有Hadoop库的盘算机,但不是真正丛聚中的一部分。它是为可以毗连到丛聚中的使用程序所用的,而且会部署帮助服务和可以间接会见丛聚的终极用户使用程序。
请参看Oozie安装的链接。
这些功课的细节和本文有关,以是在个中没有形貌。
Map/Reduce功课可以以两种分歧的体例在Oozie中完成——第一种是作为真实的Map/Reduce举措,个中你会指定Mapper和Reducer类和它们的设置信息;第二种是作为Java举措,个中你会利用HadoopAPI来指定启动Map/Reduce功课的类。由于我们一切的Java主函数都是利用HadoopAPI,而且还完成了一些分外的功效,以是我们选择了第二种办法。
Oozie确保两个举措会并行地提交给功课跟踪程序。在实行过程当中实践的并行机制其实不在Oozie的把持以内,而且依附于功课的需求、丛聚的才能和Map/Reduce部署所利用的调剂程序。
join举措的功效是要同步fork举措启动的多个并行实行的线程。假如fork启动的一切实行的线程都可以乐成完成,那末join举措就会守候它们全体完成。假如有最少一个线程实行失利,kill节点会“杀失落”残剩运转的线程。
这个节点不必要是安装了Oozie的盘算机。
Oozie的功课日记会包括事情流实行的细节,想要检察举措实行的细节,我们必要切换到Hadoop的Map/Reduce办理页面。
检察英文原文:IntroductiontoOozie
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net网页编程就不一样了,保持微软的一向风格,源代码不公开 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 是一种为 Internet发展的计算机语言 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 是一种突破用户端机器环境和CPU 是一种将安全性(Security)列为第一优先考虑的语言 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页:
[1]