集群配置情况 :win10 + vmware15 + centos8+Hadoop-2.10.0
点击 创建新的虚拟机 >> 典型 >> 稍后安装操作系统
虚拟机名称 可以随意命名,我搭建hadoop集群,为了方便区分,集群主机命名为HadoppMaster,集群从机为HadoopSlave1、HadoopSlave2等等。
磁盘大小:主机(Master机) 30G(其实我觉得 20G也差不多了)
从机(Slave机)10G~20G 就基本可以了 这里我自己设置了10G
下面的选择,个人习惯是 单个文件(NFTS)
如果是FAT32磁盘格式的话,可能需要选择 拆分成多个文件
自定义硬件设置
点击 >> 打印机 >> 移除 这里有时候会引起冲突
点击 >> 声卡 >> 移除 这项可选可不选,反正不会用到声卡
点击 >> 新 CD/DVD(IDE) >> 使用ISO映像文件 >> 浏览选择你下载的centos8镜像
内存大小等设置是之后可以再调整的
点击 完成
语言选择界面 默认英语,可以自行选择中文
Time & Date 点击中国区,如果时间出现不一致后面通过命令解决
Software Selection 可以选择 Server with GUI (图形界面+浏览器,新手推荐,但是感觉有时候卡卡的)
或者选择Minimal Install (最小安装,只有命令行界面,轻快,传输东西可以用xshell或xftp在win10上操作完传过去)
我Master机选了GUI,Slave机选的是Minimal
Installation Destination 点两次那个磁盘就好了,虚拟机让它默认分就好。
NETWORK & HOST NAME 一定要打开网络连接的开关,特别是选了最小安装,不然centos8默认不联网,比较麻烦。
然后就可以Begin Installation
安装过程中可以设置 USER SETTINGS 在这里设置了比较方便,
我Root Password设置为 root 超短密码需要按两次Done
User Creation 创建了 用户名为 hadoop 密码为 hadoop 的账户
如果是部署多台从机的话,可以在安装好(含基本的工具)的机子后,利用 VMware 的克隆复制出多台从机。先不要急
安装结束重启后,还需要 √上使用许可 ,就可以进入centos8的系统啦
centos8的工具(终端,浏览器等都在点击左上角那个 Activies 后展开的菜单里)
su
//输入密码:root
visudo
在下面找到 root ALL=(ALL) ALL 这行,按i插入红线那一行,hadoop为你的用户名
按Esc,输入 :wq!
保存退出
在终端输入exit
退出 su 模式
终端输入
$ rpm -qa | grep ssh
有openssh-clients 和 openssh-server 则可
如果没有,则在终端输入以下命令安装
$ sudo dnf install openssh-clients
$ sudo dnf install openssh-server
//centos8 用 dnf 代替了 yum ,yum也是可以的
测试ssh连接
$ ssh localhost
$ exit # 退出ssh localhost
$ 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 #显示时间,时间和宿主机一致则校对成功
#安装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机。
在虚拟机关机的状态下,点击VMware的虚拟机 >> 管理 >> 克隆 >> 克隆自虚拟机中的当前状态 >> 创建完整克隆 >> 命名可以随意(这里我命名为HadoopSlave2)>> 完成
等待克隆完成即可,重复以上可以克隆出HadoopSlave3、HadoopSlave4等等。
没有说到的步骤都是点击下一步
在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方式
然后点击NAT设置 网关IP 设为 192.168.1.1
点击DHCP设置
(1)关闭防火墙
终端输入
$ su #进入超级用户模式root
$ systemctl stop firewalld.service #关闭防火墙
$ systemctl disable firewalld.service #关闭防火墙自启动
$ nmcli c reload #重启网络
(2)修改虚拟机 ip 地址
$ sudo vim /etc/sysconfig/network-scripts/
# 加 # 注释掉 BOOTPROTO="dhcp"
BOOTPROTO="static" #设为静态ip模式
IPADDR=192.168.1.121 #对应每台虚拟机的ip地址
PREFIX=24 #掩码位数
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.1.1 #网关,和之前VMware网络设置的对应
(3)设置主机名(虚拟机的hostname)
$ sudo vim /etc/hostname
#加入以下
NETWORKING=yes
HOSTNAME=Master #如果是Slave机,则是Slave1、Slave2等
$ sudo vim /etc/hosts
#加入集群的所有机子ip映射,我是 1 Master 2 Slave
192.168.1.121 Master
192.168.1.122 Slave1
192.168.1.123 Slave2
蓝色线为原有的,红色框为新添加的
以上4步需要在每台机子上操作一遍
在宿主机win10的网络和Internet >> 网络连接 >> VMnet8(NAT网卡) 设置为
其网络大概是这个样子:
$ 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
方法一:
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机也执行相同的操作
用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
$ 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)修改slaves文件,确定数据节点datanode
$ cd ~/hadoop/etc/hadoop
$ sudo vim ./slaves
#如果要Master机作为数据节点将localhost改为Master,否则删除
#在后面增加Slave机的名称
Slave1
Slave2
$ sudo vim ./core-site.xml #依次配置下列(2)~(5)文件
(2)core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://Master:9000value>
property>
<property>
<name>hadoop.tmp.dirname>
<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-addressname>
<value>Master:50090value>
property>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/home/hadoop/hadoop/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/home/hadoop/hadoop/tmp/dfs/datavalue>
property>
configuration>
(4)修改mapred-site.xml
这个文件需要先重命名,默认模板名字为mapred-site.xml.template
$ sudo mv ./mapred-site.xml.template ./mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>Master:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>Master:19888value>
property>
configuration>
(5)yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostnamename>
<vallue>Mastervalue>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
configuration>
如果在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机同理。
首次启动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机不作为数据节点,则没有蓝色线项,其他项必须有,否则则配置出错
Slave机如下:
$ hadoop jar ./hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar pi 3 3
出现红框内容,表示正在运算,在map 0% reduce 0% 处可能时间会长一点,如果很长时间都没有进展,建议重新开启Hadoop再试 ctrl+c 中断程序
出现以下界面则计算成功:
可以在浏览器中打开 http://192.168.1.121:50070 和 http://192.168.1.121:8088/cluster 查看Hadoop集群情况
192.168.1.121 是Master机ip,在Master机的浏览器可以用Master 代替
在 http://192.168.1.121:8088/cluster 查看查看任务执行情况如下:
关闭Hadoop集群,在Master机上执行
$ stop-all.sh #旧命令,不建议
#或
$ stop-yarn.sh
$ stop-dfs.sh
$ mr-jobhistory-daemon.sh stop historyserver
[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