hadoop是一个适合大数据处理的分布式的存储以及计算平台,我我的感受称他为平台是 很是贴切的,由于不论是hive、hbase等这类产品都是须要依赖hadoop的两个核心hdfs和mapreduce。hdfs和mapreduce是hadoop平台的基础核心,其中hdfs是负责大数据的分布式存储,而mapreduce是数据处理的计算框架。下面就开始记录hdfs,mapreduce后面再记录咯。 node
对于HDFS,我我的感受就是架构在操做系统平台上面的一个文件管理系统,跟操做系统的文件系统不一样的是他具备了对文件的自动的分布式管理的能力,不过这一切对于用户来讲都是透明的,好比咱们向hdfs put一个文件时他会根据咱们的设置对该文件产生replication,这里只是说他的分布式存储,为了更适合大数据的处理,hdfs也有本身的机制。 安全
如下是我记录的知识点,以便往后复习,写得有点乱,只为记录,不为出名!!!哈哈哈哈~~~~ 架构
当集群启动的时候,默认进入安全模式。默认30秒会自动退出。 框架
在安全模式下,只能读,不能写。 分布式
dfsadmin -safemode get|enter|leave oop
若是遇到集群刚刚启动,就马上执行写操做,系统会报错。 大数据
安全模式给了系统一个初始化的时间。 spa
clrQuota 取消 操作系统
setSpaceQuota 限制某个目录的空间大小。 日志
clrSpaceQuota 取消
hdfs dfs -count -q /lisi 查看配置设置的值
分布式的文件系统,意味着数据存储在不少节点上。
NameNode用来管理元数据自己。DataNode用来管理数据自己。
管理元数据的节点。管理着文件(夹)的元数据,如权限、全部者、所在组、大小、最后访问时间、最后修改时间、名称、配额。
客户端在访问数据的时候,首先和NameNode打交道。元数据信息位于fsimage文件中,fsimage是hdfs状态的体现。当集群启动的时候,fsimage中的信息加载到内存中。
edits中保存的是操做日志。edits是hdfs 事务的体现。
在hdfs-site.xml中,配置dfs.namenode.name.dir的值,是多个都好分隔的目录列表。fsimage内容就会同时存储在多个目录中,实现数据安全。
在hdfs-site.xml中,配置dfs.namenode.edits.dir的值,是${dfs.namenode.name.dir}。
若是机器宕机,以上方案就无效了。实现NameNode的HA功能。
实现数据的存储。不少的节点,每一个节点都是DataNode。
DataNode存储数据的时候,都是以block形式存储。
block是DataNode存储数据的基本单位,相似于快递公司的包裹。
为了节省空间,通常只会规定包裹的最大尺寸,不会规定标准尺寸,hdfs的block也是这个原理。block的最大尺寸是128MB,没有最小尺寸。
当一个12k的数据存放到一个block中时,该block只占用12k的磁盘物理空间。
在前面看fsimage的内容时,发现每一个文件都有block对应。fsimage的内容在集群运行时,存放在内存中。每一个文件会产生至少一个block。当小文件很是多的时候,对Namenode节点的内存产生什么影响?多耗费内存,形成内存压力大。 因此hdfs不适合存储大量的小文件
当namenode -format命令执行的时候,在namenode节点和datanode节点的VERSION中都会产生一个namespaceID值,而且这两个值必须相同。若是再次执行格式化,那么namenode会产生一个新的namespaceID,可是datanode不会产生新的值。
读写与生活的举例:去客户现场解决问题,我(客户端)须要去询问项目经理(namenode)客户的地址等信息,项目经理告诉我(block location等),我就能够去客户现场,我告诉客户解决了,客户须要确认解决了才是真正的解决,我再去跟项目经理报告。
Hdfs的读写其实跟普通的文件系统读写基本上同样,只是多了一个中间的注册。就像咱们单身的时候花钱本身怎么花均可以,可是结了婚就须要先经过媳妇那才能够咯
Namenode维护者两张表(从namenode源码得知),一张是文件与block块的映射(blockid,能够在fsimage文件中看到,存在本地磁盘),另外一张是block块和磁盘的映射(体现为inode,既是每个块与块所在datanode磁盘的位置,在每次hdfs启动时都要从新生成,其实就是每次启动进入安全模式的时候datanode向namenode报告的块信息)即:filename—blocksequence block—node 前者是静态的(一旦改变会影响数据的信息不对应) 后者是动态的(分布式状况下,节点宕机是常态,则须要更新对应关系)
Slaves文件只是在集群启动的时候使得可以一块儿启动datanode节点,即便slaves文件不正常,也只是在启动namenode时没法启动datanode,手动启动datanode时也是能够正常使用的,由于他们的vision文件中的namespaceID是相同的