前面博客里面提到,運行一次Hadoop的時候出現Java heap error。字面意思分配堆的時候出現錯誤,我們知道應用程序的動態內存的分配均在堆里面。這里提示堆錯誤,那必然是內存不夠用了。那么這個namenode內存的大小該怎么取值呢?
namenode管理着集群里面所有文件的信息。簡單根據文件信息給出一個准確計算內存大小的公式是不現實的。
hadoop默認namenode內存的大小為1000M,這個值對於數百萬的文件來說是足夠的,可以保守地設置每百萬數據塊需要1000MB內存。
例如,有這樣一個場景,一個含有200個節點的集群,每個節點有一個24TB的磁盤,hadoop的block的大小為128MB,有三份拷貝總共需要塊的數目大概在200萬或者更多,那么內存大致需要多少?
首先計算可以有多少塊:
(200*24000000MB)/(128MB*3)=12500,000。
然后保守估計需要多少內存:
12500,000*1000MB/1000,000=12,500MB
從上面的計算結果看出,將namenode內存的大小設置為12,000MB這個數量級別可以滿足。
計算大致的值之后,怎么設置呢?
hadoop配置文件,hadoop-env.sh中有個選項HADOOP_NAMENODE_OPTS,此JVM選項是用來設置內存大小的。比如:
- HADOOP_NAMENODE_OPTS=-Xmx2000m
那么就是給namenode分配了2000MB的空間。
如果改變了namenode的內存大小,那么secondarynamenode的內存的大小同樣也要改變,其選項是HADOOP_SECONDARYNAMENODE_OPTS。