建立在云主机上的完全分布式hadoop集群搭建

一开始我用的是公网ip来搭建的集群环境,最后遇到了namenode无法启动的问题:

java.net.BindException: Cannot assign requested address; For more details see:  http://wiki.apache.org/hadoop/BindException

查了很多资料,最后说是ip的问题,可能是因为IP 不在同一区域里,如果namenode的ip是172.19.144.213,其他的应该是172.19.144.XXX,要保证在同一个子网内,而且,hadoop集群也不推荐使用公网ip来搭建集群,

集群节点最好在同一个子网内,要不然配置会麻烦很多。此外,hadoop集群最好部署在内网,因为其在安全性方面并没有做充分的设计,其设计之初就假定集群运行在一个安全可信的环境。

其中具体的我也不太清楚,所以最后我选择使用内网ip来搭建集群环境。

====================================================

接下来就开始正式搭建环境了

第一步 云主机

不是给阿里云打广告,只是说明一个小问题,避免各位踩坑。
在阿里云上的云服务器ECS中点击创建实例即可创建云主机,其中有一个步骤如下:
这里写图片描述
这里设置的密码是登录云主机时的密码,账号默认是root。实例名称就是主机名,也就是linux终端中@符号后面的内容。这里最好设置一下。
只是作为学习的话,不推荐选择高配,太贵了!!!我选择的是最低配的
这里写图片描述
只是作为学习的话,无需太高配啦。
我一共创建了5台云主机。
这里写图片描述
主机基本信息整理如下:
这里写图片描述

第二步 远程连接

(1)5台云主机:主机使用Ubuntu14.04 64位的操作系统
(2)因为本地是windows系统,所以使用putty来进行远程连接(也可以在linux中直接进行远程连接)
putty最新下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
我下载的是
这里写图片描述
下载得到的是一个exe文件,无需安装,放在桌面,双击即可运行。
这里写图片描述
只需要在画红圈的地方输入公网ip即可,然后点击“open”
出现如下提示:(下图是网上找的)
这里写图片描述
如果是首次连接,会弹出以下窗口,点击“是”即可。然后出现下面登录提示:
这里写图片描述
输入账号:root
输入密码(就是前面创建云主机时设置的登录密码),出现以下内容,就表示远程连接成功。
这里写图片描述
可以同时远程连接所有的云主机。

第三步 基础环境

(1)更新软件包
在每一台主机上执行:sudo apt-get update
(2)安装jdk
在每一台主机上执行:sudo apt-get install default-jdk
安装完成后,执行:update-alternatives –display java来查看jdk的安装路径
(3)安装ssh和rsync
在每一台主机上执行:
sudo apt-get install ssh
sudo apt-get install rsync
(4)安装hadoop
这里我用的是hadoop-1.0.0版本
所以在每一台主机上执行:
wget https://archive.apache.org/dist/hadoop/common/hadoop-1.0.0/hadoop-1.0.0.tar.gz (如果是其他版本,直接修改1.0.0即可,比如修改为2.6.0)
然后解压下载的hadoop包:sudo tar -zxvf hadoop-1.0.0.tar.gz
将解压后的hadoop移至合适的位置:sudo mv hadoop-1.0.0 /usr/local/hadoop-1.0.0
至此,需要下载安装的软件都已经下载完成,接下来就是配置环境了。

第四步 配置环境

集群环境:一台主机作为namenode和secondarynamenode节点,一台主机作为jobtracker节点,三台主机作为datanode和tasktracker节点。
namenode和jobtracker分离可以有助于扩展namenode的可用内存空间。

(一)配置ssh免密登陆

情况分析
(1)namenode和secondarynamenode节点所在的主机需要免密登录datanode节点,(2)jobtracker节点所在的主机需要免密登录tasktracker节点。
方案
(1)需要在namenode和secondarynamenode节点生成密钥对,然后将公钥发送到datanode节点中;
(2)需要在jobtracker节点生成密钥对,然后将公钥发送至tasktracker节点中。

在namenode所在的节点执行:ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa,这时候就会在~/.ssh/目录下生成
id_rsa,
id_dsa.pub,这两个文件。
接着执行:
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
ip地址对应salve01,slave02,slave03的内网ip。

然后在namenode所在节点和slave01,slave02,slave03上分别执行:cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys将公钥写入authorized_keys中。

