大数据篇:oozie与spark2整合进行资源调度

Posted 杨铖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据篇:oozie与spark2整合进行资源调度相关的知识,希望对你有一定的参考价值。

文章目录

前言:

Oozie是Hadoop平台上开源的工作流调度引擎,通过hue集成的oozie管理界面,可以清晰地发布/查看/管理相关调度任务,基于此可以完成整个BI中间表,结果表的存储与计算。

整体流程如下:

1.oozie资源调度

1.1 oozie概览

Oozie是Hadoop平台上的资源调度框架,与flume,sqoop,和hue并称大数据四大协作框架,支持多种任务(spark1/2,mapreduce,java,shell,python等)调度,管理和查看。

下面集群采用的是CDH 5.13集成的oozie 4.1.0,框架更多细节详见:http://oozie.apache.org/docs/4.1.0/index.html

1.2 oozie与spark2整合

下面主要如何通过hue界面工具,将spark2任务提交到oozie调度中心,完成任务的管理和查看,一些关键点如下:
• oozie添加spark2依赖库
• 打包与提交spark2 jar, 创建spark2工作流
• 管理与查看工作流相关状态

1.2.1 oozie添加spark2依赖库

由于CDH自带的oozie默认仅支持spark1,所以唤醒spark2任务有两种方式:
• 第一种是写好spark2 submit的shell脚本,通过oozie里的shell任务唤醒该脚本去提交spark2任务;
• 第二种是配置spark2相关依赖环境,直接通过oozie进行spark2 submit;

下面主要是第二种详解:
• 首先hdfs创建下oozie的spark2目录:
sudo -u hdfs hdfs dfs -mkdir /user/oozie/share/lib/lib_20180131202902/spark2

• 其次将 CDH parcels目录下的spark2依赖上传到上面的spark2目录:
sudo -u hdfs hdfs dfs -put /opt/cloudera/parcels/SPARK2/lib/spark2/jars/*.jar /user/oozie/share/lib/lib_20180131202902/spark2/
sudo -u hdfs hdfs dfs -put /opt/cloudera/parcels/CDH/lib/oozie/oozie-sharelib-yarn/lib/spark/oozie-sharelib-spark*.jar /user/oozie/share/lib/lib_20180131202902/spark2/

• 修改第一步创建的spark2目录相关权限:
sudo -u hdfs hdfs dfs -chown -R oozie:oozie /user/oozie/share/lib/lib_20180131202902/spark2
sudo -u hdfs hdfs dfs -chmod -R 775 /user/oozie/share/lib/lib_20180131202902/spark2

• 更新oozie sharelib
oozie admin -oozie http://bigdata.zuzuche.cn:11000/oozie -sharelibupdate

• 查看spark2是否已添加到oozie sharelib
oozie admin -oozie http://bigdata.zuzuche.cn:11000/oozie -shareliblist

1.2.2 打包与提交spark2 jar, 创建spark2工作流

• spark2的打包,通过intellij的sbt进行 clean compile assembly 即可

• 基于hue的oozie管理界面详细:

• 通过Hue管理界面创建spark2工作流:
选择spark任务类型:

上传spark jar包:

• 配置job.properties相关参数:

点击上图右上角齿轮标志,进入配置job.properties参数:

由于上述properties在某些情况下配置会失效,下面进一步配置job.properties:

然后保存提交:

最后查看结果:

1.2.3 管理与查看工作流相关状态

在job browser的workflows可以看到相应的任务流运行状态:

进入schedule界面,设置相关频率:

看到各个schedule的状态:

1.3 oozie workflow/schedules/bundles

• workflow更多是单次单个任务的定义
• schedules是对workflow的某个任务定时调度管理
• bundles是对多个schedule的组合管理

1.4 配置可能会遇到的一些问题

WARN org.apache.oozie.action.hadoop.SparkActionExecutor: SERVER[ec2-54-179-152-169.ap-southeast-1.compute.amazonaws.com] USER[admin] GROUP[-] TOKEN[] APP[MyFirstSpark2] JOB[0000000-171016230402705-oozie-oozi-W] ACTION[0000000-171016230402705-oozie-oozi-W@spark-1411] Launcher exception: Exception when registering SparkListener
org.apache.spark.SparkException: Exception when registering SparkListener
   at org.apache.spark.SparkContext.setupAndStartListenerBus(SparkContext.scala:2193)
   at org.apache.spark.SparkContext.<init>(SparkContext.scala:562)
   at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2313)
   at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:868)
   at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:860)
   at scala.Option.getOrElse(Option.scala:121)
   at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:860)
   at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:31)
   at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:738)
   at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
   at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
   at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
   at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
   at org.apache.oozie.action.hadoop.SparkMain.runSpark(SparkMain.java:178)
   at org.apache.oozie.action.hadoop.SparkMain.run(SparkMain.java:90)
   at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:81)
   at org.apache.oozie.action.hadoop.SparkMain.main(SparkMain.java:57)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:235)
   at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
   at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459)
   at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
   at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
   at java.security.AccessController.doPrivileged(Native Method)
   at javax.security.auth.Subject.doAs(Subject.java:415)
   at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
   at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.ClassNotFoundException: com.cloudera.spark.lineage.ClouderaNavigatorListener
   at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
   at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
   at java.lang.Class.forName0(Native Method)
   at java.lang.Class.forName(Class.java:270)
   at org.apache.spark.util.Utils$.classForName(Utils.scala:229)
   at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2159)
   at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2156)
   at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
   at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
   at org.apache.spark.SparkContext.setupAndStartListenerBus(SparkContext.scala:2156)
   ... 34 more

解决方法,修改CDH上oozie的配置,如下:

以上是关于大数据篇:oozie与spark2整合进行资源调度的主要内容,如果未能解决你的问题,请参考以下文章

大数据用户画像之OozieHue集成Spark2 应用调度

大数据Hadoop之——任务调度器Oozie(Oozie环境部署)

大数据开发:Azkaban和Oozie调度系统对比

必知Hadoop工作流引擎调度器--Azkaban与Oozie的区别。

大数据调度平台分类(Oozie/Azkaban/AirFlow/DolphinScheduler)

Oozie