本文为您介绍如何调整NameNode JVM和DataNode JVM内存大小,以便优化HDFS的稳定性。

前提条件

已创建集群,详情请参见创建集群

调整NameNode JVM内存大小

  • 背景:在HDFS中,每个文件对象都需要在NameNode中记录元数据信息,并占用一定的内存空间。默认的JVM配置可以满足部分普通的HDFS使用。部分Workload会向HDFS中写入更多地文件, 或者随着一段时间的积累HDFS保存的文件数不断增加,当增加的文件数超过默认的内存空间配置时,则默认的内存空间无法存储相应的信息,您需要修改内存大小的设置。
  • 建议:修改NameNode JVM内存大小。修改方式如下:
    • HA集群

      您可以在EMR控制台的HDFS服务的配置页面,在搜索区域,搜索参数hadoop_namenode_heapsize,参数值根据实际需求进行调整。

    • 非HA集群

      您可以在EMR控制台的HDFS服务的配置页面,在搜索区域,搜索参数hadoop_namenode_heapsizehadoop_secondary_namenode_heapsize,参数值根据实际需求进行调整。

      说明 配置完成后,需要重启相应的NameNode或SecondaryNamenode服务,使得配置生效。
    您可以通过访问HDFS UI页面,查看文件数Files和文件块数Blocks,访问Web UI的详情信息,请参见访问链接与端口。您可以根据以下计算方法调整NameNode JVM内存大小。
    建议值=( 文件数(以百万为单位)+块数(以百万为单位))×512 MB

    例如,您有1000万个文件,都是中小文件且不超过1个Block,Blocks数量也为1000万,则内存大小建议值为10240 MB,即(10+10)×512 MB。

    当您的大多数文件不超过1个Block时,建议值如下。
    文件数量 建议值(MB)
    10,000,000 10240
    20,000,000 20480
    50,000,000 51200
    100,000,000 102400

调整DataNode JVM内存大小

  • 背景:在HDFS中,每个文件Block对象都需要在DataNode中记录Block元数据信息,并占用一定的内存空间。默认的JVM配置可以满足部分简单的、压力不大的作业需求。而部分作业会向HDFS写入更多的文件, 或者随着一段时间的积累HDFS保存的文件数不断增加。当文件数增加,DataNode上的Block数也会增加,而默认的内存空间无法存储相应的信息时,则需要修改内存大小的设置。
  • 建议:您可以在EMR控制台的HDFS服务的配置页面,在搜索区域,搜索参数hadoop_datanode_heapsize,参数值根据实际需求进行调整,以修改DataNode JVM内存大小。
    您可以根据以下计算方法调整DataNode JVM内存大小。
    集群中每个DataNode实例平均保存的副本数Replicas=文件块数Blocks×3÷DataNode节点数
    建议值=单个DataNode副本数Replicas(百万单位)×2048 MB
    说明 配置完成后,需重启DataNode服务,使配置生效。

    例如,大数据机型为3副本,Core节点数量为6,如果您有1000万个文件且都是中小文件,Blocks数量也为1000万,则单个DataNode副本数Replicas为 500万(1000万×3÷6), 内存大小建议值为10240 MB(5×2048 MB)。

    当您的大多数文件不超过1个Block时,建议值如下。
    单个DataNode实例平均Replicas数量 建议值(MB)
    1,000,000 2048
    2,000,000 4096
    5,000,000 10240
    说明 该建议值已为JVM内核预留了部分空间,以及为作业高峰压力预留了部分空间,因此通常情况下可以直接换算使用。