大数据导论实验一——搭建Hadoop集群

本文最后更新于:2022年10月24日 下午

安装Centos7

很容易,不解释,建议最小安装

创建Hadoop用户

1
2
su	#以root用户登录
useradd -m hadoop -s /bin/bash #创建用户hadoop

修改hadoop用户的密码:

1
passwd hadoop

为hadoop用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题,执行:

1
visudo

找到下图处并修改为:

image-20220925203522141

安装ssh和openssh

集群、单节点模式都需要用到SSH登陆(类似于远程登陆,你可以登录某台Linux主机,并且在上面运行命令),一般情况下,CentOS默认已安装了SSH client、SSH server,打开终端执行如下命令进行检验:

1
2
rpm -qa | grep ssh
rpm -qa | grep openssh

若如下图所示即已经安装。

image-20220925203959506

image-20220925204105810

否则执行下列命令安装:

1
sudo yum install openssh

接着执行如下命令测试一下 SSH 是否可用:

1
ssh localhost

此时按提示输入密码,这样就登陆到本机了。

但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。

首先输入 exit 退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

1
2
3
4
5
exit                           # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat id_rsa.pub >> authorized_keys # 加入授权
chmod 600 ./authorized_keys # 修改文件权限

此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了。

使用Xshell连接虚拟机

设置虚拟机网络(其实完全不用,用好ip a就够了)

image-20220925204730755

image-20220925220753079

image-20220925220816717

image-20220925220839048

右键虚拟机->设置->选择设置了Nat模式的网卡

image-20220925205002888

image-20220925205032862

修改Windows IP地址:

image-20220925220458608

image-20220925220516632

image-20220925220622901

当然你前面都不做也可以,等到分布的时候再做也行。😋😋😋😋😋😋😋😋

执行命令:

1
ip a	#记住这个命令,后面还能用到

image-20220925205553520

划红线的就是虚拟机的ip

接下来使用一款ssh客户端就可以连接了

安装Java环境(装1.8!!!)

Java环境可选择Oracle的JDK,或是OpenJDK,现在一般Linux系统默认安装的基本是OpenJDK。需要注意的是,CentOS中默认安装的只是JavaJRE,而不是JDK,为了开发方便,我们还是需要通过yum进行安装JDK,安装过程中会让输入[y/N],输入y即可:

1
2
# 血的教训,hadoop版本匹配问题,只能用jdk1.8
sudo yum install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64

通过上述命令安装 OpenJDK,默认安装位置为 /usr/lib/jvm/java-11-openjdk

接着需要配置一下 JAVA_HOME 环境变量

1
sudo vim /etc/profile.d/my_env.sh

在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:

1
2
export JAVA_HOME=/opt/module/jdk1.8.0_341
export PATH=$PATH:$JAVA_HOME/bin

接着还需要让该环境变量生效,执行如下代码:

1
source /etc/profile    # 使变量设置生效

设置好后我们来检验一下是否设置正确:

1
2
3
echo $JAVA_HOME     # 检验变量值
java -version
$JAVA_HOME/bin/java -version # 与直接执行 java -version 一样

如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样,如下图所示:

image-20221024150319936

这样,Hadoop 所需的 Java 运行环境就安装好了。

如何在Linux装Java1.8和删除Java,我想网上很多,这里默默装完了

安装Hadoop

Hadoop可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,本教程选择的是 3.3.4 版本,下载时请下载 hadoop-3.3.4.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。如果你用的不是3.3.4版本,则将所有命令中出现的3.3.4更改为你所使用的版本。

下载完成后通过ssh工具传到虚拟机内,放在你能找到的路径内,我们选择将 Hadoop 安装至 /usr/local/ 中:

1
2
3
4
sudo tar -zxf hadoop-3.3.4.tar.gz -C /usr/local    # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.3.4/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

1
2
cd /usr/local/hadoop
./bin/hadoop version

image-20220925212036843

同样把hadoop添加到环境变量:

1
2
3
4
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

Hadoop单机配置

Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。

现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子,包括 wordcount、terasort、join、grep 等。

在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

