下圖是HDFS的架構:
從上圖中可以知道,HDFS包含了NameNode、DataNode以及Client三個角色,當我們的HDFS沒有配置HA的時候,那還有一個角色就是SecondaryNameNode,這四個角色都是基於JVM之上的Java進程。既然是Java進程,那我們肯定可以調整這四個角色使用的內存的大小。接下來我們就詳細來看下怎么配置HDFS每個角色的內存
我們這里說配置的內存主要還是指JVM的堆內存
默認的內存配置
NameNode
當啟動我們在視頻課程中搭建好HDFS集群后,我們可以在master上通過如下的命令來查看NameNode和SecondaryNameNode這兩個進程占用的堆內存:
## 在master機器上執行 ps -ef | grep NameNode
得到的結果如下:
上圖中第1處的-Xmx1000m
表示NameNode的堆內存是1000M
上圖中第2處的-Xmx1000m
表示SecondaryNameNode的堆內存是1000M
DataNode
我們可以通過如下的命令來查看slave1和slave2上的DataNode占用的堆內存:
ps -ef | grep DataNode
得到的結果如下:
從上圖可以看出,兩個slave上的DataNode的堆內存都是1000M
Client
當我們執行下面命令的時候:
hadoop fs -ls /
其實也是啟動一個名字為FsShell的Java進程,如下圖:
這個FsShell進程就是一個Client進程,這個Client進程的默認堆內存是512M
結論
- HDFS集群中的角色(NameNode、SecondaryNameNode、DataNode)的默認的堆內存大小都是
1000M
- Client進程的堆內存大小是
512M
如何配置內存
要想知道如何配置每個角色的內存,我們首先需要搞明白上面默認的內存配置是在哪里配置的。
這些默認的配置都是在Hadoop的安裝目錄下的配置目錄下文件hadoop-env.sh
中,即/home/hadoop-twq/bigdata/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
在hadoop-env.sh
文件中有幾個和內存相關的配置:
我們按照上圖從上往下,分別仔細看下
# The maximum amount of heap to use, in MB. Default is 1000. #export HADOOP_HEAPSIZE= #export HADOOP_NAMENODE_INIT_HEAPSIZE=""
HADOOP_HEAPSIZE
:表示HDFS中所有角色的最大堆內存,默認是1000M
,這個也就是我們所有HDFS角色進程的默認堆內存大小
HADOOP_NAMENODE_INIT_HEAPSIZE
:表示NameNode的初始化堆內存大小,默認也是1000M
。
# Extra Java runtime options. Empty by default. export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
HADOOP_OPTS
: 表示HDFS所有角色的JVM參數設置,對於HDFS所有角色的通用的JVM參數可以通過這個配置來設置。默認的話是空的配置
# Command specific options appended to HADOOP_OPTS when specified export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER :-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
HADOOP_NAMENODE_OPTS
:針對NameNode的特殊的JVM參數的配置,默認只設置hadoop.security.logger
和hdfs.audit.logger
兩個日志級別信息參數
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
HADOOP_DATANODE_OPTS
:針對DataNode的特殊的JVM參數的配置,默認只設置hadoop.security.logger
日志級別信息參數
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUD IT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
HADOOP_SECONDARYNAMENODE_OPTS
:針對SecondaryNameNode的特殊的JVM參數的配置,默認只設置hadoop.security.logger
和hdfs.audit.logger
兩個日志級別信息參數
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
HADOOP_PORTMAP_OPTS
:這個是在HDFS格式化時需要的JVM配置,也就是執行hdfs namenode -format
時的JVM配置
# The following applies to multiple commands (fs, dfs, fsck, distcp etc) export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
HADOOP_CLIENT_OPTS
:表示HDFS客戶端命令啟動的JVM的參數配置,這里配置的JVM的堆內存的大小為512M
。這個配置是針對客戶端命令(比如fs, dfs, fsck, distcp等)的JVM堆內存配置
NameNode、DataNode以及Client進程堆內存的配置方式
NameNode、DataNode以及Client進程堆內存是在hadoop-env.sh
中的配置HADOOP_NAMENODE_OPTS
、HADOOP_DATANODE_OPTS
以及HADOOP_CLIENT_OPTS
配置的
所以我們如果想配置NameNode的堆內存可以有兩種方式:
## 第一種方式 export HADOOP_NAMENODE_INIT_HEAPSIZE="20480M" ## 第二種方式 export HADOOP_NAMENODE_OPTS="-Xms20480M -Xmx20480M -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOO P_NAMENODE_OPTS"
如果我們想配置DataNode的堆內存可以有以下兩種方式:
## 第一種方式 export HADOOP_HEAPSIZE=2048M ## 第二種方式,這種方式會覆蓋掉上面第一種方式的配置 export HADOOP_DATANODE_OPTS="-Xms2048M -Xmx2048M -Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
如果我們想配置Client的堆內存可以有如下方式:
export HADOOP_CLIENT_OPTS="-Xmx1024m $HADOOP_CLIENT_OPTS"