由于最近在网上查阅资料发现很少有基于云服务器来搭建部署hadoop集群的文章,而且使用新版的hadoop的又更少了,所以自己根据网上搭建的例子结合成功实现了部署,这里我就来分享一下的部署过程。
1.服务器
这里我选用的是三个华为云的服务器,具体配置看个人。这里我是使用Ubuntu22.04操作系统。
按照流程创建好后,每个服务器都会有一个公网ip与内网ip。
账号先使用默认的root(管理员)账户。
设置服务器的安全组,除了原本已经配置的端口,这里我又开放了几个常用的端口以防碰到错误。
2.安装使用FinalShell
由于服务器端的操作系统一般都是没有界面的,所以这里我们需要使用一些工具来提升我们的工作效率。
点击确认并连接
第一次连接进入点击“接受并保存”
2.1修改主机名(主从节点)
“root + @ + 主机名” 如果在创建服务器的时候没有修改主机名的话,最好现在规范一下主机名。输入以下命令打开 hostname文件修改主机名(服务器已带有vim 没有的话得自己装)
sudo vim /etc/hostname
按“i”进入插入模式,修改主机名,这三台服务器分别命名为huaweiyun1、huaweiyun2、huaweiyun3。按Esc后 输入 :wq 进行退出并保存。
huaweiyun1主节点 huaweiyun2从节点 huaweiyun3从节点
只要是与修改文件相关的,也可以通过FinalShell根据路径双击打开文件修改保存!
2.2修改主机名映射(主从节点)(坑多)
在 huaweiyun1主节点 中执行如下命令打开并修改 huaweiyun1主节点 中的“/etc/hosts”文件
sudo vim /etc/hosts
在hosts文件中增加如下三条IP和主机名映射关系:
huaweiyun1的hosts
huaweiyun2与huaweiyun3的hosts也类似,区别就是“谁节点下的hosts文件 谁就使用内网ip”
huaweiyun1:huaweiyun1 内网ip;huaweiyun2 外网ip;huaweiyun3 外网ip
huaweiyun2:huaweiyun1 外网ip;huaweiyun2 内网ip;huaweiyun3 外网ip
huaweiyun3:huaweiyun1 外网ip;huaweiyun2 外网ip;huaweiyun3 内网ip
"127.0.0.1 主机名"的一定要删掉或者注释掉,不然会hadoop启动的时候打开的端口都是从127.0.0.1的本机ip上打开的,这样子主从节点就无法交互。
另外在华为云服务器上部署的Linux系统重启后/etc/hosts自动添加主机名解析
在每次服务器重启的时候都会在hosts文件里添加"127.0.0.1 主机名",所以我们就要取消该配置
sudo vim /etc/cloud/cloud.cfg
注释掉manage_etc_hosts配置项
这样重新启动时就不会再往hosts文件里添加"127.0.0.1 主机名"了
3.创建hadoop用户(主从节点)
输入如下命令创建hadoop用户
sudo useradd -m hadoop -s /bin/bash
接着使用如下命令设置密码,可以简单设置,按提示输入两次密码:
sudo passwd hadoop
为 hadoop 用户增加管理员权限,方便部署
sudo adduser hadoop sudo
接下来我们可以使用su命令来切换用户
su hadoop
也可以在FinalShell里设置启动时登录的用户为hadoop用户(推荐在配置完并成功运行后再去设置)
4.安装Java环境(主从节点)
Hadoop3.3.5需要JDK版本在1.8及以上。需要按照下面步骤来自己手动安装JDK1.8。
这里我使用的是jdk-8u371-linux-x64.tar.gz ,只要是jdk8就行,后边教程注意修改就好
度盘链接https://pan.baidu.com/s/1gJYjjicxfBLPTqE6UISDVw?pwd=star
把压缩格式的文件jdk-8u162-linux-x64.tar.gz上传到所有服务器的home目录下,可以使用FinalShell上传文件。
执行如下Shell命令(注意:当前登录用户名是hadoop)
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd home #注意区分大小写字母,刚才已经通过FinalShell把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
cd /usr/lib
创建/usr/lib/jvm目录用来存放JDK文件
sudo mkdir jvm
cd home
sudo tar -zxvf ./jdk-8u371-linux-x64.tar.gz -C /usr/lib/jvm
把JDK文件解压到/usr/lib/jvm目录下
JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下
cd /usr/lib/jvm
ls
可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_371目录。
下面继续执行如下命令,设置环境变量:
cd ~
vim ~/.bashrc
使用vim编辑器打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
source ~/.bashrc
可以使用如下命令查看jdk是否安装成功:
java -version
至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。
5.安装hadoop-3.3.5(主节点)
Hadoop安装文件,可以到Hadoop官网下载hadoop-3.3.5.tar.gz
或者度盘:链接: https://pan.baidu.com/s/1EHUSJrrMOQEs7WXIACXTSQ?pwd=star
下载后上传到home目录下,选择将 Hadoop 安装至 /usr/local/ 中:
sudo tar -zxf ~/home/hadoop-3.3.5.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./hadoop-3.3.5/ ./hadoop
修改文件权限
sudo chown -R hadoop ./hadoop
已经介绍过PATH变量的配置方法。可以按照同样的方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令(主从节点都要改)
下面继续执行如下命令,设置环境变量:
cd ~
vim ~/.bashrc
使用vim编辑器打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
source ~/.bashrc
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
hadoop version
6.SSH无密码登录节点(主从节点)
必须要让huaweiyun1节点可以SSH无密码登录到各个Slave节点上。首先,生成huaweiyun1节点的公匙,如果之前已经生成过公钥,必须要删除原来生成的公钥,重新生成一次,因为前面我们对主机名进行了修改。具体命令如下:(注意此时各个节点的用户应该是hadoop不是root)
cd ~/.ssh
如果没有该目录,先执行一次ssh localhost
rm ./id_rsa*
ssh-keygen -t rsa
执行该命令后,遇到提示信息,一直按回车就可以
为了让huaweiyun1节点能够无密码SSH登录本机,需要在huaweiyun1节点上执行如下命令:
cat ./id_rsa.pub >> ./authorized_keys
完成后可以执行命令“ssh huaweiyun1”来验证一下,可能会遇到提示信息,只要输入yes即可,测试成功后,请执行“exit”命令返回原来的终端。
接下来,在huaweiyun1节点将上公匙传输到huaweiyun2、huaweiyun3节点:
scp ~/.ssh/id_rsa.pub hadoop@huaweiyun2:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@huaweiyun3:/home/hadoop/
接着分别在huaweiyun2、huaweiyun3节点上,将SSH公匙加入授权:
mkdir ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
用完以后就可以删掉
rm ~/id_rsa.pub
这样,在huaweiyun1节点上就可以无密码SSH登录到各个Slave节点了,可在huaweiyun1节点上执行如下命令进行检验:
ssh huaweiyun2
ssh huaweiyun3
7. 配置集群/分布式环境(主从节点)
在配置集群/分布式模式时,需要修改“/usr/local/hadoop/etc/hadoop”目录下的配置文件,这里仅设置正常启动所必须的设置项,包括workers(之前版本名称是slaves) 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5个文件,更多设置项可查看官方说明。
修改方法同上,可以vim,也可以使用FinalShell编辑修改保存。
7.1修改文件workers(主节点)
配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式配置时,可以保留localhost,让huaweiyun1节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让huaweiyun1节点仅作为名称节点使用。
本教程让huaweiyun1节点仅作为名称节点使用,因此将workers文件中原来的localhost删除,只添加如下内容:
huaweiyun2
huaweiyun3
7.2修改文件core-site.xml(主节点)
请把core-site.xml文件修改为如下内容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://huaweiyun1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
7.3修改文件hdfs-site.xml (主节点)
对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。但是,本教程有两个Slave节点作为数据节点,即集群中有两个数据节点,数据能保存两份,所以 ,dfs.replication的值可以设置为 2。hdfs-site.xml具体内容如下:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>huaweiyun1:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
7.4修改文件mapred-site.xml(主节点)
如果“/usr/local/hadoop/etc/hadoop”目录下有一个mapred-site.xml.template,需要修改文件名称,把它重命名为mapred-site.xml,然后,把mapred-site.xml文件配置成如下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>huaweiyun1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>huaweiyun1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
</configuration>
7.5修改文件 yarn-site.xml(主节点)
把yarn-site.xml文件配置成如下内容:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>huaweiyun1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
上述5个文件全部配置完成以后,需要把huaweiyun1节点上的“/usr/local/hadoop”文件夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前首先删除之前在伪分布式模式下生成的临时文件。具体来说,需要首先在huaweiyun1节点上执行如下命令:
cd /usr/local
删除 Hadoop 临时文件
sudo rm -r ./hadoop/tmp
删除日志文件
sudo rm -r ./hadoop/logs/*
先压缩再复制
tar -zcf ~/hadoop.master.tar.gz ./hadoop
cd ~
scp ./hadoop.master.tar.gz huaweiyun2:/home/hadoop
scp ./hadoop.master.tar.gz huaweiyun3:/home/hadoop
然后分别在huaweiyun2、huaweiyun3节点上执行如下命令:
删掉旧的(如果存在)
sudo rm -r /usr/local/hadoop
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
8.启动hadoop
首次启动Hadoop集群时,需要先在huaweiyun1节点执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:
hdfs namenode -format
现在就可以启动Hadoop了,启动需要在Master节点上进行,执行如下命令:
start-all.sh
mr-jobhistory-daemon.sh start historyserver
通过命令jps可以查看各个节点所启动的进程。如果已经正确启动,则在huaweiyun1节点上可以看到NameNode、ResourceManager、SecondrryNameNode和JobHistoryServer进程,如下图所示。
在huaweiyun2、huaweiyun3节点可以看到DataNode和NodeManager进程,如下图所示。
缺少任一进程都表示出错。另外还需要在Master节点上通过命令“hdfs dfsadmin -report”查看数据节点是否正常启动
hdfs dfsadmin -report
如果屏幕信息中的“Live datanodes”不为 0 ,则说明集群启动成功。由于本教程只有2个Slave节点充当数据节点,因此,数据节点启动成功以后,会显示如下图所示信息。
也可以在浏览器中输入地址“http://主节点ip:9870/”,通过 Web 页面看到查看名称节点和数据节点的状态。如果不成功,可以通过启动日志排查原因。(服务器需要开放9870端口!)
这样子hadoop集群就算是启动成功了。
最后,关闭Hadoop集群,需要在huaweiyun1节点执行如下命令:
stop-all.sh
mr-jobhistory-daemon.sh stop historyserver