当使用Hadoop的分布式模式进行部署和运行时,通常使用分布式文件系统HDFS进行存储。在这种情况下,HDFS的名称节点(NameNode)和数据节点(DataNode)位于不同的机器上。这样,数据可以分布在多个节点上,不同数据节点上的数据计算可以并行执行,这样才能更好的实现MapReduce分布式计算的能力。

为了简化分布式模式的部署难度,我们可以使用两个节点(两台物理机器)来搭建一个简单的集群环境。为了便于区分,我们将其中一台机器将作为Master节点,其主机名命名为hadoop01;另一台机器将作为Slave节点,其主机名命名为hadoop02。如果需要构建由三个以上节点组成的集群,可以采用类似的方法进行安装和部署。

Hadoop 集群的安装配置大致包括以下步骤: 步骤1:选定一台机器作为 Master; 步骤2:在Master节点上创建hadoop用户、安装SSH服务端、安装Java环境; 步骤3:在Master节点上安装Hadoop,并完成配置; 步骤4:在其他Slave节点上创建hadoop用户、安装SSH服务端、安装Java环境; 步骤5:将Master节点上的“/usr/local/hadoop-3.3.6”目录复制到其他Slave节点上; 步骤6:在Master节点上开启Hadoop;

上述这些步骤中,关于如何创建hadoop用户、安装SSH服务端、安装Java环境、安装Hadoop等过程,已经在前面介绍Hadoop3.3.6安装教程,单机/伪分布式配置的时候做了详细介绍,请按照之前介绍的方法完成步骤1到步骤4,这里不再赘述。在完成步骤1到步骤4的操作以后,才可以继续进行下面的操作。

一、安装虚拟机

请参照教程“Linux(01)虚拟机VMware Workstation17安装Debian11系统详细教程并配置root用户远程SSH登录_Eufeo的博客-CSDN博客”,安装好2个Linux虚拟机,主机名分别是hadoop01和hadoop02。由于hadoop02是Slave节点,不需要安装很多的软件,所以,配置可以比hadoop01低一,比如,对于hadoop02而言,内存只需要配置4GB,磁盘只需要配置20GB。

可以使用:

free -h # 查看内存的使用情况和配置

df -h # 查看硬盘的使用情况和配置

二、配置JDK和安装hadoop-3.3.6 

安装好虚拟机hadoop02以后,首先创建hadoop用户,其次安装java环境并配置jdk,再次使用hadoop用户登录Linux系统,安装SSH服务端,并安装hadoop-3.3.6。请参考教程“Hadoop(01) Hadoop3.3.6安装教程,单机/伪分布式配置-CSDN博客”。 

配置好JDK后,可以使用命令:echo $JAVA_HOME 查看当前系统中设置的JAVA_HOME环境变量的值。

配置好hadoop后,可以使用命令:echo $HADOOP_HOME  查看当前系统中设置的HADOOP_HOME环境变量的值。

三、网络设置

由于集群中有两台机器需要设置,所以,在接下来的操作中,一定要注意区分Master节点和Slave节点。为了便于区分Master节点和Slave节点,可以修改各个节点的主机名,这样,在Linux系统中打开一个终端以后,在终端窗口的标题和命令行中都可以看到主机名,就比较容易区分当前是对哪台机器进行操作。

3.1 修改mater和slave的主机名

在Debian中,我们在 Master 节点(hadoop01)上执行如下命令修改主机名:

sudo vim /etc/hostname

 执行上面命令后,就打开了“/etc/hostname”这个文件,这个文件里面记录了主机名.因此,打开这个文件以后,里面就只有“debian”这一行内容,可以直接删除,并修改为“hadoop01”(注意是区分大小写的),然后,保存退出vim编辑器,这样就完成了主机名的修改,需要重启Linux系统才能看到主机名的变化。 要注意观察主机名修改前后的变化。在修改主机名之前,如果用hadoop登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:

修改主机名并且重启Linux系统之后,用hadoop登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:

可以看出,这时就很容易辨认出当前是处于Master节点(hadoop01)上进行操作,不会和Slave节点(hadoop02)产生混淆。 同理,按照相同的方法,把虚拟机hadoop02中的主机名修改为“hadoop02”,并重启Linux系统。