1
2
3
4
cd /usr/local/hadoop
mkdir ./inputcp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/* # 查看运行结果

注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。

1
rm -r ./output

修改虚拟机ip 和主机名并验证

最小安装模式ifconfig命令无法使用,安装net-tools:

1
sudo yum install net-tools.x86_64

root权限下输入下述命令:

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

修改为如下图所示:

image-20220925221357343

修改主机名称为namenode

1
vi /etc/hostname

image-20220925221540734

配置主机名IP地址映射,方便管理:

1
vi /etc/hosts

image-20220925221722561

所有配置完成后重新启动。重启之后,通过ifconfig和hostname命令验证ip地址和主机名是否配置成功。

1
2
3
reboot
ifconfig
hostname

关闭防火墙,关闭防火墙开机自启

1
2
systemctl stop firewalld
systemctl disable firewalld.service
  • 注意:在企业开发时,通常单个服务器的防火墙时关闭的。公司整体对外会设置非常安全的防火墙

在/opt目录下创建文件夹,并修改所属主和所属组:

在/opt目录下创建module、software文件夹,未来有关hadoop的软件都安装在此

1
2
mkdir /opt/module
mkdir /opt/software

修改module、software文件夹的所有者和所属组均为hadoop用户

1
2
chown hadoop:hadoop /opt/module
chown hadoop:hadoop /opt/software

查看module、software文件夹的所有者和所属组

1
2
cd /opt/
ll

这两个文件夹是放Java安装包和hadoop安装包的,module是安装目录,其实随便安装在哪都行,只要环境变量配置好就行了

克隆模板虚拟机

image-20220926144420601

注意不要选择连接模式克隆,要单独的克隆

克隆完成后修改这新的两台虚拟机的静态IP:

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

把这新的两台虚拟机的静态IP分别改为:

1
2
IPADDR=192.168.10.101
IPADDR=192.168.10.102

修改克隆机主机名为DataNode1和DataNode2:

1
vi /etc/hostname

分别改成DataNode1和DataNode2就行

之后reboot两台新虚拟机,然后继续用Xshell连接到这俩虚拟机,注意命令ip a

这时候测试一下可不可以用ssh登录到其他虚拟机:

1
ssh DataNode2

输入密码后就可以成功连接了,大功告成

ssh免密登录

1
2
cd /home/hadoop/.ssh
ssh-keygen -t rsa #之后按三次回车

生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

将公钥拷贝到要免密登录的目标机器上

1
2
3
ssh-copy-id DataNode1
ssh-copy-id DataNode2
ssh-copy-id NameNode

对另外两台机子做同样的操作

集群配置

集群部署规划

注意:

  • NameNode和Secondarynamenode不要安装在同一台服务器

  • ResourceManager也很消耗内存,不要和NameNode、Secondarynamenode配置在同一台机器上。

按照下表配置安装:

namenode datanode1 datanode2
HDFS NameNode DataNode DataNode Secondarynamenode DataNode
YARN NodeManager ResourceManager NodeManager NodeManager

配置文件说明

​ core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

配置集群

切换到hadoop用户(目前在datanode1虚拟机上)

  1. 配置core-site.xml
1
2
cd $HADOOP_HOME/etc/hadoop
sudo vi core-site.xml #注意这里一定是sudo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定namenode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://NameNode:8020</value>
</property>

<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.4/data</value>
</property>

<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
  1. HDFS配置文件
1
sudo vi hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>NameNode:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>DataNode2:9868</value>
</property>
</configuration>
  1. 配置yarn-site.xml
1
sudo vi yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>DataNode1</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>
</configuration>
  1. 配置mapred-site.xml
1
sudo vi mapred-site.xml
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

群起集群

  1. 配置workers
1
sudo vi /opt/module/hadoop-3.3.4/etc/hadoop/workers

在该文件中增加如下内容:

1
2
3
NameNode
DataNode1
DataNode2

同步所有节点配置文件:

1
scp -r 	/opt/module/hadoop-3.3.4/etc/hadoop hadoop@datanode2:/opt/module/hadoop-3.3.4/etc/
1
scp -r 	/opt/module/hadoop-3.3.4/etc/hadoop hadoop@namenode:/opt/module/hadoop-3.3.4/etc/

这里若出现Permission Denied,可以手动将修改后的文件复制到另外两个虚拟机,最好是给hadoop访问这个目录的权限:

1
sudo chown -R hadoop /opt/module/hadoop-3.3.4

启动集群

1
cd /opt/module/hadoop-3.3.4

如果集群是第一次启动,需要在namenode节点格式化namenode:

1
hdfs namenode -format

启动HDFS:

1
sbin/start-dfs.sh

在配置了ResourceManager的节点(DataNode1)启动YARN:

1
sbin/start-yarn.sh

Web端查看HDFS的NameNode,浏览器输入:http://192.168.10.100:9870

image-20220926205726753

Web端查看YARN的ResourceManager,浏览器输入:http://192.168.10.101:8088

image-20221024150803429

遇到的困难和解决

  1. Java版本和Hadoop版本的兼容性问题

最开始安装的是Java11,但是最后启动集群的时候会报空指针错误,后来查明是Java版本的问题。

  1. hadoop配置文件错误

最开始给的实验指导是错的,耽误好长时间。

实验心得

第一次接触hadoop,真的遇到了好多问题,虽然本人对Linux比较了解,但是实验指导里面确实有很多冗余,还需要进一步精简。这次试验中我新学到了虚拟机的克隆和集群的搭建,也知道了如何在Linux下查询当前的IP地址,总的来说,让三个主机工作在一起是相当有意义的。


大数据导论实验一——搭建Hadoop集群
https://jialiangz.github.io/2022/09/25/first_hadoop/
作者
爱吃菠萝
发布于
2022年9月25日
更新于
2022年10月24日
许可协议