写在前面

前面对Hadoop进行了一个基础的学习,接下来开始学习如何安装Hadoop平台。这里使用VMware Workstation Pro、CentOS7.7、Hadoop使用CDH5.7版本。

本篇主要学习如何在VMware Workstation虚拟机上安装的CentOS系统上搭建Hadoop伪分布式环境。

注意关于VMware Workstation Pro和CentOS7.7的安装这里就跳过,假设现在已经成功在VMware Workstation Pro虚拟机上成功安装了CentOS7.7系统,那么接下来就正式进入Hadoop伪分布式环境搭建。

所谓伪分布式是指在一台机器上启动Hadoop需要的所有进程进行工作;而分布式是指在多台机器上都启动Hadoop,按照集群的规划在不同的机器上启动各自需要的Hadoop进程进行相互协调工作。

Hadoop伪分布式环境搭建

CentOS系统上软件下载存放地址为/home/soft,软件安装地址为/envy

Java安装

请注意,推荐使用Oracle JDK,因此需要卸载CentOS默认安装的OpenJDK,操作步骤如下:
(1)使用rpm -qa|grep java命令查看CentOS是否安装OpenJDK:

(2)使用rpm -e --nodeps命令来删除不需要的jdk安装包,就是两个以java-1.8.0-openjdk开头的包:

1
2
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64

其余三个可以不删除,之后再次使用(1)的命令来检验是否卸载成功。
(3)在/home/soft目录下新建一个java目录,然后使用如下命令下载jdk,如下所示:

1
wget https://d6.injdk.cn/oracle/8/jdk-8u251-linux-x64.tar.gz

之后将其解压到/envy目录下,使用如下命令:

1
tar -zxvf jdk-8u251-linux-x64.tar.gz -C /envy

接着使用vi /etc/profile打开配置文件,往里面新增如下内容:

1
2
3
4
#Java environment
export JAVA_HOME=/envy/jdk1.8.0_251
export CLASSPATH=.:$JAVA_HIOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

之后使用source /etc/profile命令刷新配置文件,再使用java -version命令验证jdk是否安装成功:

1
2
3
4
[root@elk-1 java]# java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

Hadoop安装

本篇系列笔记使用的是CDH版本的hadoop-2.6.0-cdh5.7.0,相关内容的下载地址可以点击 这里 ,如下所示:

请注意这个版本信息hadoop-2.6.0-cdh5.7.0,hadoop-2.6.0是代表Hadoop版本为2.6.0,而cdh5.7.0代表的是CDH版本为5.7.0,如果开发者需要使用HBase,那么此时配套的版本信息应该为hbase-xx-cdh5.7.0,然后在之前那个地址进行查找,可以找到如下信息:

/home/soft目录下新建一个hadoop目录,然后使用如下命令下载hadoop,如下所示:

1
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0.tar.gz

之后将其解压到/envy目录下,使用如下命令:

1
tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C /envy

接着使用vi /etc/profile打开配置文件,往里面新增如下内容:

1
2
3
4
#Hadoop environment
export HADOOP_HOME=/envy/hadoop-2.6.0-cdh5.7.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native

注意这里必须添加JAVA_LIBRARY_PATH,且目录为hadoop目录下的/lib/native目录。之后使用source /etc/profile命令刷新配置文件,再使用hadoop version命令验证hadoop是否安装成功:

1
2
3
4
5
6
7
[root@elk-1 envy]# hadoop version
Hadoop 2.6.0-cdh5.7.0
Subversion http://github.com/cloudera/hadoop -r c00978c67b0d3fe9f3b896b5030741bd40bf541a
Compiled by jenkins on 2016-03-23T18:41Z
Compiled with protoc 2.5.0
From source with checksum b2eabfa328e763c88cb14168f9b372
This command was run using /envy/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/hadoop-common-2.6.0-cdh5.7.0.jar

这样Hadoop就安装成功了。注意开发者除了可以将上述配置信息写在/etc/profile文件中,还可以写在~/.bash_profile文件中,但是这两种只能选择一种。

Hadoop伪分布式环境搭建

Hadoop启动后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的进程,因此首先需要在本机上实现SSH免密登录,可使用如下命令:

1
2
ssh-keygen -t rsa
ssh-copy-id localhost

成功执行上述两条命令后即可使用ssh localhost命令来免密码登录到本机,注意其中的localhost可以为主机名或者IP地址。

第一步,使用useradd hadoop hadoop命令来新建一个hadoop用户和组。

第二步,赋予hadoop用户可以编辑/envy文件夹的权限,使用的命令如下:

1
chown -R hadoop /envy/

之后查看一下/envy文件夹的权限:

1
2
3
4
[root@elk-1 envy]# ll
总用量 0
drwxr-xr-x 14 hadoop 4001 241 3月 24 2016 hadoop-2.6.0-cdh5.7.0
drwxr-xr-x 7 hadoop 10143 245 3月 12 2020 jdk1.8.0_251

