NameNode需要多少内存?
问题:NameNode需要多大的内存?
业界看法:1GB内存放1,000,000block元数据。
200个节点的集群中每个节点有24TB存储空间,block大小为128MB,block复制因子为3,能存储大概2000,000个block(或更多):200×24,000,000MB/(128MB×3)。此时,NameNode内存大概需要12000MB。
一万个节点的集群需要多大的NameNode的内存?
HDFS组成
1、Namespace
a) 包括目录,文件和block块。
b) 支持所有跟文件系统命名空间相关的操作
如:创建、删除、修改和列出文件及目录。
2、Block存储服务包含两部分:
a) NameNode中的block块管理
i. 通过心跳机制和注册机制提供了对DataNode集群的管理。
ii. 处理block块报告,管理block块的位置。
iii. 提供跟block块相关的操作,如:创建、修改、删除和查询block块的位置。
iv. 管理block副本如何放置,当副本数少于指定值之后增加副本,当副本数多余指定值之后删除副本。
b) 存储:
在DataNode本地文件系统中存储block块,并提供读/写访问。
1、NameNode节点之间是相互独立的联邦的关系,即它们之间不需要协调服务。
2、DataNode向集群中所有的NameNode注册,发送心跳和block块列表报告,处理来自NameNode的指令。
3、用户可以使用ViewFs创建个性化的命名空间视图,ViewFs类似于在Unix/Linux系统中的客户端挂载表。
VERSION
namespaceID 用于标记namenode的ID
blockpoolID 用于标记block存储池子的ID
clusterID 集群的ID
配置
hadopp-env.sh
配置JAVA_HOME
core-site.xml配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>viewfs://ClusterX</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./data</name>
<value>hdfs://node1:8020/data</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./project</name>
<value>hdfs://node1:8020/project</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./user</name>
<value>hdfs://node2:8020/user</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./tmp</name>
<value>hdfs://node2:8020/tmp</value>
</property>
<!-- <property>
<name>fs.viewfs.mounttable.ClusterX.linkFallback</name>
<value>hdfs://node2:8020/home</value>
</property>
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/bjsxt/hadoop/federation</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>1048576</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>node3:50090</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>node4:50090</value>
</property>
</configuration>
slaves
node2
node3
node4
格式化node1
$HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId myviewfs
格式化node2
$HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId myviewfs
在格式化node1和node2上的namenode时候,需要指定clusterId,并且两个格式化的时候这个clusterId要一致,两个namenode具有相同的clusterId,它们在一个集群中,它们是联邦的关系。
start-dfs.sh
stop-dfs.sh
优点
- 通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使得namenode/namespace可以通过增加机器来进行水平扩展。
- 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。
- 可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。