高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

1.概述

  在《高可用Hadoop平台-Oozie工作流》一篇中,给大家分享了如何去单一的集成Oozie这样一个插件。今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已经在创建过程当中需要注意的事项,下面是今天的分享目录:

  • Oozie简介
  • 任务工作流
  • 截图预览

  下面开始今天的内容分享。

2.Oozie简介

  在Oozie中有几个重要的概念,他们分别是:

  • WorkFlow:工作流,控制工作流的开始和结束过程,以及工作流Job的执行路径,并提供一种机制来控制工作流执行路径(比如:Decision、Fork以及Join节点等),其书写方式如下所示:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1"> 
  ... 
  省略详细内容 
  ... 
</workflow-app>
  • Coordinator:多个WorkFlow可以组成一个Coordinator,可以把前几个WorkFlow的输出作为后一个WorkFlow的输入,当然也可以定义WorkFlow的触发条件,来做定时触发,其书写方式如下所示:
<coordinator-app name="[CD-DEF-NAME]" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="GMT+0800" 
                 xmlns="uri:oozie:coordinator:0.1"> 
        <action> 
        <workflow> 
            <app-path>${workflowAppUri}</app-path> 
            <configuration> 
                <property> 
                    <name>jobTracker</name> 
                    <value>${jobTracker}</value> 
                </property> 
                <property> 
                    <name>nameNode</name> 
                    <value>${nameNode}</value> 
                </property> 
                <property> 
                    <name>queueName</name> 
                    <value>${queueName}</value> 
                </property> 
            </configuration> 
        </workflow> 
    </action> 
    <action> 
        <workflow> 
          ... 
        </workflow> 
      </action> 
</coordinator-app>
  • Bundle:控制一个或多个Coordinator应用,其写法如下所示:
 <bundle-app name=[NAME]  xmlns='uri:oozie:bundle:0.1'>  
  <controls> 
       <kick-off-time>[DATETIME]</kick-off-time> 
  </controls> 
   <coordinator name=[NAME] > 
       <app-path>[COORD-APPLICATION-PATH]</app-path> 
          <configuration> 
            <property> 
              <name>[PROPERTY-NAME]</name> 
              <value>[PROPERTY-VALUE]</value> 
            </property> 
            ... 
         </configuration> 
   </coordinator> 
   ... 
</bundle-app>  

3.任务工作流

  下面,我们在Hadoop平台下去创建这样一个工作流,首先,我们需要配置Hadoop的core-site.xml文件,在该文件中添加以下内容:

  • core-site.xml
        <!-- OOZIE --> 
        <property> 
                <name>hadoop.proxyuser.hadoop.hosts</name> 
                <value>*</value> 
        </property> 
        <property> 
                <name>hadoop.proxyuser.hadoop.groups</name> 
                <value>*</value> 
        </property>    

  然后,在去修改Oozie的oozie-site.xml文件,在该文件中添加如下内容如下:

  • oozie-site.xml
<property> 
         <name>oozie.services</name> 
         <value> 
          org.apache.oozie.service.SchedulerService, 
          org.apache.oozie.service.InstrumentationService, 
          org.apache.oozie.service.MemoryLocksService, 
          org.apache.oozie.service.UUIDService, 
          org.apache.oozie.service.ELService, 
          org.apache.oozie.service.AuthorizationService, 
          org.apache.oozie.service.UserGroupInformationService, 
          org.apache.oozie.service.HadoopAccessorService, 
          org.apache.oozie.service.JobsConcurrencyService, 
          org.apache.oozie.service.URIHandlerService, 
          org.apache.oozie.service.DagXLogInfoService, 
          org.apache.oozie.service.SchemaService, 
          org.apache.oozie.service.LiteWorkflowAppService, 
          org.apache.oozie.service.JPAService, 
          org.apache.oozie.service.StoreService, 
          org.apache.oozie.service.SLAStoreService, 
          org.apache.oozie.service.DBLiteWorkflowStoreService, 
          org.apache.oozie.service.CallbackService, 
          org.apache.oozie.service.ActionService, 
          org.apache.oozie.service.ShareLibService, 
          org.apache.oozie.service.CallableQueueService, 
          org.apache.oozie.service.ActionCheckerService, 
          org.apache.oozie.service.RecoveryService, 
          org.apache.oozie.service.PurgeService, 
          org.apache.oozie.service.CoordinatorEngineService, 
          org.apache.oozie.service.BundleEngineService, 
          org.apache.oozie.service.DagEngineService, 
          org.apache.oozie.service.CoordMaterializeTriggerService, 
          org.apache.oozie.service.StatusTransitService, 
          org.apache.oozie.service.PauseTransitService, 
          org.apache.oozie.service.GroupsService, 
          org.apache.oozie.service.ProxyUserService, 
          org.apache.oozie.service.XLogStreamingService, 
          org.apache.oozie.service.JvmPauseMonitorService 
     </value> 
  </property> 
  <property> 
         <name>oozie.service.HadoopAccessorService.hadoop.configurations</name> 
         <value>*=/home/hadoop/hadoop-2.6.0/etc/hadoop</value> 
  </property>

  在修改完相关文件后,下面我们去创建Oozie的sharelib,其命令如下所示:

oozie-setup.sh sharelib create -fs hdfs://cluster1

  然后使用shareliblist命令查看相关内容,命令如下所示:

oozie admin -shareliblist -oozie http://nna:11000/oozie

  若成功创建,会生成如下图所示内容:

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

  若未出现相应内容,请检查相关信息是否配置正确即可。

  • 启动Oozie服务
oozied.sh start

  注:在启动时,这里建议打开oozie的启动日志,动态观察相关日志信息,也许会出现一些异常信息,比如:

Caused by: java.lang.NoClassDefFoundError: org/htrace/Trace 
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:214) 
     
    Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/ServiceException 
    at org.apache.hadoop.ipc.ProtobufRpcEngine.<clinit>(ProtobufRpcEngine.jav

  这些异常信息大多是由于我们在前面打包生成war包时,由于缺少相关的依赖JAR包导致的,这里我们将缺少的JAR从Hadoop的share目录下找到对应的JAR拷贝到Oozie运行war包容器下即可,如:

$OOZIE_HOME/oozie-server/webapps/oozie/WEB-INF/lib

  这里,异常都有相应的提示,大家耐心的按照提示解决异常即可,在解决相关异常后,我们就可以去创建相关工作流。

  Oozie给我们提供了相关示例让我去参考配置,下面我们将examples/apps下的文件上传到HDFS当中去,这里我上传在HDFS的/oozie目录下。接下来,我给大家去演示一个定时任务。首先,我们进去到apps目录下的cron目录,这是一个定时任务的示例,其中包含:coordinator.xml、job.properties和workflow.xml三个文件,这里我们对其进行配置。

  • coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="GMT+0800" 
                 xmlns="uri:oozie:coordinator:0.2"> 
        <action> 
        <workflow> 
            <app-path>${workflowAppUri}</app-path> 
            <configuration> 
                <property> 
                    <name>jobTracker</name> 
                    <value>${jobTracker}</value> 
                </property> 
                <property> 
                    <name>nameNode</name> 
                    <value>${nameNode}</value> 
                </property> 
                <property> 
                    <name>queueName</name> 
                    <value>${queueName}</value> 
                </property> 
            </configuration> 
        </workflow> 
    </action> 
</coordinator-app>

  这里配置的频率为10分钟,该属性可配置其它频率(如:小时,天等)。

  • job.properties
nameNode=hdfs://cluster1 
jobTracker=nna:8132 
queueName=default 
examplesRoot=examples 
 
oozie.coord.application.path=${nameNode}/oozie/${examplesRoot}/apps/cron 
start=2015-08-25T13:00+0800 
end=2015-08-26T01:00+0800 
workflowAppUri=${nameNode}/oozie/${examplesRoot}/apps/cron

  这里由于使用Hadoop2.x的HA特性,在指定NameNode时,直接使用hdfs://cluster1,在Hadoop2.x后,jobTracker被替换了,这里将其地址指向resourcemanager.address的地址。

  • workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.2" name="one-op-wf"> 
    <start to="end"/> 
    <end name="end"/> 
</workflow-app>

  工作流使用一个空的Job。

  在配置完相关文件后,我们将workflow.xml和coordinator.xml上传到指定的HDFS地址(之前上传examples目录下的corn目录下,上传之前先删除存在的文件),最后,我们启动这样一个工作流,命令如下所示:

$OOZIE_HOME/bin/oozie job -oozie http://nna:11000/oozie -config job.properties -run

  创建成功后,会生成一个JobID,如下图所示:

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

  注:图中我将命令封装在Shell脚本当中。这里在创建工作流时,同样建议动态开启Oozie的运行日志,便于查看异常信息。

  若是需要Kill任务,可以使用以下命令:

$OOZIE_HOME/bin/oozie job -oozie http://nna:11000/oozie -kill [JOB_ID]

  其Job DAG如下图所示:

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

4.截图预览

  在提交作业后,我们可以通过浏览Oozie的Web监控界面观察相关信息,如下图所示:

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

高可用Hadoop平台-Oozie工作流之Hadoop调度详解大数据

5.总结

  在将Oozie集成到Hadoop平台时,会有点繁琐,出现的异常都会在日志中有详细的记录,我们可以根据这些记录去解决出现的异常。另外,我们在提交任务成功后,在Oozie执行期间若是出现异常,我们也可以通过Oozie的监控界面去非常方便的查看对应的异常信息,并排除。异常信息较多,需要我们耐心的阅读相关记录信息。

6.结束语

  这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉! 

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/228058.html

(0)
上一篇 2022年1月11日
下一篇 2022年1月11日

相关推荐

发表回复

登录后才能评论