0%

记一次 Arthas 实操

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 用户执行的解决


参考链接