0. 目录

  • 1. 创建虚拟机
  • 2.安装centos8
  • 3. 配置安装hadoop需要的基本环境
  • 4.克隆多台虚拟机
  • 5.配置多台虚拟机的网络互通
  • 6. Master机安装Hadoop
  • 7.启动Hadoop集群
  • 8.Hadoop样例试验
  • 9.关闭Hadoop
  • 10.参考资料


集群配置情况 :win10 + vmware15 + centos8+Hadoop-2.10.0

1. 创建虚拟机
  1. 点击 创建新的虚拟机 >> 典型 >> 稍后安装操作系统
  2. 因为 WORKATATION 15 PRO 没有centos8 ,选择 centos 7 64 位
  3. 虚拟化 集群概念_hadoop

  4. 虚拟机名称 可以随意命名,我搭建hadoop集群,为了方便区分,集群主机命名为HadoppMaster,集群从机为HadoopSlave1、HadoopSlave2等等。
  5. 磁盘大小:主机(Master机) 30G(其实我觉得 20G也差不多了)
    从机(Slave机)10G~20G 就基本可以了 这里我自己设置了10G
    下面的选择,个人习惯是 单个文件(NFTS)
    如果是FAT32磁盘格式的话,可能需要选择 拆分成多个文件
  6. 虚拟化 集群概念_Hadoop_02

  7. 自定义硬件设置
    点击 >> 打印机 >> 移除 这里有时候会引起冲突
    点击 >> 声卡 >> 移除 这项可选可不选,反正不会用到声卡
    点击 >> 新 CD/DVD(IDE) >> 使用ISO映像文件 >> 浏览选择你下载的centos8镜像
  8. 虚拟化 集群概念_Hadoop_03

  9. 内存大小等设置是之后可以再调整的
    点击 完成
2.安装centos8
  1. 开启虚拟机后,方向键 ↑ 选择 Install CentOS Linux8 回车 开始安装 (初始是中间的选项)
  2. 虚拟化 集群概念_hadoop_04

  3. 语言选择界面 默认英语,可以自行选择中文
  4. Time & Date 点击中国区,如果时间出现不一致后面通过命令解决
  5. Software Selection 可以选择 Server with GUI (图形界面+浏览器,新手推荐,但是感觉有时候卡卡的)
    或者选择Minimal Install (最小安装,只有命令行界面,轻快,传输东西可以用xshell或xftp在win10上操作完传过去)
    我Master机选了GUI,Slave机选的是Minimal
  6. Installation Destination 点两次那个磁盘就好了,虚拟机让它默认分就好。
  7. NETWORK & HOST NAME 一定要打开网络连接的开关,特别是选了最小安装,不然centos8默认不联网,比较麻烦。
    然后就可以Begin Installation
  8. 安装过程中可以设置 USER SETTINGS 在这里设置了比较方便,
    我Root Password设置为 root 超短密码需要按两次Done
    User Creation 创建了 用户名为 hadoop 密码为 hadoop 的账户
  9. 如果是部署多台从机的话,可以在安装好(含基本的工具)的机子后,利用 VMware 的克隆复制出多台从机。先不要急
  10. 安装结束重启后,还需要 √上使用许可 ,就可以进入centos8的系统啦
3. 配置安装hadoop需要的基本环境

centos8的工具(终端,浏览器等都在点击左上角那个 Activies 后展开的菜单里)

  1. 给 hadoop 用户增加管理员权限 ,终端输入:
su
//输入密码:root
visudo

在下面找到 root ALL=(ALL) ALL 这行,按i插入红线那一行,hadoop为你的用户名

虚拟化 集群概念_centos_05


按Esc,输入 :wq! 保存退出

在终端输入exit 退出 su 模式

  1. 检查ssh(centos8默认安装了)

终端输入

$ rpm -qa | grep ssh

有openssh-clients 和 openssh-server 则可

虚拟化 集群概念_hadoop_06


如果没有,则在终端输入以下命令安装

$ sudo dnf install openssh-clients
$ sudo dnf install openssh-server
//centos8 用 dnf 代替了 yum ,yum也是可以的

测试ssh连接

$ ssh localhost

在红线处输入 yes

在蓝线处输入用户密码:hadoop

虚拟化 集群概念_Hadoop_07