3.2 配置映射关系 

然后,使用ifconfig命令获取每台虚拟机的IP地址,具体命令如下:

sudo apt-get update

sudo apt-get install net-tools

ifconfig

如下图是slave01的IP地址 

 然后,在hadoop01中(即master节点),执行如下命令打开并修改Master节点中的“/etc/hosts”文件:

vim /etc/hosts

可以在master节点的hosts文件中增加如下两条IP和主机名映射关系,同时将debian修改成新的主机名:

 需要注意的是,一般hosts文件中只能有一个127.0.0.1,其对应主机名为localhost,如果有多余127.0.0.1映射,应删除,特别是不能存在“127.0.0.1 hadoop01”也不能出现“127.0.1.1 hadoop01”这样的映射记录,否则会出现错误,导致datanode无法和namenode连接,详情请看此处。(此处因为在第一次写文章时没有注释掉,所有后面启动集群后会有报错,建议注释掉“127.0.1.1 hadoop01 这类映射记录”)修改后需要重启Linux系统。

上面完成了Master节点(hadoop01)的配置,接下来要继续完成对其他Slave节点的配置修改。本教程只有一个Slave节点,主机名为hadoop02。请参照上面的方法,把Slave节点上的“/etc/hostname”文件中的主机名修改为“hadoop02”,同时,修改“/etc/hosts”的内容,在hosts文件中增加如下两条IP和主机名映射关系:

修改完成以后,请重新启动Slave节点的Linux系统。 这样就完成了Master节点和Slave节点的配置,然后,需要在各个节点上都执行如下命令,测试是否相互ping得通,如果ping不通,后面就无法顺利配置成功:

ping 主机名 -c 3 #ping 3次后自动停止

在master节点上:

在salve01节点上:

四、hadoop02 SSH无密码登录节点设置

必须要让Master节点可以SSH无密码登录到各个Slave节点上。 首先需要在hadoop02上执行如下命令安装SSH服务端(如果此前已经安装就不用重复安装):

sudo apt-get update

sudo apt-get install openssh-server

然后,需要遭hadoop01上生成Master节点(hadoop01)的公匙,如果之前已经生成过公钥(在安装伪分布式模式的Hadoop时(第二节)生成过一次公钥),必须要删除原来生成的公钥,重新生成一次,因为前面我们对主机名进行了修改。在Master节点执行如下命令:

cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost

rm ./id_rsa* # 删除之前生成的公匙(如果已经存在)

ssh-keygen -t rsa # 执行该命令后,遇到提示信息,一直按回车就可以

为了让Master节点能够无密码SSH登录本机,需要在Master节点上执行如下命令:

cat ./id_rsa.pub >> ./authorized_keys

完成后可以执行命令“ssh hadoop01”来验证一下,可能会遇到提示信息,只要输入yes即可,测试成功后,请执行“exit”命令返回原来的终端。

接下来,在Master节点(hadoop01)将上公匙传输到Slave节点(hadoop02):

scp ~/.ssh/id_rsa.pub hadoop@hadoop02:/home/hadoop/

上面的命令中,scp是secure copy的简写,用于在 Linux下进行远程拷贝文件,类似于cp命令,不过,cp只能在本机中拷贝。执行scp时会要求输入hadoop02上hadoop用户的密码,输入完成后会提示传输完毕,如图所示。传输完成以后,在hadoop02上的“/home/hadoop”目录下就可以看到文件id_rsa.pub了。

接着在Slave节点(hadoop02)上执行如下命令将SSH公匙加入授权:

mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在,则忽略本命令

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub # 用完以后就可以删掉

如果有其他Slave节点,也要执行将Master公匙传输到Slave节点以及在Slave节点上加入授权这两步操作。 这样,在Master节点上就可以无密码SSH登录到各个Slave节点了,可在Master节点(hadoop01)上执行如下命令进行检验:

cd ~

ssh hadoop02

五、配置集群/分布式环境

在配置集群/分布式模式时,需要修改“/usr/local/hadoop-3.3.6/etc/hadoop”目录下的配置文件,这里仅设置正常启动所必须的设置项,包括workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5个文件,更多设置项可查看官方说明。

切换到目录 /usr/local/hadoop-3.3.6/etc/hadoop/

