1.乌班图安装
1.Ubuntu20系统镜像下载
在MSDN官网找到Ubuntu的选项后,使用BT种子在迅雷下载系统镜像,种子如下
magnet:?xt=urn:btih:9FC20B9E98EA98B4A35E6223041A5EF94EA27809&dn=ubuntu-20.04-desktop-amd64.iso&xl=2715254784

2.虚拟机网络的设置
要想虚拟机能上网,需要如下设置。选择虚拟机工具栏中,编辑-虚拟网络编辑器-VMnet8,之后设置NAT模式,并开启本地DHCP即可。选项不能点就点下右下角的更改设置。

然后关闭这个选项卡。
3.Ubuntu主机的安装
1.系统安装
我已经安装过VMWare了,这边直接安装乌班图系统,点击创建新的虚拟机后,选择典型。

下一步之后,选择系统镜像的位置

再下一步填写主机信息,由于Hadoop是分布式的,预计装三台虚拟机,主机起名如下

用户名和密码自行填写。虚拟机存放位置新建一个文件夹并改名放着。

之后分配存储空间大小,主机我分配了30G,单文件多文件选项随意。点击确认之后,自动进行系统的安装和各种安装包的下载。

之后打开终端,测试一下网络连通性,发现网络连上去了。

2.切换成中文
如果安装后是英文的,可以这样换成中文。

进入设置,找到地区和语言,点击管理已安装的语言。

会提示你安装不完整,这里点安装,然后等待。

安装会要求你输密码。
之后点击红圈部分,右边往下拉选简体中文,点右下角apply等着就行。

等下载完,要把汉语选项拖到最上面,默认在最下面。

然后地区格式化也改成中国。

这样就弄完了,重启当前虚拟机就行。(不用关VM也不用关其他虚拟机,重启当前这个即可)
3.关闭自动更新
终端中执行如下命令
sudo vi /etc/apt/apt.conf.d/10periodic a

将里面的属性值都变为0即可关闭自动更新
vi编辑器的使用不在这赘述,我用不来


4.屏幕快照
所有的虚拟机在达到某个稳定状态后,都应该创建一个快照,快照就是还原点,一旦出现问题可以直接恢复到当前状态,制作快照简单也不占体积。

然后点拍摄快照就行。
2.Hadoop安装
1.添加一个专有账号
添加新用户Hadoop,并设置密码,Linux中输入密码不可见,然后赋予sudo权限

创建名为hadoop的用户
sudo useradd -m hadoop -s /bin/bash
设置密码
sudo passwd hadoop
设置权限
sudo adduser hadoop sudo
2.更新apt和安装vim
更新apt

安装ssh-server,得按大写的Y

第一个地方输命令,第二个地方打yes,第三个地方输密码

配置无密码ssh登陆
此时输exit退出ssh连接,生成ssh秘钥,画红线的地方按回车就行。

然后将秘钥加入到授权中

此时登陆就不需要密码了。
之后输入
sudo apt-get update
进行更新
然后安装vim
sudo apt-get install vim
3.安装SSH、配置SSH无密码登陆
集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:
sudo apt-get install openssh-server
ssh localhost
此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。
但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。
首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:
exit # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授权
~的含义: 在 Linux 系统中,~ 代表的是用户的主文件夹,即 “/home/用户名” 这个目录,如你的用户名为 hadoop,则 ~ 就代表 “/home/hadoop/“。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。
此时再用 ssh localhost
命令,无需输入密码就可以直接登陆了,如下图所示。

4.安装Java环境
手动安装,推荐采用本方式
Hadoop3.1.3需要JDK版本在1.8及以上。需要按照下面步骤来自己手动安装JDK1.8。
可以点击这里到百度云盘下载JDK1.8安装包(提取码:ziyu)。请把压缩格式的文件jdk-8u162-linux-x64.tar.gz下载到本地电脑,假设保存在“/home/hadoop/Downloads/”目录下。
在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下
sudo tar -zxvf ./jdk-8u162-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_162目录。
下面继续执行如下命令,设置环境变量:
cd ~
vim ~/.bashrc
上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
1 | export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 |
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
source ~/.bashrc
这时,可以使用如下命令查看是否安装成功:
java -version
如果能够在屏幕上返回如下信息,则说明安装成功:
1 | hadoop@ubuntu:~$ java -version |
至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。
5.下载Hadoop
官网:https://hadoop.apache.org/releases.html
百度网盘:https://pan.baidu.com/share/init?surl=gbmPBXrJDCxwqPGkfvX5Xg (提取码lnwl)
这里我选的百度网盘内hadoop3.1.3版本,找到hadoop-3.1.3.tar.gz文件,下载到本地。
我们选择将 Hadoop 安装至 /usr/local/ 中:
sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
hadoop单机版安装完成
6.(其他软件).关于ip-tools和XShell,XFtp
1.ip
输入ifconfig -a查看本机ip,发现网络工具没装,按照提示按照工具。

查看虚拟机本地ip,并在XShell新建连接对话。输入ip
2.xshell
xshell已经安装过了,直接使用即可。

点击用户身份验证,输入虚拟机的用户名和密码

