Hadoop集群安装配置教程_Hadoop3.3.5_Ubuntu

大数据学习路线图

【版权声明】版权所有,请勿转载!
【相关文章推荐】《大数据软件安装和基础编程实践指南》,详细指导VirtualBox、Ubuntu、Hadoop、HDFS、HBase、Hive、MapReduce、Spark、Flink的安装和基础编程
作者:厦门大学计算机系林子雨副教授
E-mail: ziyulin@xmu.edu.cn

当Hadoop采用分布式模式部署和运行时,存储采用分布式文件系统HDFS,而且,HDFS的名称节点和数据节点位于不同机器上。这时,数据就可以分布到多个节点上,不同数据节点上的数据计算可以并行执行,这时的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”目录复制到其他Slave节点上;
步骤6:在Master节点上开启Hadoop;
上述这些步骤中,关于如何创建hadoop用户、安装SSH服务端、安装Java环境、安装Hadoop等过程,已经在前面介绍伪分布式安装的时候做了详细介绍,请按照之前介绍的方法完成步骤1到步骤4,这里不再赘述。在完成步骤1到步骤4的操作以后,才可以继续进行下面的操作。

1.安装虚拟机

请参照教程“在VMWare中安装Linux虚拟机”,安装好2个Linux虚拟机,主机名分别是hadoop01和hadoop02。由于hadoop02是Slave节点,不需要安装很多的软件,所以,配置可以比hadoop01低一,比如,对于hadoop02而言,内存只需要配置4GB,磁盘只需要配置20GB。
安装好虚拟机hadoop02以后,首先创建hadoop用户,然后使用hadoop用户登录Linux系统,安装SSH服务端,并安装Java环境。

2. 网络配置

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

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

hadoop@ ubuntu:~$

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

hadoop@ hadoop01:~$

可以看出,这时就很容易辨认出当前是处于Master节点(hadoop01)上进行操作,不会和Slave节点(hadoop02)产生混淆。
同理,请按照相同的方法,把虚拟机hadoop02中的主机名修改为“hadoop02”,并重启Linux系统。
然后,使用ifconfig命令获取每台虚拟机的IP地址,具体命令如下:

ifconfig

图3-12给出ifconfig命令的执行效果,从中可以看到,hadoop01的IP地址是192.168.91.128(你的机器的IP地址可能和这个不同)。同理,可以查询到hadoop02的IP地址是192.168.91.129(你的机器的IP地址可能和这个不同)。

图3-12 ifconfig命令执行效果
然后,在hadoop01中,执行如下命令打开并修改Master节点中的“/etc/hosts”文件:

sudo vim /etc/hosts

可以在hosts文件中增加如下两条IP和主机名映射关系:

192.168.91.128   hadoop01
192.168.91.129   hadoop02

修改后的效果如图3-13所示。

图3-13 修改IP和主机名映射关系后的效果
需要注意的是,一般hosts文件中只能有一个127.0.0.1,其对应主机名为localhost,如果有多余127.0.0.1映射,应删除,特别是不能存在“127.0.0.1 hadoop01”这样的映射记录。修改后需要重启Linux系统。
上面完成了Master节点(hadoop01)的配置,接下来要继续完成对其他Slave节点的配置修改。本教程只有一个Slave节点,主机名为hadoop02。请参照上面的方法,把Slave节点上的“/etc/hostname”文件中的主机名修改为“hadoop02”,同时,修改“/etc/hosts”的内容,在hosts文件中增加如下两条IP和主机名映射关系:

192.168.91.128   hadoop01
192.168.91.129   hadoop02

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

ping hadoop01 -c 3   # 只ping 3次就会停止,否则要按Ctrl+c中断ping命令
ping hadoop02 -c 3

例如,在Master节点上ping Slave1,如果ping通的话,会显示如图3-14所示的结果。

图3-14 使用ping命令的效果

3. SSH无密码登录节点

