hadoop集群的搭建

1.实验环境需求

操作系统:CentOS 8操作系统

计算机资源:CPU 1核 0.5GHz 内存 0.5GB 硬盘 10.00GB

2.实验原理

在工程环境中,往往需要在Linux环境下进行Hadoop的安装和部署,但是在一些主流的操作系统如UNIX、Windows上Hadoop也可以很好的运行,在本实验中我们在Linux操作系统中进行Hadoop的相关实验操作,我们使用的Linux操作系统版本是CentOS 8。

在Linux上进行Hadoop的安装部署流程如下:

  1. 安装配置JDK1.7(或更高版本)。Hadoop是用Java编写的程序,Hadoop的编译及MapReduce的运行都需要使用JDK,因此在安装Hadoop前,必须安装JDK1.7或更高版本。

  2. 主机名配置:在大型的Hadoop集群中,往往由成百上千个节点组成,如果通过IP地址对不同节点进行管理,那么集群维护的工作量将会十分繁重,因此在工程环境中,常常通过对每个节点设置唯一的主机名,从而实现对节点进行管理。

  3. SElinux安全配置:CentOS默认启用了SElinux,在网络服务方面权限要求比较严格,因此我们需要对SElinux安全配置进行更改。

  4. SSH(安全外壳协议)免密码登录配置,推荐安装OpenSSH。Hadoop需要通过SSH来启动Slave列表中各台主机的守护进程,因此SSH也是必须安装的,即使是安装伪分布式版本(因为Hadoop并没有区分开集群式和伪分布式)。对于伪分布式,Hadoop会采用与集群相同的处理方式,即按次序启动文件conf/slaves中记载的主机上的进程,只不过在伪分布式中Slave为localhost(即为自身),所以对于伪分布式Hadoop,SSH一样是必需的。

  5. Hadoop核心配置。Hadoop的稳定运行需要依赖于其核心配置文件,因此当上述准备工作就绪后,我们便需要着重进行配置文件编写来实现Hadoop的可靠运行。

3.安装Hadoop环境准备

1.安装配置JDK 1.8

首先查看linux系统版本,安装和Linux系统相同版本的JDK

1
2
3
查看命令
uname -r
3.10.0-1160.el7.x86_64 #在此安装的是x86_64版本的,所以JDK也要安装64位

我们可以在Oracle JDK的官网下载与Linux相应版本的JDK,官网地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html,下载完成后将压缩包上传到系统中。

上传文件可以使用FinalShell工具,远程连接成功后,直接将软件包拖入某个文件夹下即可上传文件。

在此我将压缩包都放入/usr/software文件夹下,后面不再赘述。

1.首先创建一个工作路径,如下,我是在在/usr目录下建立名为dsy的工作路径

1
mkdir /usr/dsy

2.解压安装包,将下载好的java jdk安装包解压到刚刚创建好的路径中

1
tar -zxvf /usr/software/jdk-8u321-linux-x64.tar.gz -C /usr/dsy

3.配置环境变量

使用vi编辑器打开 ~/.bashrc文件

1
vi ~/.bashrc

配置Java JDK环境变量,在~/.bashrc文件中添加如下内容:

1
2
3
4
export JAVA_HOME=解压的JDK路径
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/tools.jar

添加完成,按Esc键,然后输入“:wq”保存退出。

4.更新环境变量

使用source命令更新环境变量

1
source  ~/.bashrc

5.检查JDK是否配置成功

1
2
java -version
出现版本号说明安装成功

2.主机名配置

1.编辑主机名,使用vi编辑器编辑主机名配置文件

1
vi  /etc/sysconfig/network

修改主机名HOSTNAME为master

1
2
NETWORKING=yes
HOSTNAME=master(修改为实际的主机名master)

更改后的内容会在下次系统重启的时候生效,通过下列命令重新启动系统:

1
reboot

2.IP地址与主机名映射文件配置

通过下列命令使用vi编辑器编辑主机名映射文件hosts文件:

