
hdfs源码
文章平均质量分 56
星尘之子
心之所向,素履以往;生如逆旅,一苇以航
展开
-
NN启动测试优化遇到的问题汇总3
2 应用启动优化代码后遇到的问题1.1 优化后的性能反而比优化前差问题场景:改造namenode启动时加载fsimage文件的逻辑,将串行加载改成了并行加载,并行加载启动了4个线程。但是最后测出来的结果却是优化前的耗时更短原因:当时排查了内存、cpu、io,都不是瓶颈,又深入代码层面,模拟由于并行增加的加锁逻辑的耗时,发现即使争用锁会有一点性能消耗,但是无论如何也抵消不了并行带来的性能提升。后来发现了问题所在,我在查看cpu使用率时是通过prometheus采集到的jmx指标,但是忽略了nameno原创 2021-04-30 17:55:28 · 235 阅读 · 1 评论 -
NN启动测试优化遇到的问题汇总2
1.3 文件写入速度明显下降问题场景:在写入5000w文件后,发现之后的写入速度很慢,之前每秒能写六七百个文件,现在每秒只能写几十个文件,甚至个位数的文件。排查CPU、网络和内存都不是瓶颈。原因:在排查datanode的io时,发现了一个奇怪的现象,读io很高(每秒数万个读请求),写io很低(每秒几十个写请求),集群明明一直在写文件,并没有读的操作,怎么会出现如此反常的现象?通过top查看cpu使用率高的几个进程,发现排在前两位的居然是两个du进程,第三位的才是datanode进程。通过查阅资料和阅读原创 2021-04-30 17:54:55 · 699 阅读 · 1 评论 -
NN启动测试优化遇到的问题汇总
hadoop-2.8.51 写文件时遇到的问题1.1 出现大量Under-Replicated Blocks问题场景:写入1000w 4kB大小的文件时,出现大量Under-Replicated的block(默认3副本,大量2副本)。经排查,网络、内存、io和cpu都不是瓶颈。原因:最后定位出和代码中判断DN是否负载过大的逻辑有关。配置项"dfs.namenode.replication.considerLoad"默认为true,代表需要考虑DN的负载情况。NN首先根据放置策略选择放置副本原创 2021-04-30 17:53:41 · 526 阅读 · 1 评论 -
Namenode启动流程优化跟踪
主:14617加载fsimage是单线程的过程分区中创建子分区,每个子分区一个线程测试:316M inodes 35G磁盘数据Threads 1 2 3 4 --------------------------------inodes 448 290 226 189 inode_dir 326 211 170 161 Total 927 651 535 488 (MD5 calculation ab原创 2021-03-21 22:37:20 · 145 阅读 · 0 评论 -
2021-03-11
2.5 watcher和callbackzk客户端和zk集群之间会用到watcher机制,watcher的作用是监控连接变化和节点变化,在这个系统中有两个地方会注册watchernew Zookeeper()构造zk客户端对象时注册的watcher:不是一次性的,只当连接状态变化时被触发zkclient.exists()方法中传入的watcher:这个方法在joinElection尝试创建锁节点或锁节点数据变化后会在monitorActiveStatus()方法中被调用,因为这个watcher是一次原创 2021-03-11 20:23:41 · 104 阅读 · 0 评论 -
2021-03-11
3 切换耗时研究这里的切换耗时指发生HA切换,hadoop不能正常提供服务的时间。3.1 kill ANN切换时间服务不可用起始时间(ANN被kill时):2021-03-09 15:47:18,732 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: RECEIVED SIGNAL 15: SIGTERM切换成功时间(SNN成功切换为ANN时):2021-03-09 15:47:29,661 INFO org.apache.hadoo原创 2021-03-11 20:22:48 · 226 阅读 · 0 评论 -
2021-03-11
2.2 线程模型由上图可以看出,整个系统中有3类线程:主线程:在启动所有服务后开始循环等待HealthMonitor线程:定期检查NN服务状态和健康状况,并在服务状态和健康状态发生变化时与ActiveStandbyElector交互完成HA过程zk客户端线程:监控zookeeper上结点的状态,发生变化时,回调ZKFailoverController的回调函数,通知ZKFailoverController,做出相应的变化2.3 RPC代理对象从上图可以看出,有3类RPC代理对象:pro原创 2021-03-11 20:21:37 · 396 阅读 · 0 评论 -
2021-03-10
1.8 删除/hadoop-ha/hdfsHACluser节点及其子节点现象:两个Namenode都为Standby状态解释:两个Namenode被kill后,健康状态变为SERVICE_NOT_RESPONDING,运行quitElection方法,删除znode,销毁zookeeper客户端对象两个Namenode重新上线后,HealthMonitor检测到健康状态为HEALTHY,会调用joinElection方法,尝试创建/hadoop-ha/hdfsHACluster/ActiveSta原创 2021-03-10 20:33:05 · 138 阅读 · 0 评论 -
2021-03-10
zk客户端会产生两种类型的watchernew Zookeeper()构造zk客户端对象时注册的watcher:不是一次性的,只当连接状态变化时被触发zkclient.exists(),监控锁节点方法注册的watcher:一次性,当监控节点增(create)、删(delete)、改(set)时被触发3类线程主线程:在启动所有服务后开始循环等待HealthMonitor线程:定期检查NN服务状态和健康状况zk客户端线程:监控zookeeper上结点的状态,发生变化时,回调ZKFailover原创 2021-03-10 20:32:10 · 187 阅读 · 0 评论 -
hadoop ha异常场景解释
正常启动流程:入口为DFSZKFailoverController的main()方法,总体流程在ZKFailoverController类的doRun()方法。在doRun()方法中定义了如下动作:initZK()解析zookeeper的相关配置,构造ActiveStandbyElector对象,在ActiveStandbyElector构造方法中创建了zookeeper集群的客户端对象,连接了zookeeper集群,在zookeeper客户端对象中关联了watch,作用是当连接发生变化或者zno原创 2021-03-07 23:45:00 · 1135 阅读 · 0 评论 -
HDFS文件目录结构详解
Namenode中主要存储fsimage和editlog文件,Datanode中主要存储数据块blk文件。下面分别介绍Namenode和Datanode中的文件存储结构。文章目录1 Namenode1.1 文件所在位置1 Namenode1.1 文件所在位置文件所在位置由hdfs-site.xml中的配置项dfs.namenode.name.dir配置。这些文件都存于${dfs.namenode.name.dir}/current文件夹下,在dfs.namenode.name.dir配置项中可以配置原创 2020-11-22 09:11:03 · 6503 阅读 · 0 评论 -
RPC服务端Server
源头:1 NameNode的initialize方法中会构造NameNodeRpcServer对象rpcServer,在NameNodeRpcServer构造方法中会构造Server对象。即第1步会调用Server的构造方法。2 NameNode的initialize方法中会调用startCommonService方法,该方法中会调用rpcServer.start(),rpcServer.start()方法又会调用第1步构造的Server对象的start方法。即第2步会调用Server的start方法。原创 2020-11-13 19:08:00 · 1410 阅读 · 0 评论 -
HDFS RPC客户端处理流程详解
源头:在ProtobufRpcEngine.Invoker的invoke()方法中会调用client.call()方法。将RPC请求信息封装成一个Call对象创建Connection对象管理客户端和服务端的Socket连接Call对象会放入Connection.calls字段中Connection对象会放入Client.connections字段中以供复用。通过Connection.setupIOstreams()方法建立客户端与服务端的Socket的连接setup原创 2020-11-13 19:03:56 · 472 阅读 · 0 评论 -
Hadoop RPC详解
文章目录1 定义RPC协议2 实现RPC协议2.1 真实现(服务端)2.2 假实现(客户端)3 client端获得代理对象3.1 NonHA proxy3.2 (todo)HA proxy4 server端启动监听5 总结5 总结 Hadoop中使用RPC的场景很多,比如client和Namenode之间,Namenode和Datanode之间,Namenode和Namenode之间等等。本文只讨论client和Namenode之间的RPC机制,把这一种搞懂了,其它几种也迎刃而解,因为都是同样的道理。H原创 2020-11-07 22:56:55 · 522 阅读 · 0 评论 -
editLog刷盘时机和日志重置
文章目录1 刷盘时机2 日志重置2.1 ANN端触发2.2 SNN端触发2.2.1 EditLogTailerThread线程的启动2.2.2 EditLogTailerThread线程run()方法2.2.2.1 编辑日志重置2.2.2.2 编辑日志追踪3 总结 用户对命名空间的修改(包括创建、删除、写入等)都会被记录到editlog文件中,但一开始是记录在缓冲区的,它是什么情况下从缓冲区刷到磁盘上是我们接下来要讨论的第一个问题,具体见刷盘时机一节。另外,即使我们对命名空间没做任何修改,ANN(Act原创 2020-11-01 15:39:29 · 902 阅读 · 0 评论 -
HDFS RPC客户端和服务端流程解析
Namenode端会有Server对象一直监听RPC请求,我们先来看一下这个Server对象是何时被构造的。在Namenode启动的时候,构造方法中会调用initialize()方法,在initialize()方法中会调用createRpcServer()方法,createRpcServer()方法则直接构造一个NameNodeRpcServer对象并返回。下面我们看一下NameNodeRpcServer的构造方法。在NameNodeRpcServer的构造方法中会构造一个ProtobufRpcEn原创 2020-09-15 18:34:21 · 400 阅读 · 0 评论 -
RPC3
2.4 服务端获取服务对象serverNamenode会在它的初始化方法initialize()方法中调用createRpcServer()方法创建NameNodeRpcServer对象的实例。createRpcServer()方法会直接调用NameNodeRpcServer的构造方法。NameNodeRpcServer的构造方法很长,因为它实现了多个接口,如果我们只关注与ClientProtocol相关的代码,则构造方法中的流程可以分为两个部分:获取响应ClientNamenodeProtoc原创 2020-09-06 21:16:40 · 227 阅读 · 0 评论 -
RPC2
2 Hadoop RPC使用抽象 Hadoop RPC框架的使用可以抽象成以下几个步骤:定义RPC协议 实现RPC协议 客户端获取代理对象proxy 服务端获取服务对象server2.1 定义RPC协议 ClientProtocol协议定义了HDFS客户端与名字节点交互的所有方法,但是ClientProtocol协议中方法的参数是无法在网络中传输的,需要对参数进行序列化操作,所以HDFS又定义了ClientNamenodeProtocolPB协议。ClientNa...原创 2020-09-06 21:15:04 · 451 阅读 · 1 评论 -
HDFS租约机制
目录1 租约介绍... 11.1 LeaseManager 11.2 Lease. 21.3 Monitor 21.4 LeaseRenewer 21.5 时间参数... 22 租约恢复... 32.1 recoverLeaseInternal() 32.2 internalReleaseLease() 43 一个场景... 44 注意的点... 5原创 2020-09-05 17:39:02 · 817 阅读 · 0 评论 -
RPC1
1 Hadoop RPC概述是什么 RPC:Remote Procedure CallProtocol,远程过程调用协议。有什么用允许本地程序像调用本地方法一样调用远程机器上应用程序提供的服务。为什么引入 Hadoop作为分布式存储系统,各个节点之间的通信和交互是必不可少的,所以需要实现一套节点间的通信交互机制。Hadoop中RPC特性 Hadoop RPC框架并没有使用JDK自带的RMI(Remote Method Invocation,...原创 2020-09-05 17:35:51 · 275 阅读 · 0 评论