Arthas 是 Alibaba 开源的Java诊断工具,深受开发者喜爱
前言
Arthas 是 Alibaba 开源的Java诊断工具,深受开发者喜爱。
Arthas 官方文档十分详细,本文也参考了官方文档内容,同时在开源在的 Github 的项目里的 Issues 里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。
开源地址: https://github.com/alibaba/arthas
官方文档: https://alibaba.github.io/arthas
问题描述
在使用 Yarn 跑测试任务时,发现中文输出乱码。
网上搜索到hadoop web中查看文件内容乱码解决,
感觉可以试试能不能解决问题,但是又不想把 hadoop-common 项目下载下来完整编译打包上传。
这时就想到 Arthas 好想可以解决这个问题,以前特地过了下基础教程学习使用了一下。但是一直未实战,感觉这次可以试试
实操
准备工作,下载相关文件
1 2 3 4 5
| # 服务端下载这个类的 CDH6.3.1 的源码 wget https://raw.githubusercontent.com/cloudera/hadoop-common/cdh6.3.1/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HtmlQuoting.java
# 下载 Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar
|
修改 org.apache.hadoop.http.HtmlQuoting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| // 导入该类 import java.nio.charset.Charset;
// quoteHtmlChars 方法 public static String quoteHtmlChars(String item) { if (item == null) { return null; } try { byte[] bytes = item.getBytes(Charset.defaultCharset().name()); if (needsQuoting(bytes, 0, bytes.length)) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try { quoteHtmlChars(buffer, bytes, 0, bytes.length); return buffer.toString("UTF-8"); } catch (IOException ioe) { // Won't happen, since it is a bytearrayoutputstream return null; } } else { return item; } } catch (IOException zz) { return null; } }
|
启动 Arthas
1 2 3 4 5 6 7 8 9 10 11
| sudo -u yarn java -jar /opt/arthas-boot.jar
# 选择 RM、NM 进程,然后将其相关替换
# 三板斧 sc -d *HtmlQuoting # 获取classLoaderHash mc -c 1963006a /opt/HbaseSessions.java -d /opt redefine /opt/org/apache/hadoop/http/HtmlQuoting.class
# 查看是否替换成功 jad org.apache.hadoop.http.HtmlQuoting -c 1963006a
|
启动 Spark 任务发现还是中文乱码,并没有解决问题,但是这次实操 Arthas 经历挺好的,熟悉下使用
遇到问题
AttachNotSupportedException issue-440
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| [root@region-168-1-228 ~]# java -jar arthas-boot.jar [INFO] arthas-boot version: 3.1.7 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 13120 org.apache.hadoop.hdfs.server.datanode.DataNode [2]: 13617 org.apache.hadoop.yarn.server.nodemanager.NodeManager [3]: 13619 org.apache.hadoop.hbase.regionserver.HRegionServer [4]: 13620 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager [5]: 1124 org.apache.zookeeper.server.quorum.QuorumPeerMain [6]: 13118 org.apache.hadoop.hdfs.qjournal.server.JournalNode [7]: 44015 com.cloudera.kafka.wrap.Kafka 4 [INFO] Start download arthas from remote server: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.7/arthas-packaging-3.1.7-bin.zip [INFO] Download arthas success. [INFO] arthas home: /root/.arthas/lib/3.1.7/arthas [INFO] Try to attach process 13620 [ERROR] Start arthas failed, exception stack trace: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106) at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78) at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250) at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:85) at com.taobao.arthas.core.Arthas.<init>(Arthas.java:28) at com.taobao.arthas.core.Arthas.main(Arthas.java:123) [ERROR] attach fail, targetPid: 13620
|
根据意见参考,执行 arthas 使用 yarn 用户执行的解决
参考链接