总的来说,hadoop并不适合搭建在NFS上。一来是NFS的存储成本过高,二来损失了hadoop原本在分布式上的“本地性”特点。
不过由于各种各样的原因,有时候需要在分布式文件系统NFS上搭建hadoop。分布式NFS这种架构主要是计算节点和存储节点的分离。计算节点带有少量的存储。在某些情况下甚至没有存储可以用,这是因为计算节点除了装系统的空间外,不给用户在计算节点上存储任何东西。
因此,搭建hadoop也就可以分两种情况:
一、计算节点上有存储空间可以使用的情况。
这种情况其实较好处理。因为计算节点可以有存储可以用,因此可以把HADOOP_HOME设在每个计算节点的存储上,这个目录一般来说最多几百兆,而类似logs,tmp目录设置到NFS上,因为它们非常占存储,而且随着时间的推移,所占的空间越来越多,因此如果是放在计算节点上肯定是不行的。对于HADOOP_HOME,每个数据节点上的路径都是一致的。而logs和tmp目录应该根据每个不同的datanode设置不同的路径。
例如:
HADOOP_HOME在(hadoop-env.sh)中可以设置为:
export HADOOP_HOME=/tmp/hadoop
其中/tmp目录属于计算节点的存储。
而log和pid目录在(hadoop-env.sh)中可以设置到NFS上去,其中/ifs/HDFS/hadoop为NFS上的路径。当然这两个路径虽然并不是非常占存储,不过随着集群运行的时间越来越长,log日志也会越来越大,因此放在NFS上是比较保险的。hadoop0表示第0个datanode,对于其他的datanode也要设置相应的路径。如hadoop1,hadoop2……等等。
export HADOOP_LOG_DIR=/ifs/HDFS/hadoop/hadoop0/logs
export HADOOP_PID_DIR=/ifs/HDFS/hadoop/hadoop0/pids
另外就是设置存储hdfs上数据的tmp目录,在core-site.xml中:
hadoop.tmp.dir
/ifshk4/HDFS/hadoop/hadoop0/tmp
A base for other temporary directories.
对于其他的datanode上的配置文件也做类似的更改。更好完之后,就是每台datanode在自己的存储上有相应的HADOOP_HOME目录,该目录下放置着与该datanode相关的配置文件,配置文件(hadoop-env.sh和core-site.xml)会告诉datanode要把hdfs上的数据存储到NFS上的那个目录(hadoop.tmp.dir)。
二、计算节点上无存储空间
这种情况下最大的问题是HADOOP_HOME必须要设置到不同的路径下。要解释这个问题我们首先看一下hadoop启动的过程。
1.启动start-all.sh
里面内容为:
bin=`dirname "$0"`
bin=`cd "$bin"; pwd`
. "$bin"/hadoop-config.sh
# start dfs daemons
"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR
# start mapred daemons
"$bin"/start-mapred.sh --config $HADOOP_CONF_DIR
执行三个脚本hadoop-config.sh,start-dfs.sh ,start-mapred.sh
(1)hadoop-config.sh主要获得hadoop的配置文件路径
(2)start-dfs.sh 则启动namenode,datanodes和secondary namenode,其执行以下三行脚本:
"$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode $nameStartOpt
"$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start datanode $dataStartOpt
"$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR --hosts masters start secondarynamenode
(3)start-mapred.sh则启动JobTracker和TaskTrackers,其执行一下两行脚本:
"$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start jobtracker
"$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start tasktracker
2.hadoop-daemon.sh和hadoop-daemons.sh
从上面流程可以得知:
hadoop-daemon.sh是启动单节点。
hadoop-daemons.sh则是用于启动slaves中其他多个节点。
3.slaves.sh的问题
对于计算节点没有存储的情况下启动hadoop-daemons.sh 在默认没修改的事情下会报错误:
Cannot lock storage, directory is already locked
如http://www.mentby.com/hadoop/cannot-lock-storage-directory-is-already-locked.html提到的。
这是因为在启动hadoop-daemons.sh 的时候会把当前namenode的配置文件信息所在的路径告诉slaves上的datanode,然后多个datanode就会在跟namenode设置一样的路径下进行读写操作,产生了冲突。
从以下hadoop-daemons.sh的代码中可以看到:
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_HOME" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
而在slaves.sh中:
for slave in `cat "$HOSTLIST"
sed "s/#.*$//;/^$/d"`; do
ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
2>&1
sed "s/^/$slave: /" &
if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
sleep $HADOOP_SLAVE_SLEEP
fi
done
对于这个for循环启动其他的datanodes,它每次传进去的HADOOP_HOME都是namenode设置好的变量。
4.解决
既然知道问题的原因,解决起来也就很简单了。只需要在namenode去启动其他datanode时候告诉每个datanode其相应的HADOOP_HOME,然后去读取响应的配置文件即可。
可以在NFS上设置目录:
`-- hadoop
-- hadoop160
-- hadoop161
-- hadoop162
-- hadoop163
-- hadoop164
-- hadoop165
-- hadoop166
-- hadoop167
-- hadoop168
-- hadoop169
-- hadoop170
-- hadoop171
-- hadoop172
-- hadoop173
-- hadoop174
-- hadoop175
-- hadoop176
-- hadoop177
-- hadoop178
-- hadoop179
-- hadoop180
-- hadoop181
-- hadoop182
某个datanode的ip地址为192.168.6.160。则把它所有的相关的配置路径(如logs,tmp,conf,pids)都设置在该路径hadoop160的路径下。
若集群namenode地址为192.168.6.100,它在调用slaves.sh的时候会把hadoop100的路径给其他的datanodes,这时候传参数的时候只要根据slaves的ip改成相应的目录即可。内容改变如下:
for slave in `cat "$HOSTLIST"|sed "s/#.*$//;/^$/d"`; do
ip=`echo $slave | sed "s/^.*\.//"`
cmd=`echo $"${@// /\\ }"|sed "s/hadoop100/hadoop$ip/g"`
ssh $HADOOP_SSH_OPTS $slave $cmd 2>&1 |sed "s/^/$slave: /" &
if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
sleep $HADOOP_SLAVE_SLEEP
fi
done
分享到:
相关推荐
部署全分布模式Hadoop集群 实验报告一、实验目的 1. 熟练掌握 Linux 基本命令。 2. 掌握静态 IP 地址的配置、主机名和域名映射的修改。...7. 格式化文件系统。 8. 启动和验证 Hadoop。 9. 关闭 Hadoop。
Hadoop2.2.0安装配置手册!完全分布式Hadoop集群搭建过程 按照文档中的操作步骤,一步步操作就可以完全实现hadoop2.2.0版本的完全分布式集群搭建过程
Hadoop分布式文件系统的模型分析,Hadoop 分布式文件系统是遵循Google 文件系统原理进行开发和实现的,受到了业界极大关注,并 已被广泛应用。 鉴于当前缺乏从系统设计理论的角度对其开展的相关研究,本文从 Hadoop ...
脚本搭建hadoop集群 可以自定义主机名和IP地址 可以自定义安装jdk和hadoop(格式为*tar.gz) 注意事项 1、安装完jdk和hadoop请手动source /etc/profile 刷新环境变量 2测试脚本环境为centOS6,其他操作系统会有些...
Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南Hadoop分布式文件系统使用指南...
分布式与云计算Hadoop集群搭建是一个关于搭建Hadoop集群并实现map-reduce的实验PPT,附有详细的方法和步骤
Hadoop 分布式集群搭建 Hadoop由Apache基金会开发的分布式系统基础架构,是利用集群对大量数据进行分布式处理和存储的软件框架。用户可以轻松地在Hadoop集群上开发和运行处理海量数据的应用程序。Hadoop有高可靠,...
从零开始一步步介绍如何搭建Hadoop集群
详细的hadoop2 伪分布式环境搭建以及eclipse部署。demo示例代码测试运行。文中有插件包。资源包等参考链接参考下载。
本人搭建hadoop完全分布式集群时,写的文档,内有详细步骤,
Hadoop分布式文件系统翻译
工作中搭建的hadoop分布式文件系统和hive ,mysql等的搭建的具体步骤
第四章(Hadoop大数据处理实战)Hadoop分布式文件系统.pdf第四章(Hadoop大数据处理实战)Hadoop分布式文件系统.pdf第四章(Hadoop大数据处理实战)Hadoop分布式文件系统.pdf第四章(Hadoop大数据处理实战)Hadoop分布式文件...
在Hadoop的分布式文件系统下,对文件的读写和列出文件的相关属性和目录中的内容
Hadoop伪分布式集群环境搭建 Hadoop伪分布式集群环境搭建
《Hadoop大数据开发实战》教学教案—03HDFS分布式文件系统.pdf
搭建hadoop集群的全部配置文件,全在里面了,跟我的文章配合起来用
基于Docker搭建Hadoop集群(2).docx
《Hadoop大数据开发实战》教学教案—08HBase分布式存储系统.pdf《Hadoop大数据开发实战》教学教案—08HBase分布式存储系统.pdf《Hadoop大数据开发实战》教学教案—08HBase分布式存储系统.pdf《Hadoop大数据开发实战...