如何在虚拟机上搭建并配置一个分布式的 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 中安装三台虚拟机,如下:
这三台机器保证环境和用户名一致,这里使用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 文件,配置如下
三、配置 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 也无需密码访问另外两台机器,如下:
四、JDK 和 Hadoop 安装配置
分别在三台机器中安装 JDK 和 Hadoop,操作流程均是在自己的工作目录中,建立相应的文件夹,本文在/work/目录下分别建立java和hadoop目录,进入当前目录,将压缩包解压,jdk解压如下,hadoop也类似。 [email protected]:/work/java$ tar -zxvf /home/baozi/Downloads/jdk-8u144-linux-x64.tar.gz
之后sudo vim /etc/profile
,在尾部追加环境编辑,因为现在只介绍hadoop,故spark和scala的配置暂时忽略
三台机器配置完成后,需要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
, 如下:
使用 jps 命令查看 master 上的Java进程:
使用 jps 命令分别查看 slave1 和 slave2 上的 Java 进程:
可以看到 NameNode 和 DataNode 均启动成功。
3、查看 NameNode 和 NameNode 信息
浏览器输入地址: http://master:50070/ 可以查看 NameNode 信息。
4、启动 ResourceManager 和 NodeManager
运行 start-yarn.sh, 如下:
使用 jps 查看 master 上的 Java 进程
可以看到 master 上 ResourceManager 和 NodeManager 均启动成功。
可以看到 slave1 上 NodeManager 也启动成功。
同样可以看到 slave2 上 NodeManager 也已经启动成功了。
至此,整个 Hadoop 集群就已经启动了。
其中在配置过程中遇到了一些问题记录如下:
启动dfs
发现不了,上面的JAVA_HOME以为能从环境变量拿的到,结果还是得配置
启动yarn,master和slaver2 自动停止nodemanager
这里简直是搞了大半天,换了一种配置方式,发现hostname也没有改。这个是在/etc/hostname里面的。
虽然加了1024,但是也还是master和slave2启动又停止了。最后加了下面cpu-vcores第二个参数好了。