5.1 修改文件workers

workers文件是用于指定作为DataNode的主机列表的文件。每行包含一个主机名或IP地址,表示要作为DataNode的机器。

需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。

在进行分布式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让Master节点仅作为名称节点使用。 本教程让Master节点仅作为名称节点使用,因此将hadoop01中的workers文件中原来的localhost删除,只添加如下一行内容:

hadoop02

修改前:

修改后:

参数说明:

workers文件中只包含了hadoop02,而没有其他主机,意味着只有hadoop02被配置为运行DataNode角色。这表示hadoop02主机将作为唯一的DataNode节点参与Hadoop集群。

其他主机,如hadoop01,可能被配置为单独的NameNode节点、ResourceManager节点或其他角色,而不是DataNode。

这种配置可以是为了满足特定需求,例如将数据存储在独立的节点上,或者根据集群规模和资源分配将DataNode角色限制在特定的主机上。

5.2 修改core-site.xml文件 

hadoop01中的“/usr/local/hadoop-3.3.6/etc/hadoop”目录下有一个core-site.xml,把hadoop01中的core-site.xml文件修改为如下内容:

hadoop.tmp.dir

file:/usr/local/hadoop-3.3.6/tmp

Abase for other temporary directories.

fs.defaultFS

hdfs://hadoop01:9000

修改前(在hadoop(01) 伪分布式小节中已经修改过一次):

修改后(在hadoop(01) 伪分布式小节的基础上再做一次修改):

参数说明:

hadoop.tmp.dir:用于指定临时文件的存储路径。它被设置为file:/usr/local/hadoop-3.3.6/tmp,表示临时文件将存储在指定的路径中。 fs.defaultFS:用于指定默认的文件系统和连接的NameNode节点。它被设置为hdfs://hadoop01:9000,表示Hadoop将使用HDFS作为默认的文件系统,并连接到hadoop01主机上运行的NameNode节点的RPC地址和端口(9000)。

5.3 修改hdfs-site.xml文件

对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。但是,本教程只有一个Slave节点(即hadoop02)作为数据节点,即集群中只有一个数据节点,数据只能保存一份,所以 ,dfs.replication的值还是设置为 1。

hadoop01中的“/usr/local/hadoop-3.3.6/etc/hadoop”目录下有一个hdfs-site.xml,把hadoop01中的hdfs-site.xml文件修改为如下内容:

dfs.namenode.secondary.http-address

hadoop01:50090

dfs.replication

1

dfs.namenode.name.dir

file:/usr/local/hadoop-3.3.6/tmp/dfs/name

dfs.datanode.data.dir

file:/usr/local/hadoop-3.3.6/tmp/dfs/data

修改前:

修改后:

参数说明:

dfs.namenode.secondary.http-address:用于配置辅助(Secondary)NameNode 的 HTTP 地址。辅助 NameNode 的 HTTP 地址被设置为 hadoop01:50090,表示辅助 NameNode 可以通过 hadoop01 主机的端口 50090 进行访问。 dfs.replication:用于配置文件块的副本数量。副本数量被设置为 1,表示每个文件块只有一个副本。副本数量的设置对数据的冗余和可靠性有影响。 dfs.namenode.name.dir:用于配置主(Primary)NameNode 的名称目录路径。名称目录路径被设置为 file:/usr/local/hadoop-3.3.6/tmp/dfs/name,表示主 NameNode 的名称数据将存储在本地文件系统的 /usr/local/hadoop-3.3.6/tmp/dfs/name 路径下。 dfs.datanode.data.dir:用于配置数据节点(Datanode)的数据目录路径。数据目录路径被设置为 file:/usr/local/hadoop-3.3.6/tmp/dfs/data,表示数据节点的数据将存储在本地文件系统的 /usr/local/hadoop-3.3.6/tmp/dfs/data 路径下。

注意:

如果Hadoop集群中的hadoop01主机仅用作NameNode,而不是同时兼具DataNode角色,那么确实不需要在hdfs-site.xml配置文件中包含dfs.namenode.rpc-address配置项。

dfs.namenode.rpc-address配置项用于指定NameNode的RPC地址和端口,用于与其他DataNode节点进行通信。在纯粹的NameNode节点上,不需要与其他DataNode节点进行通信,因此可以省略这个配置项。

