思考:
1、HDFS的架构,各个组件的作用(namenode和datanode)
扩展性(namenode采取联邦HDFS,datanode可以按需扩展);
容错机制(写n份和namenode的容灾)
1、Hadoop包含一个完整的生态圈
Hive 数据仓库
HDFS 分布式文件系统
MapReduce 并行调度框架
2、MapReduce过程
Mapper和Reduce的入参和出参都是key/value
三、HDFS
1、HDFS性质
- 支持超大文件,甚至支持PB
- 廉价硬件
- 数据访问延迟可能不是很低.因为HDFS最求的是吞吐量,所以可能延迟稍大,如果要求延迟低,可以使用HBASE。
- 集群里面的文件的元信息(目录,文件名等)存储在namenode的内存里面,所以整个集群里面支持的文件的个数就是内存所能存储的元信息的上限。支持上百万文件是可行的,但是上亿文件已经超出了内存的限制。
- 多用户写入、任意修改文件 不知持多个写入者的操作,对文件的操作不支持随机写,只支持对文件进行附加。文件可能只有一个writer,而且只支持文件进行末尾附加,不支持随机写入。
2、HDFS数据块
对分布式文件系统中的块进行抽象,块的大小默认为64M。对块的抽象和真实的存储子系统是分离的。
1、磁盘的块一般是512字节,HDFS一般为64M
2、HDFS的块为什么设为64M
1、Map任务通常一次只处理一个块里面的任务,如果设的太大,并行度不够
2、磁盘读取数据首先寻道,然后再读取数据,如果设的太小,则磁盘寻道时间和读取数据时间的比值会比较大。
3、namenode和datanode
1、工作玉master-slave模式,一个namenode和多个datanode
1、namenode管理整个文件系统的命名空间。它维护着文件系统树及整棵树内的所有文件和目录。这些信息以两个文件的形式存储在本地磁盘上,命名空间镜像文件和编辑日志文件。namenode也记录每个文件中的各个块所在数据节点的信息,并不永久保存块的位置
信息。
2、datanode收客户端和namenode的调度负责存储和检索数据,并且定时的向namenode发送他们所存储的块的列表
3、没有namenode,文件系统将无法使用。如果namenode数据损坏,则整个文件系统的数据将全部无法恢复。所以对namenode的容错很重要。
4、namenode的容错机制(在实际应用中一般是通过主备实现高可用)
1、元数据进行备份,如在写入本地磁盘的同时,写入网络系统。
2、运行一个备namenode(和数据库的主备类似),因为主备之间是有数据延迟的,所以备替代主之后还是有一定的数据丢失的。
5、文件系统的扩展
集群里面只有一个namenode,可以有很多个datanode,所以文件系统的限制在namenode上。联邦HDFS可以运行多个namenode,每个namenode只负责维护整个文件系统的一部分命名空间。这样就能使得文件系统无限扩展了。
4、HDFS的安装
HDFS只有伪分布式或者完全的分布式才支持。
在实验的时候需要配置ssh免登陆,在使用之前需要先对namenode进行格式化(不涉及到datanode)。我安装的时候,碰到namenode总是起不来,后来看日志发现因为namenode持久化的目录hadoop没有权限操作,修改持久化目录而且重新格式化之后就可以了。
5、HDFS的高可用性
HDFS实际上有namenode,datanode和client3个组件,这三个组件都必须实现能感知到namenode的切换。
5、Hadoop支持很多种文件系统,HDFS只是其中的一种
6、HDFS的读写数据流,数据一致性,以及HDFS的工具(运行MapReduce)以及归档文件
四、hadoop文件系统接口
提供了一层抽象的API来访问hadoop文件系统,不论底层文件系统是hdfs还是其他的,最终的API都是相同的。
命令行访问
java接口访问:
1、java.net.URL
2、FileSystem访问
1、首先获得文件系统实例(多个重载函数)
对于HDFS返回的是DistributeFileSystem的实例
2、 调接口进行创建、删除文件、目录,读文件(FsDataInputStream),写文件(FsDataOutputStream),遍历文件和目录,根据正则表达式和filter等获得想要的文件
等
1、读文件:open()
得到FsDataInputStream实例。FsDataInputStream实现了Seekable(可以随意定位文件和得到现在距离开始的绝对位移)和PositionedReadable接口
seek是一个相对高消耗的动作,慎用
client会通过RPC向namenode发出请求,namenode向client返回网络排序的每块的datanode。client然后去读datanode的块,当块读完的时候客户端还会不断的向namenode请求剩下块的datanode。
client读取到块之后会进行验证数据是否损坏,如果损坏,client会通知namenode该数据块损坏,然后向其他备用的datanode获得数据。client在请求datanode获得数据的时候如果发生故障,client会向其他存有副本的datanode获得数据,同时在本
地存储读取该datanode的时候出现了故障,下次该client就不会再去读该块的时候就不会优先读该datanode。
2、写文件create()
得到FsDataOutputStream实例。FsDataOutputStream实现了Syncable接口,该接口能得到距离开始的绝对位置
写文件只能附加
五、IO
1、压缩
2、数据完整性之校验和
3、序列化与反序列化
hadoop的各个机器之间的通讯都是通过RPC进行的,所以序列化和反序列化对hadoop很重要,要做到语言无关,同时做到简单,紧凑。
为什么不使用java的序列化?
因为java的序列化不够紧凑和简单。
4、接口