最开始我也没配,结果出错了,出错的情形表现为:通过主节点可以启动yarn集群,子节点上有NodeManager进程,但是,在:8088/cluster/nodes页面却没有显示子节点的信息,同时在主节点上通过yarn node -list -all命令查看也没有子节点的信息。然后在nodemanager节点的相关日志日志文件里(/usr/local/hadoop-2.6.5/logs/yarn-root-nodemanager-hadoop2.log)有org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031异常,如下图一所示。我的理解是,因为在yarn-site.xml文件中没有显式地将这些端口配置出来的原因,导致子节点无法向主节点注册(Registered)——然后,从报错的信息看貌似是只要把8031端口配置上了就可以了,其实也不是so easy的……如果不配置其他端口,则提交yarn任务的时候会无限地卡在ACCEPTED状态上,卡在该状态上的日志我看不出问题来,但是确实把上面的端口都配置了之后就好了。
因此,最好是将这些端口都显式配置好!!!
图一:
注:判定上图信息是异常的原因,是因为子节点要去连接主节点,它需要连接到正确的主节点IP才行,而上图中连接的却是0.0.0.0——在子节点上,0.0.0.0的IP代表的是子节点自己,它连接错了,自然无法向主节点注册。
关于最后两项配置
yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true;
yarn.nodemanager.vmem-check-enabled:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
因为我实验时给3台机器分配的资源都很少,所以必须得设置它们都为false,否则运行yarn程序的时候会报如下错误。
报错是因为,执行程序时,yarn对于机器能分配的资源进行了检查,结果发现运行程序需要的资源超出了机器所能分配资源的上限,然后就粗错了。如果把上面两项设置为false,则运行程序时就不会去进行对应的资源检查了,此时虽然机器能分配的资源依然不足,但是yarn不会像之前那样立马把container干掉了,而是会花较长的时间才能把程序跑完。
2.2.5配置slaves
命令:
vim slaves
在文件中加入如下内容
hadoop2
hadoop3
如下:
注:本次配置中hadoop1是管理节点,hadoop2和hadoop3是数据节点。如果如果想使得hadoop1既是管理节点又是数据节点,可以把hadoop1也写到slaves文件中来。
2.3将hadoop1上配置好的hadoop文件分发到hadoop2和hadoop3节点上(hadoop1上操作)
命令:
scp -r /usr/local/hadoop-2.6.5 root@hadoop2:/usr/local/
scp -r /usr/local/hadoop-2.6.5 root@hadoop3:/usr/local/
2.4修改环境变量,在hadoop1上执行以下命令
命令:
vim /etc/profile
在文件中添加如下内容:
export HADOOP_HOME=/usr/local/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
用source /etc/profile命令使修改的环境变量生效,接着用which hdfs命令查看是否修改成功。
2.5配置完成,接着格式化hdfs
在主节点hadoop1上执行以下命令
hdfs namenode -format
如下:
注:命令执行完之后从结果上很难看出是否格式化成功了,这时可以紧接着通过echo $? 命令查看hdfs namenode -format命令是否执行成功。如下,如果输出0,则说明上一条执行成功。
2.6启动hdfs,在hadoop1上执行以下命令
cd /usr/local/hadoop-2.6.5/sbin
./start-dfs.sh
如下:
2.7验证hdfs是否安装成功
方法一:
在主节点hadoop1上用jps命令可以看到SecondaryNameNode和NameNode进程:
在任一子节点上用jps命令可以查看到DataNode进程
如此,可以认为,从主节点上可以成功启动hdfs集群了。
但是是否一定没有问题了呢?不一定。