第三步,切换到hadoop用户,并进入到hadoop配置目录:

1
2
3
4
5
6
7
8
9
10
11
12
[root@elk-1 envy]# su hadoop
[hadoop@elk-1 hadoop]$ cd /envy/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[hadoop@elk-1 hadoop]$ ls
capacity-scheduler.xml hadoop-env.cmd hadoop-policy.xml
httpfs-signature.secret kms-log4j.properties mapred-env.sh
ssl-client.xml.example yarn-site.xml configuration.xsl
hadoop-env.sh hdfs-site.xml httpfs-site.xml kms-site.xml
mapred-queues.xml.template ssl-server.xml.example
container-executor.cfg hadoop-metrics2.properties httpfs-env.sh
kms-acls.xml log4j.properties mapred-site.xml.template yarn-env.cmd
core-site.xml hadoop-metrics.properties httpfs-log4j.properties kms-env.sh
mapred-env.cmd slaves yarn-env.sh

这里就有我们需要配置的文件,接下来一步步的进行配置。
(1)修改hadoop-env.shmapred-env.shyarn-env.sh三个配置中JAVA_HOME的配置,将其中的export JAVA_HOME=${JAVA_HOME}修改为 JAVA_HOME=/envy/jdk1.8.0_251,即之前配置的JAVA_HOME目录。
(2)修改Hadoop核心文件core-site.xml,在里面新增如下内容,用于配置NameNode的主机名和端口号:

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/envy/hadoop_tmp</value>
</property>
</configuration>

之后记得使用hadoop账户新建/envy/hadoop_tmp目录,这一点非常重要。
(3)修改HDFS文件hdfs-site.xml,在里面新增如下内容,用于设置HDFS元数据文件存放路径、文件副本数、其他用户操作会提示没有权限、页面访问端口等内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/envy/dfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>/envy/dfs/data</value>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

<property>
<name>dfs.namenode.http.address</name>
<value>master:50070</value>
</property>
</configuration>

之后需要创建/envy/dfs/name/envy/dfs/data目录,并赋予hadoop用户可执行权限,当然最简答的方式就是利用hadoop用户自己创建那两个文件。

请注意,各目录必须是非/tmp下的目录,否则默认是在/tmp目录下,如果是在虚拟机环境中操作,那么每次重启虚拟机都会删除/tmp目录中的文件,但是该文件又会在Hadoop启动时自动创建,也就是说此时的数据是被清空了,这一点需要格外注意。

(4)修改MapReduce的mapred-site.xml文件,由于不存在这个文件,因此开发者需要将mapred-site.xml.template文件拷贝一份为mapred-site.xml,使用的命令如下:

1
[hadoop@elk-1 hadoop]$ cp mapred-site.xml.template mapred-site.xml

之后在里面新增如下内容:

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

(5)修改YARN的yarn-site.xml文件,在里面新增如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8080</value>
</property>
<property>
<name>yarn.resoucemanager.resouce-tracker.address</name>
<value>master:8082</value>
</property>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

请注意这里的master就是前面配置的NameNode主机名。
(6)修改从节点配置文件slaves,修改其中的内容为如下所示:

1
master

(7)在本机的/etc/hosts中添加本机的IP映射,添加内容如下所示:

1
192.168.31.100 master

请注意192.168.31.100这个IP是我本机IP,这个需要自己进行修改。

第四步,格式化HDFS系统。开发者进入/envy/hadoop-2.6.0-cdh5.7.0/bin目录下,执行如下命令来格式化HDFS系统:

1
hadoop namenode -format

如果出现下面所示的信息,则说明格式化成功了:

1
2
3
4
5
6
7
20/07/10 19:19:54 INFO common.Storage: Storage directory /envy/dfs/name has been successfully formatted.
20/07/10 19:19:55 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
20/07/10 19:19:55 INFO util.ExitUtil: Exiting with status 0
20/07/10 19:19:55 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at elk-1/192.168.31.100
************************************************************/

请注意,格式化HDFS操作只有第一次才使用,如果对于已有的集群再次执行格式化操作,那么已有集群上的数据会全部丢失。

第五步,启动Hadoop并验证安装成功,注意本步骤是一次性启动所有的Hadoop服务。
(1)给hadoop用户下赋予可执行/envy/hadoop-2.6.0-cdh5.7.0/sbin/目录的权限:

1
chmod +x -R /envy/hadoop-2.6.0-cdh5.7.0/sbin/

(2)启动Hadoop,并以hadoop用户身份进入到/envy/hadoop-2.6.0-cdh5.7.0/sbin/目录,执行如下命令来一次性启动所有的Hadoop服务:

1
./start-all.sh

之后使用jps命令来检测是否启动成功,启动成功会有如下五个进程(Jps进程不包括):

1
2
3
4
5
6
7
[hadoop@master sbin]$ jps
2002 ResourceManager
1540 NameNode
1654 DataNode
3270 Jps
2103 NodeManager
1806 SecondaryNameNode

