一、Hadoop
1、MapReduce——Hadoop的核心
MapReduce是一个可以对大量数据进行分布式处理的软件框架,MapReduce的重要创新是当处理一个大数据集查询时会将其任务分解并在运行的多个节点中处理。
当数据量很大时就无法在一台服务器上解决问题,此时分布式计算优势就体现出来。将这种技术与Linux服务器结合可获得性价比极高的替代大规模计算阵列的方法。
2、HDFS
对于分布式计算,每个服务器必须具备对数据的访问能力,这就是HDFS(Hadoop Distributed File System)所起到的作用。
HDFS与MapReduce的结合是强大的
(1)在处理大数据的过程中,当Hadoop集群中的服务器出现错误时,整个计算过程并不会终止。
(2)HFDS可保障在整个集群中发生故障错误时的数据冗余。当计算完成时将结果写入HFDS的一个节点之中。
(3)HDFS对存储的数据格式并无苛刻的要求,数据可以是非结构化或其它类别。相反关系数据库在存储数据之前需要将数据结构化并定义架构。
(4)开发人员编写代码责任是使数据有意义。Hadoop MapReduce级的编程利用Java APIs,并可手动加载数据文件到HDFS之中。
3、HDFS架构
(1)Namenode
Namenode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表, 接收用户的操作请求。不可缺少。
(2)Datanode
提供真实文件数据的存储服务。 缺少一个可以由其他单位填补。
(3)block
文件块: 最基本的存储单位。
二、元数据
1、什么是元数据
2、元数据管理方式
三、shell命令
四、读写策略
1、客户端调用Fi leSystem 实例的create 方法,创建文件。NameNode 通过一些检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode 添加文件信息。注意,因为此时文件没有数据,所以NameNode 上也没有文件数据块的信息。
2、创建结束之后, HDFS 会返回一个输出流DFSDataOutputStream 给客户端。
3、客户端调用输出流DFSDataOutputStream 的write 方法向HDFS 中对应的文件写入数据。
4、数据首先会被分包,这些分包会写人一个输出流的内部队列Data 队列中,接收完数据分包,输出流DFSDataOutputStream 会向NameNode 申请保存文件和副本数据块的若干个DataNode , 这若干个DataNode 会形成一个数据传输管道。DFSDataOutputStream 将数据传输给距离上最短的DataNode ,这个DataNode 接收到数据包之后会传给下一个DataNode 。数据在各DataNode之间通过管道流动,而不是全部由输出流分发,以减少传输开销。
5、因为各DataNode 位于不同机器上,数据需要通过网络发送,所以,为了保证所有DataNode 的数据都是准确的,接收到数据的DataNode 要向发送者发送确认包(ACK Packet ) 。对于某个数据块,只有当DFSDataOutputStream 收到了所有DataNode 的正确ACK. 才能确认传输结束。DFSDataOutputStream 内部专门维护了一个等待ACK 队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。
6、不断执行第3 - 5 步直到数据全部写完,客户端调用close 关闭文件。
7、DFSDataInputStream 继续等待直到所有数据写人完毕并被确认,调用complete 方法通知NameNode 文件写入完成。NameNode 接收到complete 消息之后,等待相应数量的副本写入完毕后,告知客户端。