写点什么

Hadoop 定位问题日志跟踪

发布于: 2021 年 05 月 21 日
Hadoop定位问题日志跟踪

1. 问题重塑

进去需要在 Hadoop 集群上进行写磁盘的策略,由于 hadoop 两块数据磁盘大小不一致,导致运行时小盘容易被写满,导致 yarn 异常,为此需要修改磁盘策略为选择策略,想通过修改原始的 RoundRobinVolumeChoosingPolicy 策略为 AvailableSpaceVolumeChoosingPolicy 策略修改配置如下:


<property>    <name>dfs.datanode.fsdataset.volume.choosing.policy</name>    <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>    <description>      datanode数据副本存放的磁盘选择策略,有2种方式:      一种是轮询方式(org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy,为默认方式)      另一种为选择可用空间足够多的磁盘存储方式,这个为了防止各个节点上的各个磁盘的存储均匀采用这个方式。    </description>  </property>  <property>    <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>    <value>912680550400</value>    <description>      850G      当在上面datanode数据副本存放的磁盘选择可用空间足够多的磁盘存储方式开启时,此选项才生效。      这个参数主要功能是:      首先计算出两个值,算出一个节点上所有磁盘中具有最大可用空间,另外一个值是所有磁盘中最小可用空间,      如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本,      如果比这个阀值大的话则还是选择可用空间足够多的磁盘存储方式。此项默认值为10737418240即10G    </description>  </property>  <property>    <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name>    <value>0.65f</value>    <description>     默认值是0.75f,一般使用默认值就行。具体解析:有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。     该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,     而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。    </description>  </property>
复制代码


修改完后进行入库测试,发现盘写得比例并不是想象与配置的 0.65f 的比例



那么这时候就想 debug 看一下,搜遍了,没有一个完整的教程, 我这里出一个比较详细直接上手的操作。

2. hdfs 远程调试(idea)

2.1 确定 debug 那个模块

我们先看策略是属于那个模块,发现属于源码中 hdfs 模块 AvailableSpaceVolumeChoosingPolicy,与磁盘读写有关,那 datanode 模块没错


2.2 配置并启动 datanode(被调试者)

修改 etc/hadoop/hadoop-env.sh,设置 HADOOP_OPTS:


#export  HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"export  HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888 -Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
复制代码


重新启动 datanode:


hadoop-daemon.sh stop datanodehadoop-daemon.sh start datanode
复制代码



查看 log:


tailf /home/bigdata/poseidon_2.2.0/compenents/hadoop-2.7.3/logs/hadoop-root-datanode-node182.out
复制代码

2.3 配置 IDEA(调试器)

IDEA 中打开对应版本的 hadoop 源码(2.7.3)。Run->Edit Configurations,左上角的+号选择 Remote,主要配置主机 localhost、端口 8888:



配置项做简单说明:-agentlib:jdwp:使用 JDWP 实现远程调试,包含若干子选项。transport=dt_socket:调试器和被调试者之间使用套接字传输。server=y:启动的 JVM 是接收调试请求的被调试者(IDEA 上启动的是发出请求的调试器,会存在一个 server=n 的进程)。suspend=y:启动的 JVM 会暂停等待,直到调试器连接上才继续执行,因此启动 datanode 时才能“hang 住”,等待我们启动调试器(这里与 IDEA 提供的配置是 suspend=n,我习惯用 suspend=y)。address=8888:被调试者在 8888 端口上监听调试请求。

2.4 设置断点

沿着在 AvailableSpaceVolumeChoosingPolicy 类的主要方法设置几个断点:演示基本的调试交互


2.5 开始 debug

调试器 IDEA 中,Run->Debug,选择刚刚配置的 HDFS 参数




停在断点:



经过了一顿追踪发现 其实开启 debug 日志即可关注到底想 low 还是 high 的磁盘进行写数据。关键日志如下:AvailableSpaceVolumeChoosingPolicy 类


3. 开启 debug 日志

3.1 看日志级别

先看一下日志级别:


http://172.16.129.184:60070/logLevel
复制代码


3.2 调整日志级别为 debug

设置datanode日志等级为debug:hadoop daemonlog -setlevel node182:50075 datanode DEBUGhadoop daemonlog -setlevel node117:50075 datanode DEBUGhadoop daemonlog -setlevel node183:50075 datanode DEBUG
查看当前datanode日志等级:hadoop daemonlog -getlevel node182:50075 datanodehadoop daemonlog -getlevel node117:50075 datanodehadoop daemonlog -getlevel node183:50075 datanode
复制代码


3.3 过滤我们想要的日志

cd $HADOOP_LOGgrep -rn "from high available space volumes for write of block size" .| wc -lgrep -rn "from low available space volumes for write of block size" .| wc -l
复制代码


来看高盘与低盘写得是否相对均衡,按 0.65 比例来写得



发现并不均衡,但是等了一定时间后发现又相对均衡



最终发现先开始写的元数据,一场乌龙,还是比较均衡的。


4. 总结

是不是简单容易上手呢。

发布于: 2021 年 05 月 21 日阅读数: 12
用户头像

还未添加个人签名 2019.02.22 加入

还未添加个人简介

评论

发布
暂无评论
Hadoop定位问题日志跟踪