$ exit  # 退出ssh localhost
  1. 同步互联网时间
    如果虚拟机时间已经和互联网时间一样可以跳过这步,如果不一样则一定要校准,否则后续Hadoop无法运行
    本来想用ntp ntpdate 但centos8无法直接使用了
    用chrony校准时间
$ sudo dnf install chrony
$ sudo dnf install vim  #安装vim
$ sudo vim /etc/chrony.conf
#在文件添加入公共ntp服务器,并把第三行的pool..的注释掉,效果如下图
server cn.ntp.org.cn iburst
server ntp.ntsc.ac.cn iburst
#在保存退出后,输入以下
$ systemctl enable chronyd.service #开机自启动
$ systemctl restart chronyd.service  #更新chrony服务
$ chronyc sources -v  #校准时间
$ date #显示时间,时间和宿主机一致则校对成功

如图:注释掉红色线部 分 (图是注释后效果)

虚拟化 集群概念_centos_08

  1. 安装Java环境
    在默认的NAT模式下,同时存在多台虚拟机可能导致网络冲突,请关闭所有虚拟机,开启一台操作。
#安装openjdk-1.8.0
$ sudo dnf install java-1.8.0-openjdk java-1.8.0-openjdk-devel
#安装完成后配置java环境变量
$ vim ~/.bashrc

在文件末加入,(i 键插入)

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk #安装的默认路径
#按ESC 输入 :wq! 退出

检查环境变量是否正确

$ source ~/.bashrc #更新环境变量
$ java -version  
$ $JAVA_HOME/bin/java -version #如果两个输出一样则说明设置正确

到此,Master机,Slave机相同的地方已经配置完毕,hadoop的安装与配置只需要在Master机设置好传输到Slave机。现在可以利用配置好的Master机或者Slave样例机克隆出多台Slave机。

4.克隆多台虚拟机

在虚拟机关机的状态下,点击VMware的虚拟机 >> 管理 >> 克隆 >> 克隆自虚拟机中的当前状态 >> 创建完整克隆 >> 命名可以随意(这里我命名为HadoopSlave2)>> 完成
等待克隆完成即可,重复以上可以克隆出HadoopSlave3、HadoopSlave4等等。
没有说到的步骤都是点击下一步

5.配置多台虚拟机的网络互通

在Master机上,安装配置Hadoop之前我们先配置虚拟机之间和虚拟机与宿主机之间的网络互通
我的虚拟机集群的ip如下:(IP可以按照自己的设定)

虚拟机名称

网络 IP

Master机

192.168.1.121

Slave1机

192.168.1.122

Slave2机

192.168.1.123

子网

192.168.1.0

网上有使用桥接方式建立虚拟机局域网络,但是需要宿主机固定的IP地址,我这里可能实现不了,因此采用NAT方式

  1. VMware NAT网络配置
    点击 编辑 >> 虚拟网络编辑器 >> 更改网络模式 >> 点击NAT模式(名称为VMnet8)
    最下面的子网IP 我设置为192.168.1.0 子网掩码设置为 255.255.255.0

然后点击NAT设置 网关IP 设为 192.168.1.1

虚拟化 集群概念_centos_09


点击DHCP设置

虚拟化 集群概念_虚拟化 集群概念_10

  1. 为每台虚拟机设置唯一的MAC地址
    在每台虚拟机页面 >> 点击编辑虚拟机设置 >> 网络适配器 >> 高级 >> 在MAC地址处点击 生成 务必确保每台虚拟机的MAC地址不相同,如有相同多点几次生成
  2. 在每台虚拟机内配置网络IP

(1)关闭防火墙
终端输入

$ su #进入超级用户模式root
$ systemctl stop firewalld.service #关闭防火墙
$ systemctl disable firewalld.service #关闭防火墙自启动
$ nmcli c reload #重启网络

(2)修改虚拟机 ip 地址

$ sudo vim /etc/sysconfig/network-scripts/

打开后会有一个 ensXX的设置文件

虚拟化 集群概念_centos_11


在文件中加入

# 加 # 注释掉 BOOTPROTO="dhcp"
BOOTPROTO="static" #设为静态ip模式
IPADDR=192.168.1.121 #对应每台虚拟机的ip地址
PREFIX=24 #掩码位数
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.1.1 #网关,和之前VMware网络设置的对应