1
vi  /etc/hosts

打开后的文件内容如下所示:

增加主机名与IP地址的映射关系:

1
127.0.0.1 master

检测主机名与IP映射是否配置成功:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ping master -c 4
PING master (127.0.0.1) 56(84) bytes of data.
64 bytes from master (127.0.0.1): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from master (127.0.0.1): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from master (127.0.0.1): icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from master (127.0.0.1): icmp_seq=4 ttl=64 time=0.042 ms

--- master ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.042/0.055/0.071/0.010 ms
能够ping通说明配置成功

如果无法进行正常的报文发送,请检查主机名是否配置错误,同时请检查主机名与IP地址映射是否配置正确。

3.SElinux安全配置

CentOS默认启用了SElinux,在网络服务方面权限要求比较严格,因此我们需要将SElinux关闭。

1.首先先打开SElinux配置文件

1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled(需要修改的行)
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

若需要修改的行为“SELINUX=permissive”,则将它修改为“SELINUX=disabled”;若直接为“SELINUX=disabled”,则不需修改。disabled是不可用的意思,编辑完成后保存文件并退出vi编辑器。

2.SElinux配置强制生效

更改后的内容会在下次系统重启的时候生效,为了操作便捷性,我们可以使用下列命令使更改即时生效,而不需要重新启动系统。

1
setenforce 0

4.配置SSH免密码登录

1.生成秘钥,输入下面的命令,生成本机密钥文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# ssh-keygen -t (通过dsa加密方式对秘钥进行加密)
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): (注:按回车即可)
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): (注:按回车即可)
Enter same passphrase again: (注:按回车即可)
Your identification has been saved in /root/.ssh/id_dsa.
(注:生成的私钥文件位置)
Your public key has been saved in /root/.ssh/id_dsa.pub.
(注:生成的公钥文件位置)
The key fingerprint is:
SHA256:yCNMfjTp1RKuqVjUh5B8+pTh3ETf3IaWNcVLV7yzYnU root@localhost.localdomain
The key's randomart image is:
+---[DSA 1024]----+
| ... .o o++|
| ooo+.+ o = o+|
| o=*== o * + +|
| =.+=B.. . . =E|
| =oO S . +|
| o +.. o . |
| . . . . |
| |
| |
+----[SHA256]-----+

查看~/.ssh目录下的文件:

1
ls ~/.ssh

可以看到在~/.ssh目录下已经生成了id_dsa.pub(本机的公钥)和id_dsa(本机的私钥)文件:

2.秘钥分发

把当前节点的公钥文件id_dsa.pub内容输出追加到任意节点的/.ssh/authorized_keys文件的末尾,则在被添加的节点上便可以免密码登录到当前的节点(由于我们是单节点部署,因此直接追加到当前节点的/.ssh/authorized_keys文件中即可),输入命令如下:

1
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

上述命令运行完成后我们再次查看~/.ssh目录下的文件,可以看到已经创建了authorized_keys文件:

3.验证免密码登录是否配置成功

下列命令通过设置的主机名进行连接,可以验证免密码登录是否配置成功:

1
ssh master

一次登录的时候,会询问是否继续连接,输入yes即可进入,当第二次进行连接的时候则不会再出现此提示(***如果无法正常连接,请检查是否完成秘钥分发步骤操作***):

连接成功后,我们需要通过下列命令退出连接:

1
2
3
4
[root@localhost ~]# exit
登出
Connection to master closed.

在Hadoop的安装过程中,配置免密码登录与否是无关紧要的,但是如果不配置免密码登录,每次启动Hadoop都需要输入密码才能登录到集群中的每台机器上,考虑到一般的Hadoop集群往往拥有数百台机器,因此一般来说都会配置集群节点间SSH免密码登录。

4.安装配置Hadoop