扫描二维码关注公众号,回复: 1337413 查看本文章

在jobtracker所在的节点执行:ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa,
然后执行:
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
scp /root/.ssh/id_dsa.pub [email protected]:~/.ssh
在jobtracker所在的节点和slave01,slave02,slave03上分别执行:cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys将公钥写入authorized_keys中。

完成后,namenode所在的节点和jobtracker所在的节点就可以免密登录slave01,slave02,slave03节点。

关于这里的设置ssh免密登录,我后来偶然看到一篇博客讲的很好,所以我在下一篇中有详细说明,各位可不用看这部分,直接参考我下一篇博文。

(二)配置hadoop

(1)编辑.bashrc文件
在所有节点的.bashrc文件中添加如下内容:(也可以在profile文件中添加)

# jdk
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

# hadoop
export HADOOP_HOME=/usr/local/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HADOOP_HOME_WARN_SUPPRESS=1

其中JAVA_HOME和HADOOP_HOME需要换成你自己的安装路径。

执行:source .bashrc使编辑的内容生效。

(2)编辑/etc/hosts文件
编辑所有节点的/etc/hosts文件,

172.19.144.210 slave01
172.19.144.211 slave02
172.19.144.212 slave03

172.19.144.213 master-namenode
172.19.144.215 master-jobtracker

保存退出。

查看下/etc/hostname中的值是否和你的主机名一致,若不一致,则改成你的主机名,否则就不需要改。

(3)编辑hadoop-env.sh文件
编辑所有节点的hadoop-env.sh文件(位于hadoop/conf/下)
先取消export JAVA_HOME的注释,然后修改后面的路径为你自己的安装路径

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

(4)编辑core-site.xml文件
编辑所有节点的core-site.xml文件,添加如下内容:

<property>
<name>fs.default.name</name>
<value>hdfs://master-namenode:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp/hadoop_data</value>
</property>

master-namenode是我的namenode节点的主机名,你可以替换成你的namenode节点的主机名。

(5)编辑hdfs-site.xml文件
编辑所有节点的hdfs-site.xml文件,添加如下内容:

<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-1.0.0/hadoop_data/hdfs/namenode</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-1.0.0/hadoop_data/hdfs/datanode</value>
</property>

<property>
<name>dfs.replication</name>
<value>3</value>
</property>

dfs.namenode.name.dir是namenode节点存放目录,dfs.datanode.data.dir是datanode节点的存放目录,均可以替换成你自己想要存放的路径。

(6)编辑mapred-site.xml文件
编辑所有节点的mapred-site.xml文件,添加如下内容:

<property>
<name>mapred.job.tracker</name>
<value>master-jobtracker:9001</value>
</property>

master-jobtracker是我的jobtracker节点的主机名,你可以替换成你自己的jobtracker节点所在的主机名。

(6)编辑masters和slaves文件
这两个文件只需要修改namenode节点和jobtracker节点的就可以。

打开namenode节点所在的主机中hadoop的conf目录,里面有masters和slaves这两个文件,
打开masters文件,将localhost替换成namenode节点所在的主机名
打开slaves,将localhost替换成
slave01
slave02
slave03
保存退出

打开jobtracker节点所在的主机中hadoop的conf目录,里面有masters和slaves这两个文件,
打开masters文件,将localhost替换成jobtracker节点所在的主机名
打开slaves,将localhost替换成
slave01
slave02
slave03
保存退出

第四步 格式化并启动hadoop

在namenode所在的节点执行:hadoop namenode -format

然后在namenode所在的节点执行:start-dfs.sh
在jobtracker所在的节点执行:start-mapred.sh

通过jps来查看进程是否启动成功。

启动成功的情况下:
namenode所在的节点:
这里写图片描述

jobtracker所在的节点:
这里写图片描述

datanode和tasktracker所在的节点:
这里写图片描述
可以看到,namenode和secondarynamenode在一个主机上,jobtracker在一个主机上,datanode和tasktracker在一个主机上。

在大型的hadoop集群中,namenode和secondarynamenode也要分开在不同的主机上,这样可以进一步扩大namenode的可使用内存空间。

猜你喜欢

转载自blog.csdn.net/qq_16403141/article/details/78273261
今日推荐