一个spark job 在启动之后,就会确定 executor 的数量。但是存在一种情况,当我的队列资源宽松
可能就要调整一些job的资源,但是spark job在启动的时候,最大的资源就确定了,所以能否可以通过直接修改jvm
里面某些属性值来调整 job 的 资源使用大小。
通过阅读 spark on yarn 的 提交job流程代码,发现在 ApplicationMaster registerAM 方法最后
会启动一个 线程:
sc -d *YarnAllocator
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator //先获取到所有的实例对象
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0]' //再拿到第一个实例对象
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0],#fieldObj=@org.apache.spark.deploy.yarn.YarnAllocator@class.getDeclaredField("org$apache$spark$deploy$yarn$YarnAllocator$$targetNumExecutors")' //反射拿到字段
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0],#fieldObj=@org.apache.spark.deploy.yarn.YarnAllocator@class.getDeclaredField("org$apache$spark$deploy$yarn$YarnAllocator$$targetNumExecutors"),#fieldObj.setAccessible(true)' //字段设置可访问
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0],#fieldObj=@org.apache.spark.deploy.yarn.YarnAllocator@class.getDeclaredField("org$apache$spark$deploy$yarn$YarnAllocator$$targetNumExecutors"),#fieldObj.setAccessible(true),#fieldObj.get(#instance)' //获取到实例的私有属性值
vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0],#fieldObj=@org.apache.spark.deploy.yarn.YarnAllocator@class.getDeclaredField("org$apache$spark$deploy$yarn$YarnAllocator$$targetNumExecutors"),#fieldObj.setAccessible(true),#fieldObj.set(#instance, 5)' //设置实例的私有属性值
注意: 有些复杂的属性不好确定,此时就需要 反编译代码了,或者使用 vmtool express 里面通过反射 打印出 所有的 Filed class.getDeclaredFields()
jad org.apache.spark.deploy.yarn.YarnAllocator //找到 targetNumExecutors 属性,可以看到并不是 targetNumExecutors,而是 org$apache$spark$deploy$yarn$YarnAllocator$$targetNumExecutors
5. 观察 yarn web ui ,查看这个 job 的资源是不是增加了
ognl -c 279f2327 @org.apache.spark.deploy.yarn.YarnAllocator@MEM_REGEX
ognl -c 279f2327 @org.apache.spark.deploy.yarn.YarnAllocator@MEM_REGEX()