在这种情况下,只需确保dfs.namenode.secondary.http-address配置项正确设置为Secondary NameNode的HTTP地址和端口,并且dfs.namenode.name.dir配置项指定了正确的NameNode名称目录即可。

请记住,这仅适用于将hadoop01主机配置为纯粹的NameNode节点的情况。如果将来决定将这个主机扩展为兼具DataNode角色,那么您将需要添加dfs.namenode.rpc-address配置项以供其他节点与之通信。如下图所示:

 5.4 修改mapred-site.xml文件

hadoop01中的“/usr/local/hadoop-3.3.6/etc/hadoop”目录下有一个mapred-site.xml,把mapred-site.xml文件配置成如下内容:

mapreduce.framework.name

yarn

mapreduce.jobhistory.address

hadoop01:10020

mapreduce.jobhistory.webapp.address

hadoop01:19888

yarn.app.mapreduce.am.env

HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6

mapreduce.map.env

HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6

mapreduce.reduce.env

HADOOP_MAPRED_HOME=/usr/local/hadoop-3.3.6

修改前(注:hadoop(01)中未对该文件作任何修改,所以为空白):

修改后:

参数说明:

mapreduce.framework.name:用于配置 MapReduce 框架的名称。框架名称被设置为 yarn,表示使用 YARN(Yet Another Resource Negotiator)作为 MapReduce 的执行框架。 mapreduce.jobhistory.address:用于配置作业历史服务器(Job History Server)的地址。作业历史服务器的地址被设置为 hadoop01:10020,表示作业历史服务器可以通过 hadoop01 主机的端口 10020 进行访问。 mapreduce.jobhistory.webapp.address:用于配置作业历史服务器的 Web 应用程序地址。作业历史服务器的 Web 应用程序地址被设置为 hadoop01:19888,表示可以通过 hadoop01 主机的端口 19888 访问作业历史服务器的 Web 页面。 yarn.app.mapreduce.am.env:用于配置 MapReduce 应用程序管理器(ApplicationMaster)的环境变量。将 HADOOP_MAPRED_HOME 设置为 /usr/local/hadoop-3.3.6,以指定 MapReduce 应用程序管理器使用的 Hadoop MapReduce 的安装路径。 mapreduce.map.env 和 mapreduce.reduce.env:用于配置 Map 和 Reduce 任务的环境变量。都将 HADOOP_MAPRED_HOME 设置为 /usr/local/hadoop-3.3.6,以指定 Map 和 Reduce 任务使用的 Hadoop MapReduce 的安装路径。

5.5 修改文件 yarn-site.xml 

hadoop01中的“/usr/local/hadoop-3.3.6/etc/hadoop”目录下有一个yarn-site.xml,把hadoop01中的yarn-site.xml文件配置成如下内容:

yarn.resourcemanager.hostname

hadoop01

yarn.nodemanager.aux-services

mapreduce_shuffle

修改前:

修改后:

参数说明:

yarn.resourcemanager.hostname:用于配置资源管理器(ResourceManager)的主机名。源管理器的主机名被设置为 hadoop01,表示资源管理器运行在名为 hadoop01 的主机上。 yarn.nodemanager.aux-services:用于配置节点管理器(NodeManager)的辅助服务。辅助服务被设置为 mapreduce_shuffle,表示节点管理器将提供 MapReduce Shuffle 服务。

上述5个文件全部配置完成以后,需要把Master节点上的“/usr/local/hadoop-3.3.6”文件夹复制到各个节点上。如果之前已经运行过伪分布式模式(在hadoop(01)的教程中已经运行了),建议在切换到集群模式之前首先删除之前在伪分布式模式下生成的临时文件。具体来说,需要首先在Master节点上执行如下命令:

cd /usr/local/hadoop-3.3.6

sudo rm -r ./tmp # 删除 Hadoop 临时文件