这样关于hadoop伪分布式的搭建就完成了,最后可以执行./stop-all.sh命令来一次性停止所有的Hadoop服务。

请注意,如果在执行诸如./start-all.sh命令的时候,每次还都提示输入密码时,那么就需要给新建的hadoop用户赋予权限了,依次执行如下命令:

1
2
3
d ~/.ssh/
ssh-keygen -t rsa //一直回车
cat ./id_rsa.pub >> ./authorized_keys

接着依次执行如下命令,注意hadoop是之前新添加的用户:

1
2
3
4
chown hadoop: /home/hadoop/.ssh         
chown hadoop: /home/hadoop/.ssh/*
chmod 700 /home/hadoop/.ssh
chmod 600 /home/hadoop/.ssh/*

之后使用ssh master命令来进行测试,可以发现已经可以免密码登录了。

当开发者不需要一次性启动所有的Hadoop服务时,如只需启动HDFS或者YARN可以参看如下内容。

启动HDFS

单独启动HDFS

HDFS常用的启动方式有两种,下面分别进行学习。
方式一:一次启动所有进程。开发者可以进入到$HADOOP_HOME目录下的sbin目录中(即/envy/hadoop-2.6.0-cdh5.7.0/sbin目录),然后执行./start-dfs.sh命令来一次启动所有进程。启动成功后可以使用jps命令来检测是否启动成功,启动成功会有如下三个进程(Jps进程不包括):

1
2
3
4
5
[hadoop@master sbin]$ jps
1540 NameNode
1654 DataNode
1912 Jps
1806 SecondaryNameNode

前面是进程ID,后面是进程名称。
方式二:单独启动每个进程。这里以启动namenode为例进行说明,开发者可以使用如下命令:

1
hadoop-daemon.sh start namenode

之后可以使用jps命令来检测namenode是否启动成功,如果出现进程信息则表明启动成功。

那么就可以使用类似的方法来启动datanode、secondarynamenode了。

使用命令操作HDFS文件系统

关于如何使用命令来操作HDFS文件系统会在后续内容进行学习,这里简单提两个命令:
(a)创建HDFS目录。使用hadoop fs -mkdir /helloworld命令来创建helloworld目录;
(b)查看目录是否创建成功。使用hadoop fs -ls/查看目录是否创建成功。

访问HDFS浏览器页面

开发者可以通过访问http://master:50070链接来查看HDFS浏览器页面,前提是本机(不是虚拟机)已经将192.168.31.100这一虚拟机IP地址映射到master,否则推荐使用http://192.168.31.100:50070这一链接来进行访问:

启动YARN

这个其实和启动HDFS的步骤非常相似,可以参考学习。

单独启动YARN

YARN常用的启动方式有两种,下面分别进行学习。
方式一:一次启动所有进程。开发者可以进入到$HADOOP_HOME目录下的sbin目录中(即/envy/hadoop-2.6.0-cdh5.7.0/sbin目录),然后执行./start-yarn.sh命令来一次启动所有进程。启动成功后可以使用jps命令来检测是否启动成功,启动成功会有如下两个进程(Jps进程不包括):

1
2
3
4
[hadoop@master sbin]$ jps
2002 ResourceManager
2103 NodeManager
2408 Jps

前面是进程ID,后面是进程名称。
方式二:单独启动每个进程。这里以启动nodemanager为例进行说明,开发者可以使用如下命令:

1
yarn-daemon.sh start nodemanager

之后可以使用jps命令来检测nodemanager是否启动成功,如果出现进程信息则表明启动成功。

那么就可以使用类似的方法来启动resourcemanager了。
#####运行wordcount测试案例
Hadoop安装包中自带了wordcount的应用程序,jar包所在位置为$HADOOP_HOME/share/hadoop/mapreduce\hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar即(/envy/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce\hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar)。在/envy目录中新建一个hello.txt,其中的内容如下:

1
2
hello world hello
hello welcome world

之后将这个hello.txt文件上传到HDFS文件系统上去,使用的命令如下:

1
hadoop fs -put /envy/hello.txt /

接着提交mapreduce作业到yarn上运行,使用的命令如下:

1
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce\hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /hello.txt /wc_out/

或者进入到$HADOOP_HOME/share/hadoop/mapreduce\目录下执行以下命令:

1
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /hello.txt /wc_out/

之后使用如下命令来查看wordcount的统计结果:

1
hadoop fs -text /wc_out/part*

执行结果如下所示:

访问YARN浏览器页面

开发者可以通过访问http://master:8088链接来查看YARN浏览器页面,前提是本机(不是虚拟机)已经将192.168.31.100这一虚拟机IP地址映射到master,否则推荐使用http://192.168.31.100:8088这一链接来进行访问:

OK,那么本篇关于如何搭建Hadoop伪分布式的学习就到此为止,后续学习其他内容。