必须要让Master节点可以SSH无密码登录到各个Slave节点上。

首先需要在hadoop02上执行如下命令安装SSH服务端(如果此前已经安装就不用重复安装):

sudo apt-get install openssh-server

然后,生成Master节点(hadoop01)的公匙,如果之前已经生成过公钥(在3.3.3节安装伪分布式模式的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用户的密码,输入完成后会提示传输完毕,如图3-15所示。传输完成以后,在hadoop02上的“/home/hadoop”目录下就可以看到文件id_rsa.pub了。

图3-15 执行scp命令的效果
接着在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)上执行如下命令进行检验:

ssh hadoop02

执行该命令的效果如图3-16所示。

图3-16 ssh命令执行效果

4. 配置PATH变量

在前面的伪分布式安装内容中,已经介绍过PATH变量的配置方法。可以按照同样的方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。如果还没有配置PATH变量,那么需要在Master节点上进行配置。 首先执行命令“vim ~/.bashrc”,也就是使用vim编辑器打开“~/.bashrc”文件,然后,在该文件最上面的位置加入下面一行内容:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

保存后执行命令“source ~/.bashrc”,使配置生效。

5. 配置集群/分布式环境

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

(1)修改文件workers

需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让Master节点仅作为名称节点使用。
本教程让Master节点仅作为名称节点使用,因此将hadoop01中的workers文件中原来的localhost删除,只添加如下一行内容:

hadoop02

(2)修改文件core-site.xml 

请把hadoop01中的core-site.xml文件修改为如下内容:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop01: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。hadoop01中的hdfs-site.xml具体内容如下:

<configuration>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>hadoop01: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

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

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop01:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop01: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

请把hadoop01中的yarn-site.xml文件配置成如下内容:

<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

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

cd /usr/local/hadoop
sudo rm -r ./tmp     # 删除 Hadoop 临时文件
sudo rm -r ./logs/*   # 删除日志文件
cd /usr/local
tar -zcf ~/hadoop.master.tar.gz ./hadoop   # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz hadoop02:/home/hadoop

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

cd ~
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节点(hadoop01)执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:

cd /usr/local/hadoop
./bin/hdfs namenode -format

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

cd /usr/local/hadoop
./sbin/start-dfs.sh
./sbin/start-yarn.sh
./sbin/mr-jobhistory-daemon.sh start historyserver

通过命令jps可以查看各个节点所启动的进程。如果已经正确启动,则在Master节点上可以看到NameNode、ResourceManager、SecondaryNameNode和JobHistoryServer进程,如图3-17所示。

图3-17 Master节点上启动的进程
在Slave节点可以看到DataNode和NodeManager进程,如图3-18所示。

图3-18 Slave节点上启动的进程
缺少任一进程都表示出错。另外还需要在Master节点上通过如下命令查看数据节点是否正常启动:

cd /usr/local/hadoop
./bin/hdfs dfsadmin -report

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

图3-19 通过dfsadmin查看数据节点的状态
也可以在Linux系统的浏览器中输入地址“http://hadoop01:9870/”,通过 Web 页面看到查看名称节点和数据节点的状态(如图3-20所示)。如果不成功,可以通过启动日志排查原因。

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

6. 执行分布式实例

执行分布式实例过程与伪分布式模式一样,首先创建HDFS上的用户目录,可以在Master节点(hadoop01)上执行如下命令:
hdfs dfs -mkdir -p /user/hadoop #此前已经配置了PATH环境变量,所以不用路径全称

然后,在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.3.5.jar grep input output 'dfs[a-z.]+'

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

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

图3-22 通过Web页面查看集群和MapReduce作业的信息

图3-23 作业执行情况
执行完毕后的输出结果如图3-24所示。

图3-24 MapReduce作业执行完毕后的信息
最后,关闭Hadoop集群,需要在Master节点(hadoop01)执行如下命令:

stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver

至此,就顺利完成了Hadoop集群搭建。