Hadoop3.2.1 【 HDFS 】源码分析 :FSDirectory类解析
Table of Contents
一.前言.
二.构造方法
三.常量
四.方法
一.前言.
Namenode最重要的两个功能之一就是维护整个文件系统的目录树(即命名空间namesystem) 。 HDFS文件系统的命名空间(namespace) , 也就是以“/”为根的整个目录树, 是通过FSDirectory类来管理的。 FSNamesystem也提供了管理目
录树结构的方法, 但FSNamesystem中的方法多是调用FSDirectory类的实现,FSNamesystem在FSDirectory类方法的基础上添加了editlog日志记录的功能。 而FSDirectory的操作则全部是在内存中进行的, 并不进行editlog的日志记录。
FSDirectory的设计使用了门面(Facade) 模式, 门面模式是指提供一个统一的接口去访问多个子系统的多个不同的接口, 它为子系统中的一组接口提供一个统一的高层接口, 使得子系统更容易使用
二.构造方法
序号 | 参数 | 默认值 | 含义 |
1 | dfs.permissions.enabled | true | 权限,默认开启 |
2 | dfs.permissions.superusergroup | supergroup | 超级用户组 |
3 | dfs.namenode.acls.enabled | false | 设置为true以启用对HDFS ACL(访问控制列表)的支持。 默认情况下,禁用ACL。 禁用ACL时,NameNode拒绝与设置或获取ACL相关的所有RPC。 |
4 | dfs.ls.limit | 1000 | 限制ls打印的文件数量。 如果小于或等于零,将最多打印DFS_LIST_LIMIT_DEFAULT(= 1000)。 |
5 | dfs.content-summary.limit | 5000 | 一个锁定期内允许的最大内容摘要计数。 0或负数表示没有限制 |
6 | dfs.content-summary.sleep-microsec | 500 | 在内容摘要计算中重新获得锁定之间的使线程进入睡眠状态的时间长度(以微秒为单位) |
7 | dfs.namenode.fs-limits.max-component-length | 255 | 定义路径的每个组件中以UTF-8编码的最大字节数。 值为0将禁用检查。 |
8 | dfs.namenode.fs-limits.max-directory-items | 1024 * 1024 ≈100 万 |
定义目录可以包含的最大项数。无法将属性设置为小于1或大于6400000的值。 |
9 | dfs.namenode.fs-limits.max-xattrs-per-inode | 32 | |
10 | final int MAX_DIR_ITEMS | 64 * 100 * 1000= 640万 |
我们需要一个最大最大值,因为默认情况下, [ dfs.namenode.fs-limits.max-directory-items的最大值] |
11 | dfs.namenode.name.cache.threshold | 10 | 经常访问的文件的访问次数超过此阈值的次数被缓存在FSDirectory nameCache中。 |
FSDirectory(FSNamesystem ns, Configuration conf) throws IOException {this.dirLock = new ReentrantReadWriteLock(true); // fairthis.inodeId = new INodeId();rootDir = createRoot(ns);inodeMap = INodeMap.newInstance(rootDir);// 权限: 默认开启 ==> dfs.permissions.enabled : truethis.isPermissionEnabled = conf.getBoolean( DFSConfigKeys.DFS_PERMISSIONS_ENABLED_KEY, DFSConfigKeys.DFS_PERMISSIONS_ENABLED_DEFAULT);// dfs.permissions.ContentSummary.subAccess : falsethis.isPermissionContentSummarySubAccess = conf.getBoolean(DFSConfigKeys.DFS_PERMISSIONS_CONTENT_SUMMARY_SUBACCESS_KEY,DFSConfigKeys.DFS_PERMISSIONS_CONTENT_SUMMARY_SUBACCESS_DEFAULT);this.fsOwnerShortUserName =UserGroupInformation.getCurrentUser().getShortUserName();/// dfs.permissions.superusergroup : supergroupthis.supergroup = conf.get(DFSConfigKeys.DFS_PERMISSIONS_SUPERUSERGROUP_KEY,DFSConfigKeys.DFS_PERMISSIONS_SUPERUSERGROUP_DEFAULT);// dfs.namenode.acls.enabled : falsethis.aclsEnabled = conf.getBoolean(DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_KEY,DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_DEFAULT);LOG.info("ACLs enabled? " + aclsEnabled);this.posixAclInheritanceEnabled = conf.getBoolean(DFSConfigKeys.DFS_NAMENODE_POSIX_ACL_INHERITANCE_ENABLED_KEY,DFSConfigKeys.DFS_NAMENODE_POSIX_ACL_INHERITANCE_ENABLED_DEFAULT);LOG.info("POSIX ACL inheritance enabled? " + posixAclInheritanceEnabled);this.xattrsEnabled = conf.getBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY,DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_DEFAULT);LOG.info("XAttrs enabled? " + xattrsEnabled);this.xattrMaxSize = conf.getInt(DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_KEY,DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_DEFAULT);Preconditions.checkArgument(xattrMaxSize > 0,"The maximum size of an xattr should be > 0: (%s).",DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_KEY);Preconditions.checkArgument(xattrMaxSize <=DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_HARD_LIMIT,"The maximum size of an xattr should be <= maximum size"+ " hard limit " + DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_HARD_LIMIT+ ": (%s).", DFSConfigKeys.DFS_NAMENODE_MAX_XATTR_SIZE_KEY);this.accessTimePrecision = conf.getLong(DFS_NAMENODE_ACCESSTIME_PRECISION_KEY,DFS_NAMENODE_ACCESSTIME_PRECISION_DEFAULT);//dfs.storage.policy.enabled : truethis.storagePolicyEnabled =conf.getBoolean(DFS_STORAGE_POLICY_ENABLED_KEY,DFS_STORAGE_POLICY_ENABLED_DEFAULT);this.quotaByStorageTypeEnabled =conf.getBoolean(DFS_QUOTA_BY_STORAGETYPE_ENABLED_KEY,DFS_QUOTA_BY_STORAGETYPE_ENABLED_DEFAULT);// dfs.ls.limit : 1000int configuredLimit = conf.getInt(DFSConfigKeys.DFS_LIST_LIMIT, DFSConfigKeys.DFS_LIST_LIMIT_DEFAULT);this.lsLimit = configuredLimit>0 ?configuredLimit : DFSConfigKeys.DFS_LIST_LIMIT_DEFAULT;// dfs.content-summary.limit : 5000this.contentCountLimit = conf.getInt(DFSConfigKeys.DFS_CONTENT_SUMMARY_LIMIT_KEY,DFSConfigKeys.DFS_CONTENT_SUMMARY_LIMIT_DEFAULT);//dfs.content-summary.sleep-microsec 500this.contentSleepMicroSec = conf.getLong(DFSConfigKeys.DFS_CONTENT_SUMMARY_SLEEP_MICROSEC_KEY,DFSConfigKeys.DFS_CONTENT_SUMMARY_SLEEP_MICROSEC_DEFAULT);// filesystem limits// 路径最大长度: dfs.namenode.fs-limits.max-component-length : 255this.maxComponentLength = conf.getInt(DFSConfigKeys.DFS_NAMENODE_MAX_COMPONENT_LENGTH_KEY,DFSConfigKeys.DFS_NAMENODE_MAX_COMPONENT_LENGTH_DEFAULT);// 目录最大数量 1024 * 1024 = 1048576 ≈ 100 万// dfs.namenode.fs-limits.max-directory-items : 1024 * 1024this.maxDirItems = conf.getInt(DFSConfigKeys.DFS_NAMENODE_MAX_DIRECTORY_ITEMS_KEY,DFSConfigKeys.DFS_NAMENODE_MAX_DIRECTORY_ITEMS_DEFAULT);// dfs.namenode.fs-limits.max-xattrs-per-inod: 32// inode的属性最大限制 32this.inodeXAttrsLimit = conf.getInt(DFSConfigKeys.DFS_NAMENODE_MAX_XATTRS_PER_INODE_KEY,DFSConfigKeys.DFS_NAMENODE_MAX_XATTRS_PER_INODE_DEFAULT);this.protectedDirectories = parseProtectedDirectories(conf);Preconditions.checkArgument(this.inodeXAttrsLimit >= 0,"Cannot set a negative limit on the number of xattrs per inode (%s).",DFSConfigKeys.DFS_NAMENODE_MAX_XATTRS_PER_INODE_KEY);// 我们需要一个最大最大值,因为默认情况下,// PB将message大小限制为64MB。// 这意味着每个目录只能存储大约670万个条目,// 但是为了安全起见,请使用640万个条目。// We need a maximum maximum because by default, PB limits message sizes// to 64MB. This means we can only store approximately 6.7 million entries// per directory, but let's use 6.4 million for some safety.final int MAX_DIR_ITEMS = 64 * 100 * 1000;Preconditions.checkArgument(maxDirItems > 0 && maxDirItems <= MAX_DIR_ITEMS, "Cannot set "+ DFSConfigKeys.DFS_NAMENODE_MAX_DIRECTORY_ITEMS_KEY+ " to a value less than 1 or greater than " + MAX_DIR_ITEMS);// dfs.namenode.name.cache.threshold: 10// 经常访问的文件的访问次数超过此阈值的次数被缓存在FSDirectory nameCache中。int threshold = conf.getInt(DFSConfigKeys.DFS_NAMENODE_NAME_CACHE_THRESHOLD_KEY,DFSConfigKeys.DFS_NAMENODE_NAME_CACHE_THRESHOLD_DEFAULT);NameNode.LOG.info("Caching file names occurring more than " + threshold+ " times");nameCache = new NameCache<ByteArray>(threshold);namesystem = ns;this.editLog = ns.getEditLog();ezManager = new EncryptionZoneManager(this, conf);this.quotaInitThreads = conf.getInt(DFSConfigKeys.DFS_NAMENODE_QUOTA_INIT_THREADS_KEY,DFSConfigKeys.DFS_NAMENODE_QUOTA_INIT_THREADS_DEFAULT);initUsersToBypassExtProvider(conf);}
三.常量
■ INodeDirectory rootDir: 整个文件系统目录树的根节点, 是INodeDirectory类型的 。
■ FSNamesystem namesystem: Namenode的门面类, 这个类主要支持对数据块进行操作的一些方法, 例如addBlock()。
■ INodeMap inodeMap: 记录根目录下所有的INode,并维护INodeId ->INode的映射关系。
■ ReentrantReadWriteLock dirLock: 对目录树以及inodeMap字段操作的锁。
■ NameCache<ByteArray> nameCache: 将常用的name缓存下来, 以降低byte[]的使用, 并降低JVM heap的使用
四.方法
FSDirectory类中的方法相当多, 主要是封装了对文件系统目录树的操作, 例如增、删、 改、 查等。 基本上ClientProtocol中的方法, 都能在FSDirectory中找到对应的方法。
这个太多了就不罗列了,其实就是对目录层级权限的操作..
Hadoop3.2.1 【 HDFS 】源码分析 :FSDirectory类解析相关推荐
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...
- HDFS源码分析心跳汇报之数据结构初始化
在<HDFS源码分析心跳汇报之整体结构>一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager.BPOfferService和BPServiceActo ...
- HDFS源码分析DataXceiver之整体流程
在<HDFS源码分析之DataXceiverServer>一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer.它被用于接收来自客户端或其他数据节 ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- hdfs源码分析第二弹
以写文件为例,串联整个流程的源码: FSDataOutputStream out = fs.create(outFile); 1. DistributedFileSystem 继承并实现了FileSy ...
- Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 一
搭建nginx服务器时,主要的配置文件 nginx.conf 是部署和维护服务器人员经常要使用到的文件, 里面进行了许多服务器参数的设置.那么nginx 以模块 module为骨架的设计下是如何运用模 ...
- jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + div.aaron input[type="checkb ...
- spring Quartz 源码分析--触发器类CronTriggerBean源码剖析
前面我们讲到了Quartz框架在项目中的实现,在Quartz中的重要API有两个重要的触发器类:CronTrigger 和SimpleTrigger 在Quartz框架中这两个触发器都继承了一个抽象基 ...
- hdfs源码分析第一弹
1. hdfs定义 HDFS is the primary distributed storage used by Hadoop applications. A HDFS cluster primar ...
最新文章
- HarmonyOS Text设置换行
- python3.7安装-Linux安装python3.7
- PHP程序员应该掌握的10项技能
- java中的Calendar
- JAVA中Final的用法
- 数据库中的DML,DCL,DDL分别是那些操作?
- 如何使用 git 更新branch到master最新状态
- 【深圳】.NET 技术分享交流会
- dp 1.4协议_浅析关于HDMI接口与DP接口
- Flutter Curves 动画曲线合辑
- 中国宽带最新速率状况报告 你家达标了吗?
- Ubuntu下Linux系统文件恢复
- 14.TCP/IP 详解卷1 --- DNS:域名系统
- sstv解码_新的业余无线电 SSTV 设备已运抵国际空间站
- 实现二叉树的序列化和反序列化
- SQL知识(浓缩版)快速入门(基础语法、概念)
- STM32中USART串口通信实验
- codevs1253 超级市场(dp)
- Excel--认识Excel
- python爬数据是什么意思-这python爬虫是什么意思?爬虫怎么抓取数据?