hadoop是一个适合大数据处理的分布式的存储以及计算平台,我个人感觉称他为平台是 非常贴切的,因为不管是hive、hbase等这类产品都是需要依赖hadoop的两个核心hdfs和mapreduce。hdfs和mapreduce是hadoop平台的基础核心,其中hdfs是负责大数据的分布式存储,而mapreduce是数据处理的计算框架。下面就开始记录hdfs,mapreduce后面再记录咯。
对于HDFS,我个人感觉就是架构在操作系统平台上面的一个文件管理系统,跟操作系统的文件系统不同的是他具有了对文件的自动的分布式管理的能力,不过这一切对于用户来说都是透明的,比如我们向hdfs put一个文件时他会根据我们的设置对该文件产生replication,这里只是说他的分布式存储,为了更适合大数据的处理,hdfs也有自己的机制。
以下是我记录的知识点,以便日后复习,写得有点乱,只为记录,不为出名!!!哈哈哈哈~~~~
当集群启动的时候,默认进入安全模式。默认30秒会自动退出。
在安全模式下,只能读,不能写。
dfsadmin -safemode get|enter|leave
如果遇到集群刚刚启动,就立刻执行写操作,系统会报错。
安全模式给了系统一个初始化的时间。
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是相同的