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块,并提供读/写访问。

修改hadoop的节点个数 hadoop节点数量_HDFS

1、NameNode节点之间是相互独立的联邦的关系,即它们之间不需要协调服务。

2、DataNode向集群中所有的NameNode注册,发送心跳和block块列表报告,处理来自NameNode的指令。

3、用户可以使用ViewFs创建个性化的命名空间视图,ViewFs类似于在Unix/Linux系统中的客户端挂载表。

VERSION

namespaceID  用于标记namenode的ID

blockpoolID  用于标记block存储池子的ID

clusterID  集群的ID

修改hadoop的节点个数 hadoop节点数量_HDFS_02

配置

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

优点

  1. 通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使得namenode/namespace可以通过增加机器来进行水平扩展。
  2. 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。
  3. 可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。