点击确定后,双击连接虚拟机,弹出对话框,选择接收并保存

连接成功

3.xftp
我使用的是xftp的平替产品FileZilla

输入信息后点击连接,成功获取了虚拟机上的所有文件信息。

4.使用sftp工具将文件传送到虚拟机上(已安装hadoop则不用看这个)

我把压缩包拖拽传到/usr/local路径上,如果失败无法传输,是因为用户权限不够造成的,执行下面命令。
sudo chmod 777 /usr/local
之后传输便是正常的
输入tar -zxf hadoop-3.1.3.tar.gz -C /usr/local
,解压文件到文件夹
ps:这里图不对文是我换了3.1.3的版本,看个意思就行都一样的

3.配置分布式集群Hadoop
有个小提示,使用gedit编辑文本的话只能在虚拟机内进行,使用xshell执行gedit可以但是会很麻烦。
使用sudo vim etc/hadoop/hdoop-env.sh
也可以使用 sudo gedit etc/hadoop/hdoop-env.sh
,记得点保存

输入这行内容export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

这一节后面的操作全部三台虚拟机同时进行。可以这样进行快捷操作

1.配置各主机静态IP
先配置VM的虚拟网络编辑器,选择一个合适的网段,这里子网IP不一定要和此处一致,建议先打开Windows看看自己的ip网段是多少,在同一网段最好。

然后在Windows打开网络适配器,找到VM8

我这里是这样配的

这时发现系统没装vim,用sudo apt install vim
安装一下,装不装都无所谓
打开设置,选择网络,点击那个设置按钮

然后根据情况手动配置地址,三台机子都配一下

配置好静态IP后就可以把xshell等的从机也一起配置链接了。
网络配置完成以后,可以查看一下机器的IP地址,可以使用ifconfig命令查看。我这里同一个局域网内部的三台机器的IP地址分别是192.168.73.135和192.168.73.136,192.168.73.137。
由于集群中有三台机器需要设置,所以,在接下来的操作中,一定要注意区分Master节点和Slave节点。为了便于区分Master节点和Slave节点,可以修改各个节点的主机名,这样,在Linux系统中打开一个终端以后,在终端窗口的标题和命令行中都可以看到主机名,就比较容易区分当前是对哪台机器进行操作。在Ubuntu中,我们在 Master 节点上执行如下命令修改主机名:
sudo vim /etc/hostname
执行上面命令后,就打开了“/etc/hostname”这个文件,这个文件里面记录了主机名,修改为“Master”(注意是区分大小写的),然后,保存退出vim编辑器,这样就完成了主机名的修改,需要重启Linux系统才能看到主机名的变化。
三台机子分别修改为Master,slave1,slave2。
2.设置域名映射解析
然后,在Master节点中执行如下命令打开并修改Master节点中的“/etc/hosts”文件:
sudo gedit /etc/hosts
在hosts文件中增加如下三条IP和主机名映射关系:
192.168.73.135 Master
192.168.73.136 slave1
192.168.73.137 slave2
修改后效果如下

需要注意的是,一般hosts文件中只能有一个127.0.0.1,其对应主机名为localhost,如果有多余127.0.0.1映射,应删除,特别是不能存在“127.0.0.1 Master”这样的映射记录。修改后需要重启Linux系统。
上面完成了Master节点的配置,接下来要继续完成对其他Slave节点的配置修改。请参照上面的方法,把**slave1、 2 **节点上的“/etc/hostname”文件中的主机名修改为“slave1”“slave2”,同时,修改“/etc/hosts”的内容,在hosts文件中增加如下IP和主机名映射关系:
192.168.73.135 Master
192.168.73.136 slave1
192.168.73.137 slave2
修改完成以后,请重新启动Slave节点的Linux系统。
这样就完成了Master节点和Slave节点的配置,然后,需要在各个节点上都执行如下命令,测试是否相互ping得通,如果ping不通,后面就无法顺利配置成功:
ping Master -c 3 # 只ping 3次就会停止,否则要按Ctrl+c中断ping命令
ping Slave1 -c 3
3.配置SSH免密登陆
必须要让Master节点可以SSH无密码登录到各个Slave节点上。首先,生成Master节点的公匙,如果之前已经生成过公钥,必须要删除原来生成的公钥,重新生成一次,因为前面我们对主机名进行了修改。具体命令如下:
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa* # 删除之前生成的公匙(如果已经存在)
ssh-keygen -t rsa # 执行该命令后,遇到提示信息,一直按回车就可以
为了让Master节点能够无密码SSH登录本机,需要在Master节点上执行如下命令:
cat ./id_rsa.pub >> ./authorized_keys
完成后可以执行命令“ssh Master”来验证一下,可能会遇到提示信息,只要输入yes即可,测试成功后,请执行“exit”命令返回原来的终端。
接下来,在Master节点将上公匙传输到slave1和slave2节点:
scp ~/.ssh/id_rsa.pub hadoop@slave1:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@slave2:/home/hadoop/
上面的命令中,scp是secure copy的简写,用于在 Linux下进行远程拷贝文件,类似于cp命令,不过,cp只能在本机中拷贝。执行scp时会要求输入Slave1上hadoop用户的密码,输入完成后会提示传输完毕。