样例如下:

虚拟化 集群概念_centos_12

(3)设置主机名(虚拟机的hostname)

$ sudo vim /etc/hostname
#加入以下
NETWORKING=yes
HOSTNAME=Master #如果是Slave机,则是Slave1、Slave2等

样例:

虚拟化 集群概念_Hadoop_13


(4)修改网络节点映射

$ sudo vim /etc/hosts
#加入集群的所有机子ip映射,我是 1 Master 2 Slave
192.168.1.121 Master
192.168.1.122 Slave1
192.168.1.123 Slave2

蓝色线为原有的,红色框为新添加的

虚拟化 集群概念_hadoop_14


以上4步需要在每台机子上操作一遍

在宿主机win10的网络和Internet >> 网络连接 >> VMnet8(NAT网卡) 设置为

虚拟化 集群概念_Hadoop_15

其网络大概是这个样子:

虚拟化 集群概念_Hadoop_16

  1. 虚拟机内网互通检查
    要先reboot重启所有机子,使上面的步骤生效
$ ping Master -c 3 #-c 3 表示ping3次,没有该参数要用 ctrl+c 停止
$ ping Slave1 -c 3
$ ping Slave2 -c 3
$ ping www.baidu.com -c 3

能全ping通则OK,如果不能ping通百度,则需要加入dns

$ vim /etc/resolv.conf
#加入
nameserver 223.5.5.5 #两个皆为阿里dns
nameserver 223.6.6.6
  1. SSH免密码登录

方法一:
Master机操作

$ ssh-keygen -t rsa #生成新密钥,一路回车确认

$ ssh-copy-id Slave1 #输入yes 以及slave1密码
$ ssh Slave1  #测试是否能免密登录,exit退出
重复以上两步直至master能免密登录所有slave机和自己

方法二:比较繁琐

Master 机操作:

$ cd ~/.ssh
$ rm ./id_rsa* #移除先前的密钥
$ ssh-keygen -t rsa #生成新的密钥
$ cat ./id_rsa.pub >>  ./authorized_keys
$ chmod 600 ./authorized_keys
$ ssh Master #使用了新的密钥,要重新认证,操作和之前的一样
#输入yes
$ exit
$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop  #传输密钥到Slave1机(接收机)其他同理

其中要输入接受机的密码

接收机操作(例:Slave1机):

$ mkdir ~/.ssh #如果已存在则不用
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
#防止权限不足,仍要密码认证,给予文件权限
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ rm ~/id_rsa_pub

有其他节点Slave机也执行相同的操作

6. Master机安装Hadoop
  1. 下载Hadoop
    centos有浏览器的可以直接到官网下载,如果只有命令行界面则用wget下载

用wget下载命令

$ sudo dnf install wget #安装wget
$ cd ~
$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
#从清华源下载会快一点
$ sudo tar -zxf ~/hadoop-2.10.0.tar.gz -C ./  #解压到/home/hadoop目录(主目录)
#如果是用浏览器下载 则改为 ~/download/hadoop-2.10.0.tar.gz
$ sudo mv ./hadoop-2.10.0 ./hadoop #将文件名改为hadoop
$ sudo chown -R hadoop:hadoop ./hadoop #修改文件权限 hadoop:hadoop为 用户:密码
$ cd ./hadoop
$ ./bin/hadoop version #检查hadoop版本,输出有Hadoop 2.10.0 则表示安装成功

为了消除之后运行Hadoop出现Unable to load native-hadoop library for your platform… using builtin-java classes where applicable的警告,执行以下操作

$ sudo cp -r ~/hadoop/lib/native /usr/local/lib/hadoop-native
  1. 配置PATH变量
$ vim ~/.bashrc
#加入下面两行
export PATH=$PATH:/home/hadoop/hadoop/bin:/home/hadoop/hadoop/sbin
export JAVA_LIBRARY_PATH=/usr/local/lib/hadoop-native
$ source ~/.bashrc #更新环境变量
  1. 修改Hadoop配置文件
    文件内容为Hadoop集群分布文件样式,伪分布式需另行设置

(1)修改slaves文件,确定数据节点datanode

