修改jvm对象的属性值(私有)

修改jvm对象的属性值(私有)

这个想法的来源

一个spark job 在启动之后,就会确定 executor 的数量。但是存在一种情况,当我的队列资源宽松

可能就要调整一些job的资源,但是spark job在启动的时候,最大的资源就确定了,所以能否可以通过直接修改jvm

里面某些属性值来调整 job 的 资源使用大小。

通过阅读 spark on yarn 的 提交job流程代码,发现在 ApplicationMaster registerAM 方法最后

会启动一个 线程:

  1. 主要用来监控 失败 exetors 数量,失败超过一定数据之后,执行 spark stop操作
  2. 执行 allocator.allocateResources() 方法,这个方法里面会比较 executor 设定值 (targetNumExecutors) 与 当前已经分配的值,不够的话,则会
    执行申请操作
    那么如果直接增加 jvm YarnAllocator 实例的 targetNumExecutors的话, 这个spark job executor 数据就会增加。

具体操作 通过 arthas 工具操作,修改对象的私有属性值

  1. 找到 spark driver 所在的主机 执行 java -jar arthas-boot.jar

  2. 选择 对应的 进程

  3. 先找到 此对象的 classloader

    sc -d *YarnAllocator

  4. 使用 vmtool 工具 修改 私有的对象属性

    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("orgapachesparkdeployyarnYarnAllocatortargetNumExecutors")' //反射拿到字段 vmtool --action getInstances --className org.apache.spark.deploy.yarn.YarnAllocator --express '#instance=instances[0],#fieldObj=@org.apache.spark.deploy.yarn.YarnAllocator@class.getDeclaredField("orgapachesparkdeployyarnYarnAllocatortargetNumExecutors"),#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$YarnAllocatortargetNumExecutors"),#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("orgapachesparkdeployyarnYarnAllocator$targetNumExecutors"),#fieldObj.setAccessible(true),#fieldObj.set(#instance, 5)' //设置实例的私有属性值

注意: 有些复杂的属性不好确定,此时就需要 反编译代码了,或者使用 vmtool express 里面通过反射 打印出 所有的 Filed class.getDeclaredFields()

jad org.apache.spark.deploy.yarn.YarnAllocator //找到 targetNumExecutors 属性,可以看到并不是 targetNumExecutors,而是 orgapachesparkdeployyarnYarnAllocator$targetNumExecutors

  1. 观察 yarn web ui ,查看这个 job 的资源是不是增加了

具体操作 通过 arthas 工具操作,查看对象的静态属性值、执行静态方法

复制代码
ognl -c 279f2327 @org.apache.spark.deploy.yarn.YarnAllocator@MEM_REGEX 
ognl -c 279f2327 @org.apache.spark.deploy.yarn.YarnAllocator@MEM_REGEX() 
相关推荐
Elastic 中国社区官方博客1 分钟前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
2401_859506249 分钟前
玉石鉴定的技术原理与实操方法:从证书验真到品质判断
大数据
涛思数据(TDengine)12 分钟前
WAIC 现场直击|烽台科技与 TDengine 战略签约:工业数据+“AI“,答案是什么?
大数据·人工智能·ai·时序数据库·tdengine·国产数据库
RoboWizard14 分钟前
金士顿高速闪存盘 单双接口适配多元存储需求
大数据·运维·人工智能·智能手机·云计算
qq_1508419915 分钟前
SQL的insert和update二合一指令
java·数据库·sql
2601_9647028919 分钟前
Claude Opus 5 API 开发实战:对话、文本生成与结构化输出
java·服务器·前端
聚焦前沿21 分钟前
水动力优化导流罩:原理、数据与实船验证
大数据·服务器·数据库·人工智能
Sayuanni%323 分钟前
Spring IOC
java·spring·rpc
风景的人生26 分钟前
流式输出与springboot中的响应式编程
java·spring boot·ai编程
A153625541 分钟前
零售POS系统怎么选?门店规模、连锁模式和即时零售需求是关键
大数据·人工智能·零售