Hadoop分别从三个角度将集群中的主机划分为两种角色。从集群管理来讲,将集群中的主机划分为Master和Slave;从HDFS的角度来讲,将集群中的主机划分为NameNode和DateNode(在分布式文件系统中,目录的管理很重要,而NameNode就是目录管理者);从MapReduce的角度来讲,将主机划分为ResourceManager、ApplicationMaster和NodeManager。

Hadoop有官方发行的开源版本,以及CDH等多个商用版本,这里我们主要介绍Hadoop官方发行版的安装方法。可以从以下地址获得Hadoop的官方发行版:

http://www.apache.org/dyn/closer.cgi/Hadoop/core/

Hadoop有三种运行方式:单机模式、伪分布式与完全分布式。乍看之下,前两种方式并不能体现云计算的优势,但是它们便于程序的测试与调试,所以还是很有意义的。安装单机模式的Hadoop无须配置,在这种方式下,Hadoop被认为是一个单独的Java进程,这种方式经常用来调试。安装伪分布式Hadoop的配置过程也很简单,只需要修改几个文件,可以把伪分布式的Hadoop看做只有一个节点的集群。

1. 解压安装文件

解压Hadoop安装文件,将文件解压到/usr/dsy目录下:

1
tar -zxvf /usr/software/hadoop-2.7.7.tar.gz -C /usr/dsy

2.配置Hadoop环境变量

1
vi  ~/.bashrc

在~/.bashrc文件中增加以下内容:

1
2
3
4
(-------------------省略------------------------)
export HADOOP_HOME=/usr/dsy/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$PATH
export PATH=$PATH:$HADOOP_HOME/sbin:$PATH

执行如下命令,更新环境变量:

1
source  ~/.bashrc

通过下列命令验证Hadoop环境变量是否配置成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
CLASSNAME run the class named CLASSNAME
or
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
note: please use "yarn jar" to launch
YARN applications, not this command.
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
credential interact with credential providers
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
trace view and modify Hadoop tracing settings

Most commands print help when invoked w/o parameters.

如果没有正确输出相关信息,请检查~/.bashrc文件中的Hadoop环境变量是否配置正确,同时请确定是否使用source ~/.bashrc命令更新环境变量配置。

3.编辑Hadoop配置文件

1.打开hadoop-env.sh配置文件进行编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 vi /usr/dsy/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
(-------------------省略------------------------)
# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME. All others are
# optional. When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use.
export JAVA_HOME=${JAVA_HOME}(注:需要对此行内容进行更改,为Hadoop绑定Java运行环境)
# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
#export JSVC_HOME=${JSVC_HOME}

export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
(-------------------省略------------------------)

在文件中进行下列内容更改,将JAVA_HOME对应的值改成实际的JDK安装目录,编辑完成后保存文件并退出vi编辑器。

1
export  JAVA_HOME=/usr/cx/jdk1.8.0_60

2.打开core-site.xml配置文件进行编辑

1
2
3
4
5
6
7
vi /usr/dsy/hadoop-2.7.7/etc/hadoop/core-site.xml
(-------------------省略------------------------)
<!-- Put site-specific property overrides in this file. -->

<configuration>
(注:需要在此处进行相关内容配置)
</configuration>

在文件中之间增加下列内容,编辑完成保存退出。

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
/*设置默认的HDFS访问路径*/
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
/*缓冲区大小:io.file.buffer.size默认是4KB*/
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
/*临时文件夹路径设置*/
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/tmp</value>
</property>
/*设置使用hduser用户可以代理所有主机用户进行任务提交*/
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
/*设置使用hduser用户可以代理所有组用户进行任务提交*/
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>

3.打开yarn-site.xml文件进行配置:

1
2
3
4
5
6
7
vi /usr/dsy/hadoop-2.7.7/etc/hadoop/yarn-site.xml
(-------------------省略------------------------)
<configuration>
(注:需要在此处进行相关内容配置)
<!-- Site specific YARN configuration properties -->

</configuration>

