1. NameNode概述
- NameNode是HDFS的核心
- NameNode也称为Master
- NameNode仅存储HDFS的元数据 : 文件系统中所有文件的目录树 , 并跟踪整个集群的文件
- NameNode不存储实际数据或数据集 , 数据本身实际存储在DataNode中
- NameNode知道任何文件的快列表及其位置
- NameNode并不持久化存储每个文件中各个块所在的datanode的位置信息
- NameNode对于HDFS至关重要 , 当NameNode关闭 , HDFS/Hadoop集群无法访问
- NameNode是Hadoop集群中的单点故障
- NameNode所在的机器通常会配置大量内存(RAM)
2. DataNode概述
- DataNode负责将实际数据存储在HDFS中
- DataNode也称为Slave
- NameNode和DataNode会保持不断通信
- DataNode启动时 , 它将自己发布到NameNode并汇报自己持有的块列表
- 当某个DataNode关闭时 , 不会影响数据或集群的可用性 , NameNode将安排由其他DataNode管理的块进行副本复制.
- DataNode所在的机器通常配置有大量的硬盘空间 , 故实际数据存储在其中
- DataNode会定期(
dfs.heartbeat.interval
配置项配置,默认是 3 秒)向NameNode 发送心跳,如果 NameNode 长时间没有接受到 DataNode 发送的心跳, NameNode 就会认为该 DataNode 失效。 - block 汇报时间间隔取参数
dfs.blockreport.intervalMsec
,参数未配置的话默认为 6 小时.
Q:nn如何保证自己记录的元数据跟dn实际存储的信息是一致的。
- 定时汇报机制
- datanodes在启动的时候首先汇报一次自己持有的块信息
- 后续每隔一段时间 再次发生块的信息
- 默认是每隔6小时汇报一次
- 心跳机制
- datanodes在启动的时候向nn注册自己
- 后续每隔3秒发送心跳信息 报活
3. HDFS的工作机制
HDFS 的内部工作机制对客户端保持透明,客户端请求访问 HDFS 都是通过向NameNode 申请来进行。
4. HDFS的应用开发
4.1 HDFS的Java API操作
HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象
,然后通过该客户端对象操作(增删改查)HDFS 上的文件。
4.1.1 搭建开发环境
创建maven工程 , 引入pom依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifact