版本hadoop 2.7
分段鎖優(yōu)化
Namenode的FSNamesystem類中主要有三塊比默。
1幻捏、INodeMap中存著目錄樹的映射關(guān)系:Id -> INode
2、BlocksMap中存著塊和塊位置信息的映射信息命咐。Block -> BlockInfo
采用全局讀寫鎖
// lock to protect the directory and BlockMap
private final ReentrantReadWriteLock dirLock;
3篡九、DataNode Manager : 用于對(duì)DataNode進(jìn)行管理。
hadoop3.0
實(shí)現(xiàn)鎖優(yōu)化醋奠,采用分段鎖榛臼,首先,鎖的范圍減小了窜司,避免了全局鎖限制沛善。其次,每個(gè)鎖之間的操作都是獨(dú)立的塞祈,各個(gè)鎖區(qū)間的操作金刁,可以并行進(jìn)行。
RangeMap: keyRange -> GSet
RangeSet: key -> INode
EditDoubleBuffer瞬時(shí)高并發(fā)導(dǎo)致短暫不可用议薪,優(yōu)化
背景
巡查nn日志發(fā)現(xiàn)大量的waite操作尤蛮,追溯源碼發(fā)現(xiàn)了EditDoubleBuffer的內(nèi)存交換機(jī)制
EditDoubleBuffer
1、思路就是擴(kuò)大默認(rèn)的size斯议,帶來的問題就是斷電導(dǎo)致數(shù)據(jù)丟失产捞,也是一種的權(quán)衡
EditLogBackupOutputStream.java
static final int DEFAULT_BUFFER_SIZE = 256
QuorumOutputStream.java
private int outputBufferCapacity = 512 * 1024;
2、添加自定義key
DFSConfigKeys.java //hdfs-site.xml讀取哼御,配置指定值
public static final String DFS_NAMENODE_BUFFER_KEY = "dfs.namenode.quorum.buffer.value";
public static final int DFS_NAMENODE_QUROUM_BUFFER_VALUE_DEFALUT = 512 * 1024;
public static final String DFS_NAMENODE_BUFFER_KEY = "dfs.namenode.local.buffer.value";
public static final int DFS_NAMENODE_LOCAL_BUFFER_VALUE_DEFALUT = 256;
3坯临、直接進(jìn)行.class替換
hadoop-hdfs-2.7.3.2.6.5.0-292.jar