在文件中之间增加下列内容,完成后保存文件并退出。

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
27
28
29
30
31
32
33
34
/*设置NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序*/
<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>
/*设置客户端与ResourceManager的通信地址*/
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
/*设置ApplicationMaster调度器与ResourceManager的通信地址*/
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
/*设置NodeManager与ResourceManager的通信地址*/
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
/*设置管理员与ResourceManager的通信地址*/
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
/* ResourceManager的Web地址,监控资源调度*/
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>

4.复制mapred-site.xml.template文件并重命名为mapred-site.xml

1
cp /usr/dsy/hadoop-2.7.7/etc/hadoop/mapred-site.xml.template /usr/dsy/hadoop-2.7.7/etc/hadoop/mapred-site.xml

5.打开mapred-site.xml文件并对它进行配置

1
2
3
4
5
6
7
vi /usr/dsy/hadoop-2.7.7/etc/hadoop/mapred-site.xml
(-------------------省略------------------------)
<!-- Put site-specific property overrides in this file. -->

<configuration>
(注:需要在此处进行相关内容配置)
</configuration>

在文件中之间增加下列内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*Hadoop对MapReduce运行框架一共提供了3种实现,在mapred-site.xml中通过"mapreduce.framework.name"这个属性来设置为"classic"、"yarn"或者"local"*/
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
/*MapReduce JobHistory Server地址*/
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
/*MapReduce JobHistory Server Web UI访问地址*/
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>

6.创建Hadoop的数据存储目录namenode和datanode

1
2
mkdir -p /hdfs/namenode
mkdir -p /hdfs/datanode

7.使用vi命令打开hdfs-site.xml文件进行配置

1
vi /usr/dsy/hadoop-2.7.7/etc/hadoop/hdfs-site.xml

在文件中之间增加下列内容保存并退出。

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
27
28
29
30
31
32
33
34
35
36
37
38
39
(-------------------省略------------------------)
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>

/*配置SecondaryNameNode地址*/
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
/*配置NameNode的数据存储目录,需要与上文创建的目录相对应*/
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hdfs/namenode</value>
</property>
/*配置DataNode的数据存储目录,需要与上文创建的目录相对应*/
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hdfs/datanode</value>
</property>
/*配置数据块副本数*/
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
/*将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS、LIST FILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode保存的*/
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

</configuration>

8.用vi命令打开slaves文件进行配置(要与我们前文设置的主机名相互一致,否则将会引起Hadoop相关进程无法正确启动)

1
vi /usr/dsy/hadoop-2.7.7/etc/hadoop/slaves

打开文件显示如下:

将文件中的内容更改为下列内容

4.格式化HDFS

通过下列命令格式化HDFS文件系统(***如果格式化失败,会有相关的错误日志输出,根据输出内容进行更改即可***):

1
hadoop namenode -format

5.Hadoop运行及测试

1.启动Hadoop,通过下列命令启动Hadoop

1
start-all.sh

命令运行后的输出内容如下所示:

由输出内容可以看到,每个进程在启动以及运行过程中,会将相关的日志信息记录到日志文件中,因此当进程出现问题时,一个有效的办法就是查看日志文件进行排错处理。

2.查看进程

查看相应的JVM进程确定Hadoop是否配置及启动成功

1
jps

当有以下5个进程启动时,则说明Hadoop已经成功启动,如果某个进程没有启动,则需要查看日志文件确定错误发生的原因:

1
2
3
4
5
6
7
[root@localhost ~]# jps
48784 DataNode(注:HDFS数据存储进程)
52512 Jps
49556 NodeManager(注:任务执行进程)
48613 NameNode(注:HDFS元数据管理进程)
49413 ResourceManager(注:资源管理进程)
49118 SecondaryNameNode(注:HDFS数据检查点进程)

3.Web页面测试

1.当Hadoop成功启动后,我们打开浏览器,输入网址http://master:8088便可以访问任务调度的Web管理页面:

2.当Hadoop成功启动后,我们打开浏览器,输入网址http://master:50070便可以访问HDFS的Web管理页面: