Oozie分布式任务的工作流——Spark篇
2016-12-23 23:45
225 查看
Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark。在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任务,合理的设计工作流并分配适合的参数对于spark的稳定运行十分重要。
一般来说,离线的spark任务最重都会生成一些数据,这些数据可能存储到数据库中,也可能直接存储到hdfs,如果存储到hdfs就涉及到清除目录了。比如你可能在测试环境需要频繁的重复运行spark任务,那么每次都需要清除目录文件,创建新的目录才行。
这个参数就是用来设置,驱动程序是以客户端的形式运行在本地机器,还是以集群模式运行在集群中。
我自己工作时的例子:
通过oozie的web控制条,可以看到spark的日志。
在spark action中加载spark-assembly包
指定master为yarn-client或者yarn-master
为了确保spark工作在spark历史服务器中可以查到,需要保证在--conf中或者
spark.yarn.historyServer.address=http://spark-host:18088
spark.eventLog.dir=hdfs://NN:8020/user/spark/applicationHistory
spark.eventLog.enabled=true
Spark Action
这个Action允许执行spark任务,需要用户指定job-tracker以及name-node。先看看语法规则:语法规则
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3"> ... <action name="[NODE-NAME]"> <spark xmlns="uri:oozie:spark-action:0.1"> <job-tracker>[JOB-TRACKER]</job-tracker> <name-node>[NAME-NODE]</name-node> <prepare> <delete path="[PATH]"/> ... <mkdir path="[PATH]"/> ... </prepare> <job-xml>[SPARK SETTINGS FILE]</job-xml> <configuration> <property> <name>[PROPERTY-NAME]</name> <value>[PROPERTY-VALUE]</value> </property> ... </configuration> <master>[SPARK MASTER URL]</master> <mode>[SPARK MODE]</mode> <name>[SPARK JOB NAME]</name> <class>[SPARK MAIN CLASS]</class> <jar>[SPARK DEPENDENCIES JAR / PYTHON FILE]</jar> <spark-opts>[SPARK-OPTIONS]</spark-opts> <arg>[ARG-VALUE]</arg> ... <arg>[ARG-VALUE]</arg> ... </spark> <ok to="[NODE-NAME]"/> <error to="[NODE-NAME]"/> </action> ... </workflow-app>
prepare元素
它里面可以执行删除文件或者创建目录的操作,比如<delete path="hdfs://xxxx/a"/> <mkdir path="hdfs://xxxx"/>
一般来说,离线的spark任务最重都会生成一些数据,这些数据可能存储到数据库中,也可能直接存储到hdfs,如果存储到hdfs就涉及到清除目录了。比如你可能在测试环境需要频繁的重复运行spark任务,那么每次都需要清除目录文件,创建新的目录才行。
job-xml
spark 任务的参数也可以放在job-xml所在的xml中。confugration
这里面的配置的参数将会传递给spark任务。master
spark运行的模式,表示spark连接的集群管理器。默认可以使spark的独立集群(spark://host:port)或者是mesos(mesos://host:port)或者是yarn(yarn),以及本地模式localmode
因为spark任务也可以看做主节点和工作节点模式,主节点就是驱动程序。这个驱动程序既可以运行在提交任务的机器,也可以放在集群中运行。这个参数就是用来设置,驱动程序是以客户端的形式运行在本地机器,还是以集群模式运行在集群中。
name
spark应用的名字class
spark应用的主函数jar
spark应用的jar包spark-opts
提交给驱动程序的参数。比如--conf key=value或者是在oozie-site.xml中配置的
oozie.service.SparkConfiguationService.spark.configurations。
arg
这个参数是用来提交给spark应用的参数例子
官网给出的例子:<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1"> ... <action name="myfirstsparkjob"> <spark xmlns="uri:oozie:spark-action:0.1"> <job-tracker>foo:8021</job-tracker> <name-node>bar:8020</name-node> <prepare> <delete path="${jobOutput}"/> </prepare> <configuration> <property> <name>mapred.compress.map.output</name> <value>true</value> </property> </configuration> <master>local[*]</master> <mode>client<mode> <name>Spark Example</name> <class>org.apache.spark.examples.mllib.JavaALS</class> <jar>/lib/spark-examples_2.10-1.1.0.jar</jar> <spark-opts>--executor-memory 20G --num-executors 50</spark-opts> <arg>inputpath=hdfs://localhost/input/file.txt</arg> <arg>value=2</arg> </spark> <ok to="myotherjob"/> <error to="errorcleanup"/> </action> ... </workflow-app>
我自己工作时的例子:
<action name="NODE1"> <spark xmlns="uri:oozie:spark-action:0.1"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <master>yarn</master> <mode>cluster</mode> <name>NODE1</name> <class>com.test.NODE1_Task</class> <jar>/lib/dw.jar</jar> <spark-opts>--executor-memory 1G --num-executors 6 --executor-cores 1 --conf spark.storage.memoryFraction=0.8</spark-opts> <arg>参数1</arg> <arg>参数2</arg> <arg>参数3</arg> </spark> </action>
日志
spark action日志会重定向到oozie的mapr启动程序的stdout/stderr中。通过oozie的web控制条,可以看到spark的日志。
spark on yarn
如果想要把spark运行在yarn上,需要按照下面的步骤执行:在spark action中加载spark-assembly包
指定master为yarn-client或者yarn-master
为了确保spark工作在spark历史服务器中可以查到,需要保证在--conf中或者
oozie.service.SparkConfiturationService.spark.configrations中设置下面的三个参数:
spark.yarn.historyServer.address=http://spark-host:18088
spark.eventLog.dir=hdfs://NN:8020/user/spark/applicationHistory
spark.eventLog.enabled=true
spark action的schema
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:spark="uri:oozie:spark-action:0.1" elementFormDefault="qualified" targetNamespace="uri:oozie:spark-action:0.1"> <xs:element name="spark" type="spark:ACTION"/> <xs:complexType name="ACTION"> <xs:sequence> <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="prepare" type="spark:PREPARE" minOccurs="0" maxOccurs="1"/> <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="configuration" type="spark:CONFIGURATION" minOccurs="0" maxOccurs="1"/> <xs:element name="master" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="mode" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="class" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="jar" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="spark-opts" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="arg" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="CONFIGURATION"> <xs:sequence> <xs:element name="property" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/> <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/> <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="PREPARE"> <xs:sequence> <xs:element name="delete" type="spark:DELETE" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="mkdir" type="spark:MKDIR" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="DELETE"> <xs:attribute name="path" type="xs:string" use="required"/> </xs:complexType> <xs:complexType name="MKDIR"> <xs:attribute name="path" type="xs:string" use="required"/> </xs:complexType> </xs:schema>
相关文章推荐
- Oozie分布式任务的工作流——Spark篇
- Oozie分布式任务的工作流——Sqoop篇
- Oozie分布式任务的工作流——Sqoop篇
- Oozie分布式任务的工作流——邮件篇
- Oozie分布式任务的工作流——Sqoop篇
- Oozie分布式任务的工作流——脚本篇
- Activiti工作流学习(二)流程实例、执行对象、任务
- 工作流任务分派策略现状研究
- Office 365 利用并行工作流构建威客式任务管理系统之创建任务自定义列表!
- Hue上的Oozie如何构建工作流和定时任务
- 数据中心云工作流任务的能效调度算法研究(1)
- MOSS工作流任务权限控制
- MSCRM 数据库增长过大,在CRM中,工作流扩展任务记录会导致AsyncOperationBase 表格
- 工作流与任务
- 工作流管理系统开发之十七 任务管理
- 用户故事、开发任务与工作流块任务数据模式
- 头疼的PDF与工作流任务范围数据模式
- SharePoint 2007工作流开发点滴(7) – 用代码完成任务
- 解析大型.NET ERP系统核心组件 查询设计器 报表设计器 窗体设计器 工作流设计器 任务计划设计器
- 基于标签方式的工作流启动及任务执行开发说明