Oozie提交pyspark任务后yarn 8088一直处于ACCEPTED状态不运行runninghtml
这个问题困扰了我一个周末……一个周末……(而后其实后面又困扰了一周)node
并且重启注销,不懂是否是由于ubuntu kylin不稳定web
【结果】是由于单集群的问题,致使yarn一次只能运行一个job。在服务器上跑就没有事儿,在本身的虚拟机上跑就不行,由于没配备多个虚拟机。——————【你觉得是这样就大错特错了】apache
【真实缘由】未开启yarn多线程模式,也就是scheduler为单线程单队列运行ubuntu
如图,点开日志能够看到本身写的py程序正确地输出告终果。能够点开log来看。这里吐槽下,有些人忽视web界面的做用,以为什么都用yarn命令行来查就好……真的很不方便的。web还能自动给你归类好,节省了大量无心义的工做,使你更专一解决exception等问题。
至于为何会出现一直ACCEPTED不RUNNING的结果,由于Oozie提交pyspark任务是经过mapreduce来提交的。它先提交一个mapreduce任务,而这个mapreduce任务里面包含pyspark任务,形成2个任务同时在提交。若是yarn是单节点的,一次只能运行一个任务,那么就悲剧了。mapreduce提交了pyspark,此时mapreduce任务在running中,yarn已经没有slot给其它job了,而后,虽然pyspark已经ACCEPTED了但就是不能running。pyspark不running并结束,mapreduce也结束不了,没法释放资源给pyspark。
如何发现这样的问题呢?你在yarn命令行经过kill命令杀掉那个mapreduce,而后spark的job就能正常运行并出来结果了。服务器
那么缘由既然是没能2个job同时运行,那如何解决呢?咱们查看一直在ACCEPTED的job的application_id,链接到相应的log,会发现它一直在重复以下的信息,就是不RUNNING:多线程
INFO [communication thread] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1458755526820_9216_m_000000_0 is : 1.0并发
会以为这个yarn默认模式笨的感人。解决这个问题有2个方案,一个是配置多个队列,第二个是配置一个FairScheduler。app
有人就奇怪了,yarn自己不就是多线程的吗?为何会出现这个问题,这就要谈到队列的概念。在yarn里面,提交任务须要指定queue(队列)的:oop
“使用过第一代hadoop的同窗应该比较熟悉mapred.job.map.capacity/mapred.job.reduce.capacity这个参数,不管是map仍是reduce均可以配置capacity(也就是并发数),表示同时能够有多少个map(或reduce)运行,经过这个参数能够限制一个任务同时占用的资源(节点)数,这样不至于影响其余任务的执行。
第二代hadoop由于使用yarn作资源管理,没有了槽位的概念,因此就没有了capacity。可是在yarn中专门有了CapacityScheduler这个组件。这是一个可插装的调度器,它的用途就是对多用户实现共享大集群并对每一个用户资源占用作控制。
对于很豪的公司来讲,每一个用户(团队)本身有一个hadoop集群,这样能够提升自身的稳定性和资源供应,可是确下降了资源利用率,由于不少集群大多数时间都是空闲的。CapacityScheduler能实现这样的功能:每一个组固定享有集群里的一部分资源,保证低保,同时若是这个固定的资源空闲,那么能够提供给其余组来抢占,可是一旦这些资源的固定使用者要用,那么当即释放给它使用。这种机制在实现上是经过queue(队列)来实现的。固然CapacityScheduler还支持子队列(sub-queue)。”——参考http://www.tuicool.com/articles/VNJNBr7
【解决方案】配置yarn多线程运行模式:
若是一直显示这样的:
INFO [communication thread] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt attempt_1458755526820_9216_m_000000_0 is : 1.0
那么确实是调度器的问题。
在可行的解决方案中,增长队列可能没那么快,而修改调度器为FairSchduler是比较现成和快的解决方案:
修改yarn-site.xml文件,添加以下:
<!-- scheduler configuration, for multi-tasks run in queue, avoid mapreduce-run & pyspark ACCEPTED not run problem --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> <property> <name>yarn.scheduler.fair.preemption</name> <value>true</value> </property> <!-- 下面配置用来设置集群利用率的阀值, 默认值0.8f,最多能够抢占到集群全部资源的80% --> <property> <name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name> <value>1.0</value> </property> |
开启公平调度器。以后咱们再在8088端口查看pyspark的job的时候,会发现,虽然刚开始依然处于ACCEPTED的状态,但已经正常分配给拥有nodemanager节点的机子并初始化了。等一阵子后就开始RUNNING了。不再会发生卡壳的问题。