如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

本文展示了如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

一、软件准备

VMware-WorkStation
ubuntu-16.04.2-desktop-amd64.iso
hadoop-2.7.4.tar.gz
jdk-8u144-linux-x64.tar.gz

二、集群机器准备

在VMware 中安装三台虚拟机,如下:
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

这三台机器保证环境和用户名一致,这里使用baozi。
使用手动固定ip,否则后面在配置host文件的时候可能因为ip更换而出问题:
ip设置方法
iface eth0 inetstatic
address 192.168.65.128
netmask 255.255.255.0
gateway 192.168.65.2

配置好的ip地址,修改 /etc/hosts 文件,配置如下
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

三、配置 ssh 无密码访问集群机器

在三台机器中分别执行以下两个命令,以便无密码登录到 localhost。
先安装ssh和openssh-server
sudo apt-get install
sudo apt-get install openssh-server
ssh-****** -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

将 slave1 和 slave2 的公钥 id_dsa.pub 传给 master。
scp ~/.ssh/id_dsa.pub [email protected]:/home/baozi/ssh/id_dsa.pub.slave1
scp ~/.ssh/id_dsa.pub [email protected]:/home/baozi/ssh/id_dsa.pub.slave2

将 slave1 和 slave2的公钥信息追加到 master 的 authorized_keys文件中。
cat id_dsa.pub.slave1 >> authorized_keys
cat id_dsa.pub.slave2 >> authorized_keys

将 master 的公钥信息 authorized_keys 复制到 slave1 和 slave2 的 .ssh 目录下。
scp authorized_keys [email protected]:/home/baozi/.ssh/authorized_keys
scp authorized_keys [email protected]:/home/baozi/.ssh/authorized_keys

分别 ssh 到 slave1 和 slave2
可以看到从 master 已经不需要密码就可以登录到 slave1 和 slave 2。slave1 和 slave2 也无需密码访问另外两台机器,如下:

如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

四、JDK 和 Hadoop 安装配置

分别在三台机器中安装 JDK 和 Hadoop,操作流程均是在自己的工作目录中,建立相应的文件夹,本文在/work/目录下分别建立java和hadoop目录,进入当前目录,将压缩包解压,jdk解压如下,hadoop也类似。
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
[email protected]:/work/java$ tar -zxvf /home/baozi/Downloads/jdk-8u144-linux-x64.tar.gz

之后sudo vim /etc/profile,在尾部追加环境编辑,因为现在只介绍hadoop,故spark和scala的配置暂时忽略
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
三台机器配置完成后,需要source /etc/profile让其立即生效

五、集群配置

1、修改 master 机器上 Hadoop 配置

进入hadoop目录的/work/hadoop/hadoop-2.7.4/etc/hadoop$目录。

(1) hadoop-env.sh
增加如下行配置:
export JAVA_HOME=/work/java/jdk1.8.0_144

(2) core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/work/hadoop/hadoop-2.7.4/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>1440</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>

注意:tmp目录需提前创建

(3) hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/work/hadoop/hadoop-2.7.4/hadoop_namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/work/hadoop/hadoop-2.7.4/hadoop_datanode</value>
</property>
</configuration>

数据有三个副本,hadoop_datanode要提前建

(4) mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<property>
<name>mapreduce.cluster.temp.dir</name>
<value>/work/hadoop/hadoop-2.7.4/mr_temp</value>
<final>true</final>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>2000</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx500M</value>
</property>
</configuration>

mr_temp目录需要提前建

(5) yarn-env.sh
增加 JAVA_HOME 配置
export JAVA_HOME=/work/java/jdk1.8.0_144

(6) yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>master:8888</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log.dir</name>
<value>/work/hadoop/hadoop-2.7.4/yarn_log</value>
</property>
<!-- 根据自己硬件配置可调整,建议最低就我这配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
</configuration>

(7) slaves
master
slave1
slave2

master 即作为 NameNode 也作为 DataNode。

2、在 slave1 和 slave2 上做同样的配置

六、启动Hadoop集群

1、格式化文件系统

在 master 上执行以下命令:

hdfs namenode -format

2、启动 NameNode 和 DateNode

在 master 机器上执行 start-dfs.sh, 如下:
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
使用 jps 命令查看 master 上的Java进程:
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
使用 jps 命令分别查看 slave1 和 slave2 上的 Java 进程:
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
可以看到 NameNode 和 DataNode 均启动成功。

3、查看 NameNode 和 NameNode 信息

浏览器输入地址: http://master:50070/ 可以查看 NameNode 信息。
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

4、启动 ResourceManager 和 NodeManager

运行 start-yarn.sh, 如下:
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

使用 jps 查看 master 上的 Java 进程
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

可以看到 master 上 ResourceManager 和 NodeManager 均启动成功。
可以看到 slave1 上 NodeManager 也启动成功。
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

同样可以看到 slave2 上 NodeManager 也已经启动成功了。
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群
至此,整个 Hadoop 集群就已经启动了。

其中在配置过程中遇到了一些问题记录如下:
启动dfs
发现不了,上面的JAVA_HOME以为能从环境变量拿的到,结果还是得配置

如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

启动yarn,master和slaver2 自动停止nodemanager
如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群

这里简直是搞了大半天,换了一种配置方式,发现hostname也没有改。这个是在/etc/hostname里面的。
虽然加了1024,但是也还是master和slave2启动又停止了。最后加了下面cpu-vcores第二个参数好了。

如何在虚拟机上搭建并配置一个分布式的 Hadoop2.7.4 集群