HDFS 分布式文件系统
概念
一台计算机的存储计算能力有限;
当一个数据集的大小超过了一台计算机的存储能力时,需要对其进行分区(patition),并存储到多个计算机上。—— 跨网络管理多个计算机储存的文件系统 —— 分布式文件系统
存储方式:以流式数据访问模式来存储超大文件
流式数据访问模式(如mapreduce):一次写入,多次读取是最高效的访问模式。数据集的分析处理,需要层层剥离过滤,最后才形成总结性的结果输出。期间需要多次读取数据集的全部或局部数据。
高时间延迟代价:超大数据的分析过滤处理,需要在内部长时间并行运算,才得出结果。从执行到结果输出有着高时间延迟的代价付出。
不支持多用户写操作,不支持在文件任意位置做修改。
数据块:磁盘对数据进行读写的最小单位。 = 磁盘块
文件系统块:
分布式文件系统块(HDFS块):分块chunk-独立存储单元
HDFS块:默认64MB,块的数据固定设置,大文件拆分成块,不会将元数据(ep权限信息)写到块中。块复制在多个节点(数据备份),还可提高数据容错和恢复能力。
HDFS集群的节点类型:
管理者-工作者模式:NameNode 和 dataNode;
NameNode,命名空间,文件操作,数据块位置映射信息;
& 客户端,
dataNode ,存储并检索数据块,会送心跳给nameNode;
nameNode的安全运行机制:
nameNode挂掉,整个文件系统就挂了,dataNode的数据块信息也无法读取。
(1) 备份系统级元数据文件,写操作时同时写到本地和远程挂载的网络文件系统NFS
(2) 辅助nameNode,主机挂,从NFS copy 元数据到辅助nameNode,运行之。
Hadoop有众多文件系统接口:
hdfs 只是其中一个实现。
即,mapreduce程序可以访问不同的文件系统个,只是处理大数据时最好选择一个具有本地数据优化的分布式文件系统,例如hdfs 和 kfs;
Hadoop与java、
Hadoop用java写,通过java api可以调用hadoop的所有文件系统的交互操作。
Hdfs的命令解释器就是使用java的fileSYStem类来提供文件系统操作。
非java应用访问hadoop,则通过thrift api的代理服务来实现文件操作系统的访问
Java 与hadoop 的文件数据的读写
Java从hadoopURL中读取数据:
要从hadoop文件系统中读取文件,最简单的方式是通过java.net.URL对象打开数据流,直接读取数据。
Java通过FileSystem API 读取数据:
Hadoop文件写入,看书!
文件元数据:
FileStatus封装了文件系统中文件与目录的元数据;
listStatus 文件与目录的内容。
GlobStatus通配符 :获取指定路径下的文件– pathFilter 编程方式控制通配符;
交互过程中的数据流
1、HDFS client 通过fileSystem 的open方法,打开一个希望读取的文件;
相当于实例化了一个分布式文件系统HDFS的实例– distributedFileSystem;
2、这个实例进行了一下操作:
使用RPC,调用nameNode,返回文件的一批数据块所在的dataNode的地址;
同时还返回一个FSDataInputStream给client去读取数据。
(FSDataInputStream封装了dataNode的地址)
(如果client本身就是一个dataName,则从client本地读取数据;)
3、客户端使用FSDataInputStream的read方法,读取数据。
4-5、FSDataInputStream查看dataNode的地址,链接最近的dataNode,反复read数据给client;
6、当前一批的数据库读取完成,关闭流链接。如果是超大文件分批处理,还有下一批数据块时,则重复上述5个步骤,读取下一批数据库。