$ cd ~/hadoop/etc/hadoop
$ sudo vim ./slaves
#如果要Master机作为数据节点将localhost改为Master,否则删除
#在后面增加Slave机的名称
Slave1
Slave2
$ sudo vim ./core-site.xml #依次配置下列(2)~(5)文件

如图:

虚拟化 集群概念_虚拟化 集群概念_17

(2)core-site.xml

<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://Master:9000</value>
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>file:/home/hadoop/hadoop/tmp<value>
		<description>Abase for other temporary dorectories.</description>
	</property>
</configuration>

(3)修改hdfs-site.xml,其中dfs.replication一般设为3,但如果slave节点少于3,则等于Slave节点数量+Master节点,或只是Slave节点数量,要与前面slaves相对应
这里考虑Master节点只作为名称节点 还是既作为名称节点又作为数据节点,我自己用后者

<configuration>
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>Master:50090</value>
	</property>
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
	</property>
</configuration>

(4)修改mapred-site.xml
这个文件需要先重命名,默认模板名字为mapred-site.xml.template

$ sudo mv ./mapred-site.xml.template ./mapred-site.xml
<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>Master:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>Master:19888</value>
	</property>
</configuration>

(5)yarn-site.xml

<configuration>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<vallue>Master</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
</configuration>
  1. 将Master机上的Hadoop复制到其他节点上。

如果在Master机上跑过伪分布模式或格式化过Hadoop,要删除 ~/hadoop/tmp

$ sudo rm -rf ~/hadoop/tmp

传输hadoop文件

$ cd ~
$ tar -zcf ./hadoop-master.tar.gz ./hadoop #先打成压缩包
$ scp ./hadoop-master.tar.gz Slave1:/home/hadoop #使用scp传输

在Slave1上执行

$ cd ~ 
$ tar -zxf ./hadoop-master.tar.gz -C ./
$ sudo chown -R hadoop ~/hadoop

其他Slave机同理。

7.启动Hadoop集群

首次启动hadoop先在Master机进行格式化,如果先前进行过多次格式化或启动失败多次格式后要先将 /home/hadoop/hadoop/tmp 删除

格式化命令 (仅在第一次启动Hadoop前要格式化,之后都不用,否则会导致数据节点不一致而无法运行!!!)

$ hdfs namenode -format

启动Hadoop,所有机子都要在线

$ start-all.sh #旧命令,不建议
#或
$ start-dfs.sh
$ start-yarn.sh
$ mr-jobhistory-daemon.sh start historyserver

分别在Master机、Slave机执行 jps命令可以看到如下

Master机如图, 如果在前面步骤Master机不作为数据节点,则没有蓝色线项,其他项必须有,否则则配置出错

虚拟化 集群概念_Hadoop_18


Slave机如下:

虚拟化 集群概念_hadoop_19

8.Hadoop样例试验
$ hadoop jar ./hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar pi 3 3

出现红框内容,表示正在运算,在map 0% reduce 0% 处可能时间会长一点,如果很长时间都没有进展,建议重新开启Hadoop再试 ctrl+c 中断程序

虚拟化 集群概念_虚拟化 集群概念_20


虚拟化 集群概念_centos_21


出现以下界面则计算成功:

虚拟化 集群概念_centos_22


可以在浏览器中打开 http://192.168.1.121:50070http://192.168.1.121:8088/cluster 查看Hadoop集群情况

192.168.1.121 是Master机ip,在Master机的浏览器可以用Master 代替

http://192.168.1.121:8088/cluster 查看查看任务执行情况如下:

虚拟化 集群概念_hadoop_23

9.关闭Hadoop

关闭Hadoop集群,在Master机上执行

$ stop-all.sh #旧命令,不建议
#或
$ stop-yarn.sh
$ stop-dfs.sh
$ mr-jobhistory-daemon.sh stop historyserver
10.参考资料

[1] Hadoop安装教程_伪分布式配置_CentOS6.4/Hadoop2.6.0 [2] Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS [3] 【问题解决手记】VMWare虚拟机与本地主机不能互ping问题 [4] CentOS8 网卡配置文件 [5] CentOS 8时间同步 [6] Mac和Linux远程连接服务器异常修复(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!) [7] CentOS配置SSH免密码登录后,仍提示输入密码 [8] CentOS ping www.baidu.com 报错 name or service not know [9] Unable to load native-hadoop library for your platform… using builtin-java classes where applicable