单机、伪分布、全分布
- 实验目的
(1)掌握Linux虚拟机安装方法或者双系统安装方法。
(2)掌握Hadoop的伪分布/全分布式安装方法。
- 实验内容
- 构建Linux系统环境,并在Linux系统上安装Hadoop。
- 在一台电脑上搭建起hadoop伪分布环境。
- 在多台电脑或多个虚拟机上搭建hadoop全分布环境。
- 实验平台(软件版本)
- 操作系统: linux
- 虚拟机软件:VirtualBox 的Ubuntu
- Hadoop集群安装配置教程_Hadoop3.1.3_Ubuntu
- 本教程讲述如何配置 Hadoop 集群(采用Hadoop3.1.3),默认大家已经掌握了 Hadoop的单机伪分布式配置。
- Hadoop 集群的安装配置大致包括以下步骤:
Hadoop集群的安装需要多个不同节点(即不同虚拟机),以下使用两个虚拟机,一个作为Master,一个作为Slave。(Master,Slave这2个虚拟机的创建步骤有一定不同,详见以下步骤1-6)总体步骤如下所示:
步骤1:选定一台机器作为 Master;
步骤2:在Master节点上创建hadoop用户、安装SSH服务端、安装Java环境;
步骤3:在Master节点上安装Hadoop,并完成配置;
步骤4:在其他Slave节点上创建hadoop用户、安装SSH服务端、安装Java环境;(特别注意:在其余Slave节点上不需要安装Hadoop以及完成它的配置)
完成后(2个虚拟机)如图所示:
步骤5:将Master节点上的“/usr/local/hadoop”目录复制到其他Slave节点上;
步骤6:在Master节点上开启Hadoop;
- 上述这些步骤中,关于如何创建hadoop用户、安装SSH服务端、安装Java环境、安装Hadoop等过程,已经在前面介绍伪分布式安装的时候做了详细介绍(查看Hadoop安装教程_单机/伪分布式配置教程),请按照之前介绍的伪分布式安装方法完成步骤1-4。在完成步骤1-4以后请继续进行下面的操作。
- 网络配置:
假设集群所用的两个节点(机器)都位于同一个局域网内。如果两个节点使用的是虚拟机安装的Linux系统,那么两者都需要更改网络连接方式为“桥接网卡”模式,才能实现多个节点互连,如下图所示。此外,一定要确保各个节点的Mac地址不能相同,否则会出现 IP冲突。如果是采用导入虚拟机镜像文件的方式安装Linux系统,则有可能出现两台机器的MAC地址是相同的,因为一台机器复制了另一台机器的配置,因此,需要改变机器的MAC地址,如下图所示(我的两个虚拟机Ubuntu为Master,Slave为Slave1),可以点击界面右边的“刷新”按钮随机生成 MAC 地址,这样就可以让两台机器的MAC地址不同了。
1.网络配置完成以后,可以查看一下机器的IP地址,可以使用ifconfig命令查看。
2.本教程在同一个局域网内部的两台机器的IP地址分别是192.168.1.121和192.168.1.122。
3. 由于集群中有两台机器需要设置,所以,在接下来的操作中,一定要注意区分Master节点和Slave节点。为了便于区分Master节点和Slave节点,可以修改各个节点的主机名,这样,在Linux系统中打开一个终端以后,在终端窗口的标题和命令行中都可以看到主机名,就比较容易区分当前是对哪台机器进行操作。在Ubuntu中,我们在 Master 节点上执行如下命令修改主机名:
$ sudo vim /etc/hostname |
4.1执行上面命令后,就打开了“/etc/hostname”这个文件,这个文件里面记录了主机名,比如,假设安装Ubuntu系统时,设置的主机名是“dblab-VirtualBox”,因此,打开/etc/hostname以后,里面就只有“dblab-VirtualBox”这一行内容,可以直接删除,并修改为“Master”(注意是区分大小写的),然后,保存退出vim编辑器,这样就完成了主机名的修改,需要重启Linux系统才能看到主机名的变化。
要注意观察主机名修改前后的变化。在修改主机名之前,如果用hadoop登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:
4.2修改主机名并且重启系统之后,用hadoop登录Linux系统,打开终端,进入Shell命令提示符状态,会显示如下内容:
5. 在Master节点中执行如下命令打开并修改Master节点中的“/etc/hosts”文件:
$ sudo vim /etc/hosts |
6. 可以在hosts文件中增加如下两条IP和主机名映射关系:
192.168.1.121 Master 192.168.1.122 Slave1 |
修改后的效果如下图所示:(多余的127.0.0.1映射,应该删除,特别是不能存在“127.0.0.1 Master”这样的映射记录)修改后需要重启Linux系统。
7. 上面完成了Master节点的配置,接下来要继续完成对其他Slave节点的配置修改。本教程只有一个Slave节点,主机名为Slave1。请参照以上修改Master的方法,把Slave节点上的“/etc/hostname”文件中的主机名修改为“Slave1”,同时参照Master的hosts修改方法修改“/etc/hosts”中的内容。
8. 修改完成以后,请重新启动Slave节点的Linux系统。这样就完成了Master节点和Slave节点的配置。
9.测试是否相互ping得通,如果ping不通,后面就无法顺利配置成功:
$ ping Master -c 3 # 只ping 3次就会停止,否则要按Ctrl+c中断ping命令 $ ping Slave1 -c 3 |
10. 例如,在Master节点上ping Slave1,如果ping通的话,会显示如下图所示的结果。
- SSH无密码登录节点:必须要让Master节点可以SSH无密码登录到各个Slave节点上。
1.在Master虚拟机上输入:
$ cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost $ rm ./id_rsa* # 删除之前生成的公匙(如果已经存在) $ ssh-keygen -t rsa# 执行该命令后,遇到提示信息,一直按回车就可以 |
2. 为了让Master节点能够无密码SSH登录本机,需要在Master节点上执行如下命令:
$ cat ./id_rsa.pub >> ./authorized_keys |
完成后可以执行命令“ssh Master”来验证一下,可能会遇到提示信息,只要输入yes即可,测试成功后,请执行“exit”命令返回原来的终端。
3. 接下来,在Master节点将上公匙传输到Slave1节点:
$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ |
执行scp时会要求输入Slave1上hadoop用户的密码,输入完成后会提示传输完毕,如下图所示。
4. 接着在Slave1节点上,将SSH公匙加入授权:
$ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在,则忽略本命令 $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_rsa.pub # 用完以后就可以删掉 |
5.如果有其他Slave节点,也要执行将Master公匙传输到Slave节点以及在Slave节点上加入授权这两步操作。
这样,在Master节点上就可以无密码SSH登录到各个Slave节点了,可在Master节点上执行如下命令进行检验:
$ ssh Slave1 |
6.执行该命令的效果如下图所示:
- 配置PATH变量:
在前面的伪分布式安装内容中,已经介绍过PATH变量的配置方法。可以按照同样的方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。如果还没有配置PATH变量,那么需要在Master节点上进行配置。 首先执行命令“vim ~/.bashrc”,也就是使用vim编辑器打开“~/.bashrc”文件,然后,在该文件最上面的位置加入下面一行内容:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin |
保存后执行命令“source ~/.bashrc”,使配置生效。
- 配置集群/分布式环境
1.修改文件workers:
需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让Master节点仅作为名称节点使用。
本教程让Master节点仅作为名称节点使用,因此将workers文件中原来的localhost删除,只添加如下一行内容:
Slave1 |
2. 修改文件core-site.xml
请把core-site.xml文件中的<configuration>到</configuration>(以下所有文件修改同理)修改为如下内容:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://Master: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> |
3. 修改文件hdfs-site.xml
对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。但是,本教程只有一个Slave节点作为数据节点,即集群中只有一个数据节点,数据只能保存一份,所以 ,dfs.replication的值还是设置为 1。hdfs-site.xml具体内容如下:
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>1</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> |
4. 修改文件mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>Master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>Master: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> |
5. 修改文件 yarn-site.xml:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>Master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> |
6.上述5个文件全部配置完成以后,需要把Master节点上的“/usr/local/hadoop”文件夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前首先删除之前在伪分布式模式下生成的临时文件。具体步骤为7
7. 首先在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 |
8. 然后在Slave1节点上执行如下命令:
$ 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节点解压文件的操作。
- 启动集群:
1. 首次启动Hadoop集群时,需要先在Master节点执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:
$ hdfs namenode -format |
2. 现在就可以启动Hadoop了,启动需要在Master节点上进行,执行如下命令:
$ start-dfs.sh $ start-yarn.sh $ mr-jobhistory-daemon.sh start historyserver |
3. 通过命令jps可以查看各个节点所启动的进程(如下图所示:)
4. 在Slave节点可以看到DataNode和NodeManager进程(如下图所示:)
5. 缺少任一进程都表示出错。
6. 在Master节点上通过命令“hdfs dfsadmin -report”查看数据节点是否正常启动,如果屏幕信息中的“Live datanodes”不为 0 ,则说明集群启动成功。由于本教程只有1个Slave节点充当数据节点,因此,数据节点启动成功以后,会显示如下图所示信息。
(12) 执行分布式实例:
$ hdfs dfs -mkdir -p /user/hadoop |
1.在HDFS中创建一个input目录,自己编写一个实例,测试Hadoop集群是否搭建完成。
$ hdfs dfs -mkdir input $ vim test |
2.test文档内容编辑如下图所示:
3.Master节点终端中接着输入:
$ hdfs dfs -put test input |
4. 接着就可以运行 MapReduce 作业了,命令如下:
$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+' |
5.运行时的输出信息与伪分布式类似,会显示MapReduce作业的进度,部分结果如下图所示。
6. 执行过程可能会有点慢,但是,如果迟迟没有进度,比如5分钟都没看到进度变化,那么不妨重启Hadoop再次测试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改YARN的内存配置来解决。
7. 执行完毕后的输出结果如下图所示:
8.最后,关闭Hadoop集群,需要在Master节点执行如下命令:
$ stop-yarn.sh $ stop-dfs.sh $ mr-jobhistory-daemon.sh stop historyserver |
至此,就顺利完成了Hadoop集群搭建。