最近在自学hadoop,学习途径是网上的视频、帖子以及hadoop官网文档。
因为各软件使用了最新版本,搭建过程并不是一帆风顺。加上一些视频和帖子对知识点解读不足甚至存在些许错误,故写下文章,希望为初学者提供一些帮助。
为了便于阅读,拆分成了《VMware安装CentOS 8》和《CentoOS 8搭建hadoop 3集群》两部分。
本文也适用于CentOS 7和hadoop 2。
相关链接:
Jonathan:VMware Workstation安装CentOS 8 最新版zhuanlan.zhihu.com软件环境
JDK
Java SE 8u241(官网地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)
(注:下载JDK需要注册Oracle账户)
hadoop
3.2.1(官网地址:https://hadoop.apache.org/releases.html)
前言
本文使用4台安装有CentOS 8的VMware虚拟机,演示3+1台电脑搭建hadoop集群:先用3台搭建集群,成功运行后再加入1台。
搭建流程在macOS中演示。Windows下操作相同,唯一区别是Windows 10使用ssh通过“命令提示符”,macOS通过“终端”。
各虚拟机的主机名为os1~os4,IP为192.168.1.201~204。
注:
1、Windows 10之前的系统没有内置ssh,需要下载第三方工具。
2、1台机器即可搭建(伪)集群。
3、运行mapreduce example每台虚拟机推荐至少2G内存。
一、Linux设置
只需要安装一台CentOS 8虚拟机并完成共性配置,其他虚拟机使用克隆功能复制即可,具体步骤参考文章开头的链接。
首先登陆第一台虚拟机,下文用os1代替。
(注:暂时不需要克隆其他虚拟机,共性设置完成后再克隆。)
网络设置
查看网卡
ip address
根据标号找到2:ens33,ens33是该虚拟机的网卡名。
(注:不同电脑标号和网卡名可能不同。)
![26f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/26f77faf-0614-eb11-8da9-e4434bdf6706.png)
设置IP
输入sudo vi /etc/sysconfig/network-scripts/ifcfg-网卡名
(注:sudo 开头的命令可能需要输入用户密码)
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
进入vi界面,按下键盘i键进入编辑状态,按方向键定位并修改如下信息:
BOOTPROTO=static,防止通过dhcp自动获取的IP对我们产生干扰。
ONBOOT=yes,开机后自动启用网卡。
IPADDR,根据不同虚拟机修改为192.168.1.201~204。
完成后按键盘左上角的esc键,输入“:wq!”(引号内部分),回车,保存修改。
(注:更多vi操作请自行百度。)
![27f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/27f77faf-0614-eb11-8da9-e4434bdf6706.png)
配置立即生效
sudo nmcli c reload
使用物理机ping虚拟机IP测试连通性
ping 192.168.1.201
![29f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/29f77faf-0614-eb11-8da9-e4434bdf6706.png)
使用ssh连接虚拟机
为了方便复制粘贴,后续操作将在物理机中通过ssh远程登录到虚拟机执行。
在终端输入命令
ssh root@192.168.1.201
首次登陆需要输入yes,回车。
再输入密码,回车。
![2cf77faf-0614-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/2cf77faf-0614-eb11-8da9-e4434bdf6706.png)
ssh连接报错
如果之前使用ssh连接过其他相同IP的不同主机,会报错如图。可以按提示路径使用记事本打开known_hosts文件,删除或注释该IP所在行的信息,也可以直接删除该文件,重新执行ssh命令即可。
(注:该文件为隐藏文件,macOS同时按下Command + Shift + .,显示隐藏文件。)
![2df77faf-0614-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/2df77faf-0614-eb11-8da9-e4434bdf6706.png)
新建管理员用户
如果你还没有创建自己的用户,可以使用命令行进行创建。
新建用户user1
sudo adduser user1
设置user1的密码
sudo passwd user1
按照提示,输入密码,回车,再输入一次密码,回车。
设置为管理员
sudo vi /etc/sudoers
进入vi界面,鼠标滚轮或方向键定位到
root ALL=(ALL) ALL
这一行,在该行下新增
user1 ALL=(ALL) ALL
esc键,输入“:wq!”(引号内部分),回车,保存修改。
![2ff77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/2ff77faf-0614-eb11-8da9-e4434bdf6706.png)
退出ssh连接,使用新建用户登陆虚拟机,后续操作均使用该用户完成。
exit
ssh user1@192.168.1.201
查看主机名
uname -n
修改主机名为os1
sudo hostnamectl set-hostname os1
关闭防火墙
sudo systemctl stop firewalld.service
禁止防火墙开机自启动
sudo systemctl disable firewalld.service
配置主机映射
sudo vi /etc/hosts
新增内容如下:
192.168.1.201 os1
192.168.1.202 os2
192.168.1.203 os3
配置完成后该主机可以通过主机名代替IP访问各虚拟机。
![30f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/30f77faf-0614-eb11-8da9-e4434bdf6706.png)
二、安装JDK、hadoop 3
复制JDK、hadoop 3到虚拟机
启动一个新的终端,将物理机下载好的JDK、hadoop 3压缩包复制到虚拟机,注意 jdk、hadoop 3、用户名@IP:虚拟机文件夹 的路径是否正确。
(注:发稿时hadoop适配的JDK最高版本为1.8,详见https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions)
scp /Users/caiwei/Downloads/jdk-8u241-linux-x64.tar.gz /Users/caiwei/Downloads/hadoop-3.2.1.tar.gz user1@192.168.1.201:/home/user1
![32f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/32f77faf-0614-eb11-8da9-e4434bdf6706.png)
解压JDK、hadoop 3
回到ssh窗口,输入命令确保JDK、hadoop 3已经收到并正确解压
cd /home/user1/
ls
tar -xf jdk-8u241-linux-x64.tar.gz
tar -xf hadoop-3.2.1.tar.gz
ls
![35f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/35f77faf-0614-eb11-8da9-e4434bdf6706.png)
配置环境变量
sudo vi /etc/profile
末尾处添加,注意路径是否正确
export JAVA_HOME=/home/user1/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/home/user1/hadoop-3.2.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
![37f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/37f77faf-0614-eb11-8da9-e4434bdf6706.png)
配置立即生效
source /etc/profile
Java环境验证
java -version
hadoop 3环境验证
hadoop version
![38f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/38f77faf-0614-eb11-8da9-e4434bdf6706.png)
三、配置hadoop 3
配置hadooop 3使用的JDK
cd hadoop-3.2.1/etc/hadoop/
vi hadoop-env.sh
添加(Hadoop 2为修改)
export JAVA_HOME=/home/user1/jdk1.8.0_241
![3af77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/3af77faf-0614-eb11-8da9-e4434bdf6706.png)
功能规划
1个NameNode,提供hdfs服务
3个DataNode,存储节点
1个SecondaryNameNode,检查点
1个ResourceManager,集群资源管理器
3个NodeManager,节点资源管理器
服务器规划
os1:NameNode + DataNode + NodeManager
os2:SecondaryNameNode + DataNode + NodeManager
os3:ResourceManager + DataNode + NodeManager
配置hdfs服务地址、临时文件夹
参考资料https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml
vi core-site.xml
configuration内添加
<property>
<name>fs.defaultFS</name>
<value>hdfs://os1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/user1/tmp/hadoop-user1</value>
</property>
配置副本数量、NameNode文件夹、DataNode文件夹、SecondaryNameNode服务地址
参考资料https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
hadoop 2的dfs.namenode.secondary.http-address为os:50090
vi hdfs-site.xml
configuration内添加
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/user1/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/user1/dfs/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>os2:9868</value>
</property>
配置MapReduce调用的framework(Hadoop 2先执行cp mapred-site.xml.template mapred-site.xml)
参考资料https://hadoop.apache.org/docs/r3.2.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
vi mapred-site.xml
configuration内添加
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置mappreduce服务、yarn环境变量、ResourceManager
参考资料https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
vi yarn-site.xml
configuration内添加
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>os3</value>
</property>
配置数据节点
vi workers
删除或使用#注释localhost,Hadoop 2为vi slaves(估计是slaves这个词比较敏感)
user1@os1
user1@os2
user1@os3
![3ef77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/3ef77faf-0614-eb11-8da9-e4434bdf6706.png)
关闭虚拟机
至此,共性配置全部完成
sudo shutdown
克隆虚拟机
使用克隆功能复制出另外3台虚拟机,具体步骤参考文章开头的链接。
四、个性化配置
由于克隆出的各虚拟机内容是完全一致的,为了搭建集群,至少需要修改各虚拟机的IP和主机名。
修改IP和主机名
参考前文修改IP和主机名为192.168.1.202~203、os2~os3。
(注:由于克隆出的虚拟机IP相同,你无法确定连接到了哪台,所以请一次只开启一台虚拟机,直到IP设置结束。)
配置ssh免密登陆
配置完IP和主机名后,需要配置各虚拟机之间的ssh免密连接。同时开启虚拟机os1~os3。使用ssh依次在每台虚拟机重复以下操作
生成密钥对
ssh-keygen
三次回车(注:如果之前执行过,会询问是否覆盖)
发送公钥实现免密连接
ssh-copy-id user1@os1
根据提示输入yes,回车,再输入os1上的user1的密码,回车。重复执行上一个命令,将user1@os1替换为其他虚拟机的用户名和主机名(如user1@os2、user1@os3)
![40f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/40f77faf-0614-eb11-8da9-e4434bdf6706.png)
五、只执行一次的设置
初始化NameNode
ssh登陆os1(服务器规划的NameNode节点),执行初始化命令
(注:该命令只能执行一次,再次执行前,请根据hdfs-site.xml配置文件删除所有虚拟机对应的dfs.namenode.name.dir和dfs.datanode.data.dir目录)
hadoop namenode -format
![41f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/41f77faf-0614-eb11-8da9-e4434bdf6706.png)
六、启动
启动hdfs
ssh连接到NameNode即os1,执行
start-dfs.sh
![43f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/43f77faf-0614-eb11-8da9-e4434bdf6706.png)
启动yarn
ssh连接到ResourceManager即os3,执行
start-yarn.sh
![44f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/44f77faf-0614-eb11-8da9-e4434bdf6706.png)
服务验证
在os1~os3下执行
jps
可以看到功能规划中的所有服务已经启动
![49f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/49f77faf-0614-eb11-8da9-e4434bdf6706.png)
![4af77faf-0614-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/4af77faf-0614-eb11-8da9-e4434bdf6706.png)
![4cf77faf-0614-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/4cf77faf-0614-eb11-8da9-e4434bdf6706.png)
hdfs验证
物理机浏览器访问http://192.168.1.201:9870(Hadoop 2为http://192.168.1.201:50070),可以看到Live node3是3,即3个数据节点。
![50f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/50f77faf-0614-eb11-8da9-e4434bdf6706.png)
yarn验证
物理机浏览器访问http://192.168.1.203:8088,可以看到Active node3是3,即3个资源节点。
![51f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/51f77faf-0614-eb11-8da9-e4434bdf6706.png)
七、新增数据节点
os1中停止hdfs
stop-dfs.sh
os3中停止yarn
stop-yarn.sh
开启虚拟机os4
参考前文修改IP和主机名为204和os4。
(注:开启并修改os4的IP前请确保没有运行中的虚拟机与os4当前及要修改为的IP相同,如果忘了检查导致IP冲突影响使用,执行sudo init 6命令重启发生冲突的虚拟机即可。)
新增主机映射
参考前文,os1~os4配置主机映射
192.168.1.201 os1
192.168.1.202 os2
192.168.1.203 os3
192.168.1.204 os4
配置数据节点
参考前文,os1~os4配置数据节点
user1@os1
user1@os2
user1@os3
user1@os4
配置ssh免密登陆
参考前文,os4配置对os1~os4的免密登陆,os1~os3新增对os4的免密登陆
启动hdfs和yarn
参考前文启动hdfs和yarn
os4验证
jps
![53f77faf-0614-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/53f77faf-0614-eb11-8da9-e4434bdf6706.png)
也可使用浏览器进行验证,新节点os4已经加入到集群中。