sudo rm -r ./logs/* # 删除 hadoop 日志文件

cd /usr/local

tar -zvcf ~/hadoop.master.tar.gz ./hadoop-3.3.6/ # 先压缩再复制,创建一个名为 hadoop.master.tar.gz 的压缩文件,其中包含名为 hadoop-3.3.6 的目录及其内容

cd ~

ls -l # 查看是否压缩成功

scp ./hadoop.master.tar.gz hadoop02:/home/hadoop #将本地的 hadoop.master.tar.gz 压缩文件复制到远程主机 hadoop02 的 /home/hadoop 目录下。

删除前:

删除后:

查看是否压缩成功:

复制到hadoop02主机: 

然后在hadoop02节点上执行如下命令: 

cd ~

sudo rm -r /usr/local/hadoop-3.3.6 # 删掉旧的(如果存在)

sudo tar -zvxf ~/hadoop.master.tar.gz -C /usr/local

sudo chown -R hadoop /usr/local/hadoop-3.3.6 # 修改目录和其子目录的所有者权限

同样,如果有其他Slave节点,也要执行将hadoop.master.tar.gz传输到Slave节点以及在Slave节点解压文件的操作。

启动hadoop集群

首次启动Hadoop集群时,需要先在Master节点(hadoop01)执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:

cd /usr/local/hadoop-3.3.6

./bin/hdfs namenode -format

现在就可以启动Hadoop了,启动需要在Master节点(hadoop01)上进行,执行如下命令:

cd /usr/local/hadoop-3.3.6

./sbin/start-dfs.sh

./sbin/start-yarn.sh

./sbin/mr-jobhistory-daemon.sh start historyserver

通过命令jps可以查看各个节点所启动的进程。

如果已经正确启动,则在Master节点上可以看到NameNode、ResourceManager、SecondaryNameNode和JobHistoryServer进程,如图所示。

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

缺少任一进程都表示出错。

另外还需要在Master节点上通过“”查看数据节点是否正常启动: 

cd /usr/local/hadoop-3.3.6

./bin/hdfs dfsadmin -report

如果屏幕信息中的“Live datanodes”不为 0 ,则说明集群启动成功。由于本教程只有1个Slave节点充当数据节点,因此,数据节点启动成功以后,会显示如图所示信息。 

注意:如果前面都没有问题但是在这里开始出错了。无法正常显示datanode节点。或者如果刚开始在slave上可以看到datanode,但隔了一会儿看不见,是因为重复连接无法就自动关闭了。

解决办法,详情见此处。 

也可以在系统的浏览器中输入地址"master节点的IP地址:9870",通过Web 页面看到查看名称节点和数据节点的状态(如图所示)。如果不成功,可以通过启动日志排查原因。

这里再次强调,伪分布式模式和分布式模式切换时需要注意以下事项: 从分布式切换到伪分布式时,不要忘记修改workers配置文件; 在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以,如果集群以前能启动,但后来启动不了,特别是数据节点无法启动,不妨试着删除所有节点(包括Slave节点)上的“/usr/local/hadoop-3.3.6/tmp”文件夹,再重新执行一次“hdfs namenode -format”,再次启动即可。

六、执行分布式实例

执行分布式实例过程与伪分布式模式一样,首先创建HDFS上的用户目录,可以在Master节点(hadoop01)上执行如下命令:

echo $PATH | tr ':' '\n' # 查看PATH变量是否配置成功

hdfs dfs -mkdir -p /user/hadoop # 此前已经配置了PATH环境变量,所以不用路径全称

hdfs dfs -ls /user # 查看是否创建成功

 然后,在HDFS中创建一个input目录,并把“/usr/local/hadoop-3.3.6/etc/hadoop”目录中的配置文件作为输入文件复制到input目录中,命令如下:

hdfs dfs -mkdir input

hdfs dfs -put /usr/local/hadoop-3.3.6/etc/hadoop/*.xml input

接着就可以运行 MapReduce 作业了,命令如下:

hadoop jar /usr/local/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'

 运行时的输出信息与伪分布式类似,会显示MapReduce作业的进度,如图所示。

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

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

hdfs dfs -cat output/*

最后,关闭Hadoop集群,需要在Master节点(hadoop01)执行如下命令: 

stop-yarn.sh

stop-dfs.sh

mr-jobhistory-daemon.sh stop historyserver

参考资料 

Hadoop集群安装配置教程_Hadoop3.3.5_Ubuntu_厦大数据库实验室博客 (xmu.edu.cn)

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。