一. 以后 HDFS 体系架构
1. 简介
以后的 HDFS 架构有两个次要的层:
- 命名空间 (namespace)
HDFS 体系结构中的命名空间层由文件,块和目录组成。该层 反对与名称空间相干的文件系统操作,例如创立,删除,批改和列出文件和目录。 - 块存储层 (Block Storage)
块存储层包含两个局部:
块治理 :NameNode 执行块治理。块治理通过解决注册和定期心跳来提供 DataNode 群集成员身份。它解决块报告并反对与块相干的操作,如创立,删除,批改或获取块地位。它还保护块的地位,正本地位。为未复制的块治理块复制,并在已复制的块中删除。
存储: DataNode 通过在本地文件系统上存储块并提供读 / 写访问权限来治理存储空间。
2. 局限性
当下的 HDFS 体系结构仅容许单个 NameNode 保护文件系统名称空间。留神HA 体系中尽管说容许多个 NameNode,然而他们所保护的是同一套文件系统名称空间。这种体系目前存在着一些 弊病和局限性:
- DataNode 磁盘存储空间不够减少节点,NameNode 内存不够是否能够有限扩容。一种是 DataNode 横向扩大机器减少节点,一种是纵向扩大单机加内存。
- 因为名称空间和存储层的严密耦合,NameNode 的代替实现很艰难 。这 限度了其余服务间接应用块存储。惟一的 NameNode 成了惟一入口。
- 文件系统的操作还 限于 NameNode 一次解决的工作数。因而,群集的性能取决于 NameNode 吞吐量。
- 同样,因为应用单个名称空间,因而应用 群集的占用者组织之间没有隔离。
二. HDFS Federation 架构
1. 简介
Federation 中文意思为联邦, 联盟,是 NameNode 之间的 Federation, 也就是集群中会有多个 NameNode。多个 NameNode 的状况意味着有多个 namespace。留神,这区别于 HA 模式下的多 NameNode,HA 中它们是领有着同一个 namespace。
Federation 体系中多个 namenode 之间互相独立且不须要相互协调,各自分工,治理本人的区域。每个 DataNode 要向集群中所有的 namenode 注册,且周期性地向所有 namenode 发送心跳和块报告,并执行来自所有 namenode 的命令。
上图中,有多个 NameNode,别离示意为 NN1,NN2,.. NNn。NS1,NS2 等是由它们各自的 NameNode 治理的多个名称空间。
每个名称空间都有其本人的块池(block pool)(NS1 具备 Pool1,NS2 具备 Pool2,依此类推)。每个 DataNode 存储集群中所有块池的块 。
HDFS Federation 体系结构中的 块池是属于单个名称空间的块的汇合。每个块池彼此独立地进行治理。在删除 NameNode 或名称空间时,DataNode 中存在的相应块池也将被删除。在降级群集时,每个名称空间卷都作为一个单元进行降级。
2. 长处
- 命名空间可伸缩性
应用 Federation,能够程度扩大名称空间。这对大型群集或蕴含太多小文件的群集无利,因为向群集增加了更多的 NameNode。 - 性能
因为 文件系统操作不受单个 NameNode 吞吐量的限度,因而能够进步文件系统的性能。 - 隔离
因为有多个名称空间,它能够 为应用集群的占用者组织提供隔离。
3. HDFS Federation 配置示例
-
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>viewfs:///</value> </property> <property> <name>fs.viewfs.mounttable.default.link./bi</name> <value>hdfs://bi/</value> </property> <property> <name>fs.viewfs.mounttable.default.link./dt</name> <value>hdfs://dt/</value> </property> <!-- 指定 hadoop 长期目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/apps/hdpdata/</value> </property> <!-- 指定 zookeeper 地址 --> <property> <name>ha.zookeeper.quorum</name> <value>mini5:2181,mini6:2181,mini7:2181</value> </property> </configuration>
- hdfs-site.xml
<configuration>
<!-- 指定 hdfs 的 nameservice 为 bi,须要和 core-site.xml 中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>bi,dt</value>
</property>
<!-- bi 上面有两个 NameNode,别离是 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.bi</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.ha.namenodes.dt</name>
<value>nn3,nn4</value>
</property>
<!-- bi 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn1</name>
<value>mini1:9000</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn1</name>
<value>mini1:50070</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn2</name>
<value>mini2:9000</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn2</name>
<value>mini2:50070</value>
</property>
<!-- dt 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.dt.nn3</name>
<value>mini3:9000</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.dt.nn3</name>
<value>mini3:50070</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.dt.nn4</name>
<value>mini4:9000</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.dt.nn4</name>
<value>mini4:50070</value>
</property>
<!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的寄存地位 -->
<!-- 一下 property 项的配置,不能都配 -->
<!-- 在 bi 名称空间的两个 namenode 中用如下配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value>
</property>
<!-- 在 dt 名称空间的两个 namenode 中,用如下配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://mini5:8485;mini6:8485;mini7:8485/dt</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的地位 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/apps/hdpdata/journaldata</value>
</property>
<!-- 开启 NameNode 失败主动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败主动切换实现形式 -->
<property>
<name>dfs.client.failover.proxy.provider.bi</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.dt</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制办法,多个机制用换行宰割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 应用 sshfence 隔离机制时须要 ssh 免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时工夫 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
- mapred-site.xml
<configuration>
<!-- 指定 mr 框架为 yarn 形式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.yarn-site.xml
<configuration>
<!-- 开启 RM 高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定 RM 的 cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定 RM 的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 别离指定 RM 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>mini3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>mini4</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>mini5:2181,mini6:2181,mini7:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
4.Federation 初始化步骤
先启动 zookeeper 集群
再在 5 /6/ 7 上启动 journalnode
hadoop-daemon.sh start journalnode
在 bi 下 nn1 上
hdfs namenode -format –clusterID itcast
hdfs zkfc -formatZK
拷贝元数据目录到 standby(nn2)
在 dt 下 nn3 上
hdfs namenode -format –clusterID itcast ###clusterID 必须与 bi 的雷同
hdfs zkfc -formatZK
拷贝元数据目录到 standby(nn4)
在 bi 下 nn1 上
sbin/start-dfs.sh
在 resoucemanager 配置的主机上启动 yarn
sbin/start-yarn.sh