伪分布式安装 Hadoop 集群

安装规划

伪分布式安装 Hadoop 只需要一台机器,硬件配置最低为 4 核 CPU、8G 内存即可,我们采用 Hadoop-3.2.1 版本,此版本要求 Java 版本至少是 JDK8,这里以 JDK1.8、CentOS7.6 为例进行介绍。根据运维经验以及后续的升级、自动化运维需要,将 Hadoop 程序安装到 /opt/hadoop 目录下,Hadoop 配置文件放到 /etc/hadoop 目录下

安装过程

点击这里下载 Apache Hadoop 发行版本的 hadoop-3.2.1.tar.gz 二进制版本文件,其安装非常简单,只需解压文件即可完成安装,操作过程如下

[root@hadoop hadoop]#useradd hadoop

[root@hadoop ~]#mkdir /opt/hadoop

[root@hadoop ~]#cd /opt/hadoop

[root@hadoop hadoop]#tar zxvf hadoop-3.2.1.tar.gz

[root@hadoophadoop]#ln -s hadoop-3.2.1 current

[root@hadoophadoop]#chown -R hadoop:hadoop /opt/hadoop

注意,将解压开的 hadoop-3.2.1.tar.gz 目录软链接到 current 是为了后续运维方便,因为可能涉及 Hadoop 版本升级、自动化运维等操作,这样设置后,可以大大减轻运维工作量。

Hadoop 程序安装完成后,还需要拷贝配置文件到 /etc/hadoop 目录下,执行如下操作:

[root@hadoop ~]#mkdir /etc/hadoop

[root@hadoop hadoop]#cp -r /opt/hadoop/current/etc/hadoop /etc/hadoop/conf

[root@hadoop hadoop]# chown -R hadoop:hadoop  /etc/hadoop

这样,就将配置文件放到 /etc/hadoop/conf 目录下了。

接着,还需要安装一个 JDK,这里使用的是 JDK 1.8 下载,将其安装到 /usr/java 目录下,操作过程如下:

[root@hadoop ~]# mkdir /usr/java
[root@hadoop ~]# mv jdk-8u281-linux-x64.tar.gz /usr/java
[root@hadoop ~]# cd /usr/java
[root@hadoop java]# tar zxvf jdk-8u281-linux-x64.tar.gz
[root@hadoop java]# ln -s jdk1.8.0_281 default

这个操作过程的最后一步,做这个软连接,也是为了后续运维自动化配置、升级方便。

最后一步,还需要创建一个 Hadoop 用户,然后设置 Hadoop 用户的环境变量,配置如下:

[root@hadoop ~]# vim /home/hadoop/.bashrc 

# .bashrc

# Source global definitions

if [ -f /etc/bashrc ]; then

        . /etc/bashrc

fi



# User specific aliases and functions

export JAVA_HOME=/usr/java/default

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$PATH

export HADOOP_HOME=/opt/hadoop/current

export HADOOP_MAPRED_HOME=${HADOOP_HOME}

export HADOOP_COMMON_HOME=${HADOOP_HOME}

export HADOOP_HDFS_HOME=${HADOOP_HOME}

export HADOOP_YARN_HOME=${HADOOP_HOME}

export CATALINA_BASE=${HTTPFS_CATALINA_HOME}

export HADOOP_CONF_DIR=/etc/hadoop/conf

export HTTPFS_CONFIG=/etc/hadoop/conf

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

这里创建的 Hadoop 用户,就是以后管理 Hadoop 平台的管理员用户,所有对 Hadoop 的管理操作都需要通过这个用户来完成,这一点需注意。

另外,在配置的环境变量中,以下两个要特别注意,如果没有配置或者配置错误,将导致某些服务无法启动:

  • HADOOP_HOME 是指定 Hadoop 安装程序的目录
  • HADOOP_CONF_DIR 是指定 Hadoop 配置文件目录

到这里为止,Hadoop 已经基本安装完成了

配置 Hadoop 参数

Hadoop 安装完成后,先来了解一下其安装目录下几个重要的目录和文件,这里将 Hadoop 安装在了 /opt/hadoop/current 目录下,打开这个目录,需要掌握的几个目录如下表所示:

hadoop硬件配置要求 hadoop最低硬件配置_hadoop


修改配置文件 core-site.xml,此文件目前位于 /etc/hadoop/conf 目录下,在此文件 标签下增加如下内容:

[root@hadoop ~]# vim /etc/hadoop/conf/core-site.xml 
<property>

  <name>fs.defaultFS</name>

    <value>hdfs://hadoop</value>

</property>

其中,fs.defaultFS 属性描述的是访问 HDFS 文件系统的 URI 加一个 RPC 端口, 不加端口的话,默认是 8020。另外,hadoop3server 可以是服务器的主机名,也可以是任意字符,但都需要将此标识在服务器的 /etc/hosts 进行解析,也就是添加如下内容:

[root@hadoop ~]# vim /etc/hosts
192.168.172.128  hadoop

这里的 192.168.172.128 就是安装 Hadoop 软件的服务器 IP 地址。

启动 Hadoop 服务

配置操作完成后,下面就可以启动 Hadoop 服务了,虽然是伪分布模式,但 Hadoop 所有的服务都必须要启动,需要启动的服务有如下几个。

hadoop硬件配置要求 hadoop最低硬件配置_hadoop硬件配置要求_02


(1)启动 NameNode 服务

首先需要对 NameNode 进行格式化,命令如下:

[hadoop@hadoop ~]$ su - root
Password: 
Last login: Thu Jan 28 17:38:02 CST 2021 on pts/1
[root@hadoop ~]# su - hadoop
Last login: Thu Jan 28 17:38:08 CST 2021 on pts/1
-bash: shrc: command not found
[hadoop@hadoop ~]$ cd /opt/hadoop/current/bin
[hadoop@hadoop bin]$ hdfs namenode -fromat

然后就可以启动 NameNode 服务了,操作过程如下:

[hadoop@hadoop bin]$ hdfs --daemon start namenode
[hadoop@hadoop bin]$ jps|grep NameNode
9746 NameNode
启动报错处理
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-javoft/dfs/name is in an inconsistent state: storage di rectory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:291)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:97)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:379)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:353)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:254)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:434)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1153)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1162)
2018-08-04 12:48:43,125 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException : Directory /tmp/hadoop-javoft/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:291)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:97)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:379)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:353)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:254)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:434)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1153)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1162)

2018-08-04 12:48:43,126 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG: 

发生这个异常的原因及解决办法:

  原因:

  storage directory does not exist or is not accessible,(存储目录不存在或不可访问);

<configuration>
<property>

  <name>fs.defaultFS</name>

    <value>hdfs://hadoop</value>

</property>
</configuration>

通过 jps 命令查看 NameNode 进程是否正常启动,如果无法正常启动,可以查看 NameNode 启动日志文件,检查是否有异常信息抛出,这里的日志文件路径是:/opt/hadoop/current/logs/hadoop-hadoop-namenode-hadoop.log。

NameNode 启动完成后,就可以通过 Web 页面查看状态了,默认会启动一个 http 端口 9870,可通过访问地址:查看 NameNode 服务状态,如下图所示

hadoop硬件配置要求 hadoop最低硬件配置_hadoop硬件配置要求_03


(2)启动 secondarynamenode 服务

[hadoop@hadoop bin]$ hdfs --daemon start secondarynamenode
[hadoop@hadoop bin]$ jps|grep SecondaryNameNode
9871 SecondaryNameNode

与 NameNode 类似,如果无法启动 secondarynamenode 进程,可以通过 /opt/hadoop/current/logs/hadoop-hadoop-secondarynamenode-hadoopr.log 文件检查 secondarynamenode 启动日志中是否存在异常
(3)启动 DataNode 服务

[hadoop@hadoop bin]$ hdfs --daemon start datanode
[hadoop@hadoop bin]$ jps|grep DataNode
9984 DataNode

如果无法启动,可通过查看 /opt/hadoop/current/logs/hadoop-hadoop-datanode-hadoop.log 文件检查 datanode 启动过程是否存在异常。

到这里为止,分布式文件系统 HDFS 服务已经启动完成,可以对 HDFS 文件系统进行读、写操作了。现在再次通过地址查看 NameNode 服务状态页面,如图所示:

hadoop硬件配置要求 hadoop最低硬件配置_hadoop硬件配置要求_04


从图中可以看出,HDFS 集群中安全模式已经关闭,并且集群容量和活跃节点已经有数据了,这是因为 datanode 服务已经正常启动了。

(4)启动 ResourceManager 服务

[hadoop@hadoop bin]$ yarn --daemon start resourcemanager
[hadoop@hadoop bin]$ jps|grep ResourceManager
10103 ResourceManager

ResourceManager 服务启动后,会默认启动一个 http 端口 8088,可通过访问 http://192.168.172.128:8088 查看 ResourceManager 的 Web 状态页面,如下图所示:

hadoop硬件配置要求 hadoop最低硬件配置_运维_05


在上图中,需要重点关注的是 ResourceManager 中可用的内存资源、CPU 资源数及活跃节点数,目前看来,这些数据都是 0,是因为还没有 NodeManager 服务启动。

(5)启动 NodeManager 服务

[hadoop@hadoop bin]$ yarn --daemon start nodemanager
[hadoop@hadoop bin]$ jps|grep NodeManager
10388 NodeManager

(6)启动 Jobhistoryserver 服务

[hadoop@hadoop bin]$ mapred  --daemon start historyserver
[hadoop@hadoop bin]$ jps|grep JobHistoryServer
10529 JobHistoryServer

注意,启动 Jobhistoryserver 服务的命令变成了 mapred,而非 yarn。这是因为 Jobhistoryserver 服务是基于 MapReduce 的,Jobhistoryserver 服务启动后,会运行一个 http 端口,默认端口号是 19888,可以通过访问此端口查看每个任务的历史运行情况,如下图所示:

hadoop硬件配置要求 hadoop最低硬件配置_hadoop_06


至此,Hadoop 伪分布式已经运行起来了,可通过 jps 命令查看各个进程的启动信息:

[hadoop@hadoop bin]$ jps
9984 DataNode
10529 JobHistoryServer
9746 NameNode
10388 NodeManager
10103 ResourceManager
10615 Jps
9871 SecondaryNameNode

正常的话,会输出每个服务的进程名信息,这些输出表明 Hadoop 服务都已经正常启动了