接着在slave1和slave2节点上,将SSH公匙加入授权:
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在,则忽略本命令
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完以后就可以删掉
在Master节点上就可以无密码SSH登录到各个Slave节点了,可在Master节点上执行如下命令进行检验:
ssh Slave1
4. 配置PATH变量
需要在Master节点上进行配置。 首先执行命令“ gedit ~/.bashrc ”,然后,在该文件最上面的位置加入下面一行内容:
1 | export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin |
保存后执行命令“ source ~/.bashrc ”,使配置生效。
4.分布式运行
在配置集群/分布式模式时,需要修改“/usr/local/hadoop/etc/hadoop”目录下的配置文件,这里仅设置正常启动所必须的设置项,包括workers 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5个文件,更多设置项可查看官方说明。
1.修改文件workers
gedit /usr/local/hadoop/etc/hadoop/workers
需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让Master节点仅作为名称节点使用。
1 | Master |

2.修改文件core-site.xml
gedit /usr/local/hadoop/etc/hadoop/core-site.xml
1 | <configuration> |
3.修改文件hdfs-site.xml
gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml
对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。即集群中有3个数据节点,数据能保存3份,所以 ,dfs.replication的值设置为 3。此处具体为几视情况而定hdfs-site.xml具体内容如下:
1 | <configuration> |
4.修改文件mapred-site.xml
“/usr/local/hadoop/etc/hadoop”目录下有一个mapred-site.xml.template,需要修改文件名称,把它重命名为mapred-site.xml,如果已经存在就不用管。然后,把mapred-site.xml文件配置成如下内容:
gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml
1 | <configuration> |
5.修改文件 yarn-site.xml
gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml
1 | <configuration> |
上述5个文件全部配置完成以后,需要把Master节点上的“/usr/local/hadoop”文件夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前首先删除之前在伪分布式模式下生成的临时文件。具体来说,
需要首先在Master节点上执行如下命令:
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz slave1:/home/hadoop
scp ./hadoop.master.tar.gz slave2:/home/hadoop
然后在Slave1节点上执行如下命令:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
然后在Slave2节点上执行同样命令:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
同样,如果有其他Slave节点,也要执行将hadoop.master.tar.gz传输到Slave节点以及在Slave节点解压文件的操作。
首次启动Hadoop集群时,需要先在Master节点执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:
hdfs namenode -format
(最多执行一次)
6.启动集群
现在就可以启动Hadoop了,启动需要在Master节点上进行,执行如下命令:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
通过命令jps可以查看各个节点所启动的进程。如果已经正确启动,则在Master节点上可以看到NameNode、ResourceManager、SecondrryNameNode和JobHistoryServer进程,如下图所示。

在Slave节点可以看到DataNode和NodeManager进程,如下图所示。

缺少任一进程都表示出错。另外还需要在Master节点上通过命令“hdfs dfsadmin -report”查看数据节点是否正常启动,如果屏幕信息中的“Live datanodes”不为 0 ,则说明集群启动成功。

也可以在Linux系统的浏览器中输入地址“http://master:9870/”,通过 Web 页面看到查看名称节点和数据节点的状态。

分布式集群安装结束。在未关闭集群的情况下不可关闭虚拟机,关闭方法在后面
7.执行分布式实例
集群启动成功后分布式安装其实就结束了,嫌弃麻烦可以不用执行分布式实例进行测试,直接看下一条如何关闭集群。
执行分布式实例过程与伪分布式模式一样,首先创建HDFS上的用户目录,命令如下:
hdfs dfs -mkdir -p /user/hadoop
然后,在HDFS中创建一个input目录,并把“/usr/local/hadoop/etc/hadoop”目录中的配置文件作为输入文件复制到input目录中,命令如下
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
接着就可以运行 MapReduce 作业了,命令如下:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
运行时的输出信息与伪分布式类似,会显示MapReduce作业的进度,如下图所示。

执行过程可能会有点慢,但是,如果迟迟没有进度,比如5分钟都没看到进度变化,那么不妨重启Hadoop再次测试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改YARN的内存配置来解决。
在执行过程中,可以在Linux系统中打开浏览器,在地址栏输入“http://master:8088/cluster”,通过Web界面查看任务进度,在Web界面点击 “Tracking UI” 这一列的History连接,可以看到任务的运行信息,如下图所示。

执行完毕后的输出结果如下图所示。

8.关闭集群
关闭Hadoop集群,需要在Master节点执行如下命令:
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
之后若想重启,按启动集群的步骤即可。
记得多打快照
在正常关闭hadoop集群后可正常关闭虚拟机。
5.参考资料
伪分布式模式和分布式模式切换时需要注意以下事项:
(a)从分布式切换到伪分布式时,不要忘记修改slaves配置文件;
(b)在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以,如果集群以前能启动,但后来启动不了,特别是数据节点无法启动,不妨试着删除所有节点(包括Slave节点)上的“/usr/local/hadoop/tmp”文件夹,再重新执行一次“hdfs namenode -format”,再次启动即可。