Hadoop正式上线之前,首先要调整的是各个进程的JVM参数设置,特别是对于HDFS Namenode来说。
HDFS的JVM参数配置文件: hadoop-env.sh
Namenode进程的JVM配置: HADOOP_NAMENODE_OPTS
Datanode进程的JVM配置:HADOOP_DATANODE_OPTS
client命令行的JVM配置:HADOOP_CLIENT_OPTS
对于Namenode而言, 由于元数据存储\操作都在内存中,所以Namenode JVM要根据集群规模设置,通常情况下换算公式为:
在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1000
0000个小文件,每个文件占用一个block,则namenode需要2G空间。如果存储1亿个文件,则namenode需要20G空间。这样namenode内存容量严重制约了集群的扩展。
参考:http://dongxicheng.org/mapreduce/hadoop-optimization-0/
JVM配置示例:
export HADOOP_NAMENODE_OPTS="-server -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log -XX:NewSize=10000m -XX:MaxNewSize=10000m -Xloggc:/var/log/hadoop/$USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xms20000m -Xmx20000m -Dhadoop.security.logger=INFO,DRFAS -Dhdfs.audit.logger=INFO,DRFAAUDIT ${HADOOP_NAMENODE_OPTS}"
HADOOP_DATANODE_OPTS="-Xms1000m -Xmx1000m -Dhadoop.security.logger=ERROR,DRFAS ${HADOOP_DATANODE_OPTS}"