Hadoop的平台的构建(伪分布式)

与 Linux 有众多发行版类似,Hadoop 也有很多发行版本,但基本上分为两类,即开源社区版和商业付费版。社区版是指由 Apache 软件基金会维护的版本,是官方维护的版本体系;商业版付费版是指由第三方商业公司在社区版 Hadoop 基础上进行了一些修改、整合以及各个服务组件兼容性测试而发行的稳定版本,比较著名的有 Cloudera 的 CDP、CDH、Hortonworks 的 Hortonworks Data Platform(HDP)、mapR 等。

在这些商业 Hadoop 发行版中,为了吸引用户的使用,厂商也提供了一些开源产品作为诱饵,比如 Cloudera 的 CDH 发行版、Hortonworks 的 HDP 发行版等,所以,目前而言,不收费的 Hadoop 版本主要有三个,即 Apache Hadoop、Cloudera 的 CDH 版本、Hortonworks 的 HDP。

Apache Hadoop 发行版本

Apache Hadoop 是最原始的 Hadoop 发行版本,目前总共发行了三个大版本,即 Hadoop1.x、Hadoop2.x、Hadoop3.x,每个版本的功能特性如下表所示:

Apache Hadoop 发行版提供源码包和二进制包两种形式下载 下载二进制包更加方便,点击这里(https://archive.apache.org/dist/hadoop/common/)获得下载。

Hortonworks Hadoop 发行版

Hortonworks 的主打产品是 HDP,同样是 100% 开源的产品,它最接近 Apache Hadoop 的版本,除此之外,HDP 还包含了 Ambari,这是一款开源的 Hadoop 管理系统。它可以实现统一部署、自动配置、自动化扩容、实时状态监控等,是个功能完备的大数据运维管理平台。

在使用 HDP 发行版时,可以通过 Ambari 管理功能,实现 Hadoop 的快速安装和部署,并且对大数据平台的运维也有很大帮助,可以说 Ambari 实现了与 HDP 的无缝整合。

HDP 至今也发行了三个版本,即 HDP1.x、HDP2.x 和 HDP3.x,跟 Apache Hadoop 发行的大版本遥相呼应,而 HDP 发行版的安装是基于 Ambari 实现的,通过 HDP 提供的 rpm 文件,可以在 Ambari 平台实现自动化的安装和扩容。

Cloudera Hadoop 发行版

Cloudera 是最早将 Hadoop 商用的公司,目前旗下的产品主要有 CDH、Cloudera Manager、Cloudera Data Platform(CDP)等,下表简单介绍了这些产品的特点。

如何选择发行版

作为用户,应该如何选择呢

是否为开源产品(是否免费),这点很重要;

是否有稳定的发行版本,开发版是不能用在生产上的;

是否已经接受过实践的检验,看看是否有大公司在用(自己不能当小白鼠);

是否有活跃的社区支持、充足的资料,因为遇到问题,我们可以通过社区、搜索等网络资源来解决问题。

在国内大型互联网企业中,使用较多的是 CDH 或 HDP 发行版本,个人推荐采用 HDP 发行版本,原因是部署简单、性能稳定。

伪分布式安装 Hadoop 集群

为了让你快速了解 Hadoop 功能和用途,先通过伪分布式来安装一个 Hadoop 集群,这里采用 Apache Hadoop 发行版的二进制包进行快速部署。完全分布式 Hadoop 集群后面将会进行更深入的介绍。

安装规划

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

安装过程

点击(https://mirror.bit.edu.cn/apache/hadoop/core/hadoop-3.2.1/)下载 Apache Hadoop 发行版本的 hadoop-3.2.1.tar.gz 二进制版本文件,其安装非常简单,只需解压文件即可完成安装,操作过程如下:

[root@namenodemaster ~]#useradd hadoop
[root@namenodemaster ~]#mkdir /opt/hadoop
[root@namenodemaster ~]#cd /opt/hadoop
[root@namenodemaster hadoop]#tar zxvf hadoop-3.2.1.tar.gz
[root@namenodemaster hadoop]#ln -s hadoop-3.2.1 current
[root@namenodemaster hadoop]#chown -R hadoop:hadoop /opt/hadoop

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

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

[root@namenodemaster ~]# mkdir /etc/hadoop
[root@namenodemaster ~]# cp -r /opt/hadoop/current/etc/hadoop /etc/hadoop/conf
[root@namenodemaster ~]#  chown -R hadoop:hadoop  /etc/hadoop
[root@namenodemaster ~]# 

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

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

[root@namenodemaster ~]# mkdir /usr/java
[root@namenodemaster ~]# cd /usr/java/
[root@namenodemaster java]# ls
jdk-8u211-linux-x64.tar.gz
[root@namenodemaster java]# tar zxvf jdk-8u211-linux-x64.tar.gz 
[root@namenodemaster java]# ln -s jdk1.8.0_211 default
[root@namenodemaster java]# ls
default  jdk1.8.0_211  jdk-8u211-linux-x64.tar.gz
[root@namenodemaster java]# 

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

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

[root@namenodemaster ~]# more /home/hadoop/.bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# 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
[root@namenodemaster ~]# 

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

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

  • HADOOP_HOME 是指定 Hadoop 安装程序的目录

  • HADOOP_CONF_DIR 是指定 Hadoop 配置文件目录

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

配置 Hadoop 参数

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

了解完目录的功能后,就开始进行配置操作了,Hadoop 的配置相当复杂,不过这些是后面要讲的内容。而在伪分布模式下,仅仅需要修改一个配置文件即可,该文件是 core-site.xml,此文件目前位于 /etc/hadoop/conf 目录下,在此文件 标签下增加如下内容: 

<property>
  <name>fs.defaultFS</name>
    <value>hdfs://hadoop3server</value>
</property>

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

[root@namenodemaster ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.31 namenodemaster 
[root@namenodemaster ~]# 

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

启动 Hadoop 服务

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

服务的功能和用途,先介绍这么多,后面将会进行更深入的阐述。接下来,要启动 Hadoop 集群的服务,必须以 Hadoop 用户来执行,并且每个服务的启动是有先后顺序的,下面依次启动每个服务 

(1)启动 NameNode 服务

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

[root@namenodemaster java]# su - hadoop
[hadoop@namenodemaster ~]$ cd /opt/hadoop/current/bin
[hadoop@namenodemaster bin]$ hdfs  namenode -format

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

[hadoop@namenodemaster conf]$ pwd
/etc/hadoop/conf
[hadoop@namenodemaster conf]$ hdfs --daemon start namenode
[hadoop@namenodemaster conf]$ jps|grep NameNode
3956 NameNode
[hadoop@namenodemaster conf]$ 

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

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

在上图中,红框标注的几个重点信息需要关注,第一个是 Hadoop 中 namenode 的访问地址为 hdfs://namenodemaster:8020,这是我们在配置文件中指定过的;另外还有 Hadoop 的版本、运行模式、容量、“Live node”及“Dead node”,下面逐个解释。

运行模式显示“Safe mode is off”,这表示目前 namenode 安全模式关闭,

Safe mode is on 这表示目前 namenode 安全模式启用     为什么呢,其实图中已经说明原因了,Namenode 在启动时,会检查 DataNode 的状态,如果 DataNode 上报的 block 个数达到了元数据记录的 block 个数的 0.999 倍才可以离开安全模式,否则一直运行在安全模式。安全模式也叫只读模式,此模式下,对 HDFS 上的数据无法进行写操作。因为现在还没启动 DataNode 服务,所以肯定是处于安全模式下。

HDFS 容量,Configured Capacity 目前显示为 0,这也是因为还没启动 DataNode 服务导致的,等启动后,应该就有容量显示了。

Live node”及“Dead node”分别显示目前集群中活跃的 DataNode 节点和故障(死)DataNode 节点,运维经常通过监控这个页面中“Dead node”的值来判断集群是否出现异常。

(2)启动 secondarynamenode 服务

[hadoop@namenodemaster conf]$  hdfs --daemon start secondarynamenode
[hadoop@namenodemaster conf]$  jps|grep SecondaryNameNode
4652 SecondaryNameNode
[hadoop@namenodemaster conf]$ 

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

(3)启动 DataNode 服务

[hadoop@namenodemaster conf]$ hdfs --daemon start datanode
[hadoop@namenodemaster conf]$  jps|grep DataNode
4514 DataNode
[hadoop@namenodemaster conf]$ 

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

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

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

(4)启动 ResourceManager 服务

接下来,还需要启动分布式计算服务,首先启动的是 ResourceManager,启动方式如下

[hadoop@namenodemaster ~]$ yarn --daemon start resourcemanager
[hadoop@namenodemaster ~]$ jps|grep ResourceManager
4838 ResourceManager
[hadoop@namenodemaster ~]$ 

注意,启动 resourcemanager 服务的命令变成了 yarn,而不是 hdfs,记住这个细节。

同理,如果 ResourceManager 进程无法启动,可以通过检查 /opt/hadoop/current/logs/hadoop-hadoop-resourcemanager-namenodemaster.log 日志文件来排查 ResourceManager 启动问题。

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

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

(5)启动 NodeManager 服务

在启动完成 ResourceManager 服务后,就可以启动 NodeManager 服务了,操作过程如下:

[hadoop@namenodemaster ~]$  yarn --daemon start nodemanager
[hadoop@namenodemaster ~]$ jps|grep NodeManager
5160 NodeManager
[hadoop@namenodemaster ~]$ 

如果有异常,可通过检查 /opt/hadoop/current/logs/hadoop-hadoop-nodemanager-namenodemaster.log 文件来排查 NodeManager 问题。

(6)启动 Jobhistoryserver 服务

等待 ResourceManager 和 NodeManager 服务启动完毕后,最后还需要启动一个 Jobhistoryserver 服务,操作过程如下

[hadoop@namenodemaster ~]$ mapred  --daemon start historyserver
[hadoop@namenodemaster ~]$ jps|grep JobHistoryServer
5336 JobHistoryServer
[hadoop@namenodemaster ~]$ 

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

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

[hadoop@namenodemaster ~]$ jps
4514 DataNode
3956 NameNode
5493 Jps
4838 ResourceManager
5160 NodeManager
5336 JobHistoryServer
4652 SecondaryNameNode
[hadoop@namenodemaster ~]$ 

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

运用 Hadoop HDFS 命令进行分布式存储

Hadoop 的 HDFS 是一个分布式文件系统,要对 HDFS 进行操作,需要执行 HDFS Shell,跟 Linux 命令很类似,因此,只要熟悉 Linux 命令,可以很快掌握 HDFS Shell 的操作。

下面看几个例子,你就能迅速知道 HDFS Shell 的用法, 需要注意,执行 HDFS Shell 建议在 Hadoop 用户或其他普用用户下执行。

(1)查看 hdfs 根目录数据,可通过如下命令:

[hadoop@namenodemaster ~]$  hadoop fs -ls /
Found 1 items
drwxrwx---   - hadoop supergroup          0 2021-01-31 11:50 /tmp

 通过这个命令的输出可知,刚刚创建起来的 HDFS 文件系统是没有任何数据的,不过可以自己创建文件或目录。

(2)在 hdfs 根目录创建一个 logs 目录,可执行如下命令

[hadoop@namenodemaster ~]$ hadoop fs -mkdir /logs

(3)从本地上传一个文件到 hdfs 的 /logs 目录下,可执行如下命令:

[hadoop@namenodemaster ~]$ hadoop fs -put /data/test.txt /logs
[hadoop@namenodemaster ~]$ hadoop fs -put /data/db.gz  /logs
2021-01-31 12:01:23,014 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[hadoop@namenodemaster ~]$ hadoop fs -ls /logs
Found 2 items
-rw-r--r--   3 hadoop supergroup      10240 2021-01-31 12:01 /logs/db.gz
-rw-r--r--   3 hadoop supergroup          4 2021-01-31 11:59 /logs/test.txt
[hadoop@namenodemaster ~]$ 

注意,这里的 /data/test.txt 及 db.gz 是操作系统下的一个本地文件,通过执行 put 命令,可以看到,文件已经从本地磁盘传到 HDFS 上了。

(4)要查看 hdfs 中一个文本文件的内容,可执行如下命令:

[hadoop@namenodemaster ~]$ hadoop fs -cat /logs/test.txt
2021-01-31 12:02:55,297 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
123
[hadoop@namenodemaster ~]$ hadoop fs -text /logs/db.gz

可以看到,在 HDFS 上的压缩文件通过“-text”参数也能直接查看,因为默认情况下 Hadoop 会自动识别常见的压缩格式。

(5)删除 hdfs 上一个文件,可执行如下命令:

[hadoop@namenodemaster ~]$ hadoop fs  -rm  -r /logs/test.txt
Deleted /logs/test.txt
[hadoop@namenodemaster ~]$ hadoop fs -cat /logs/test.txt
cat: `/logs/test.txt': No such file or directory
[hadoop@namenodemaster ~]$ 

注意,HDFS 上面的文件,只能创建和删除,无法更新一个存在的文件,如果要更新 HDFS 上的文件,需要先删除这个文件,然后提交最新的文件即可

在 Hadoop 中运行 MapreDuce 程序

要体验 Hadoop 的分布式计算功能,这里借用 Hadoop 安装包中附带的一个 mapreduce 的 demo 程序,做个简单的 MR 计算。

这个 demo 程序位于 $HADOOP_HOME/share/hadoop/mapreduce 路径下,这个环境下的路径为 /opt/hadoop/current/share/hadoop/mapreduce,在此目录下找到一个名为 hadoop-mapreduce-examples-3.2.1.jar 的 jar 文件,有了这个文件下面的操作就简单多了

单词计数是最简单也是最能体现 MapReduce 思想的程序之一,可以称为 MapReduce 版“Hello World”,hadoop-mapreduce-examples-3.2.1.jar 文件中包含了一个 wordcount 功能,它主要功能是用来统计一系列文本文件中每个单词出现的次数。下面开始执行分析计算。

(1)创建一个新文件

[hadoop@namenodemaster /opt]$ vim demo.txt
[hadoop@namenodemaster /opt]$ cat !$
cat demo.txt
Linux Unix windows
hadoop Linux spark
hive hadoop Unix
MapReduce hadoop  Linux hive
windows hadoop spark

[hadoop@namenodemaster ~]$ 

(2)将创建的文件存入 HDFS

[hadoop@namenodemaster ~]$ hadoop fs -mkdir /demo
[hadoop@namenodemaster ~]$ hadoop fs -put /opt/demo.txt /demo
2021-01-31 12:06:54,615 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[hadoop@namenodemaster ~]$ hadoop fs -ls /demo
Found 1 items
-rw-r--r--   3 hadoop supergroup        106 2021-01-31 12:06 /demo/demo.txt
[hadoop@namenodemaster ~]$ 

这里在 HDFS 上创建了一个目录 /demo,然后将刚才创建好的本地文件 put 到 HDFS 上,这里举例是一个文件,如果要统计多个文件内容,将多个文件都上传到 HDFS 的 /demo 目录即可。

(3)执行分析计算任务

下面开始执行分析任务:

[hadoop@namenodemaster ~]$ hadoop jar /opt/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar  wordcount /demo  /output
2021-01-31 12:08:32,922 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2021-01-31 12:08:32,965 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2021-01-31 12:08:32,965 INFO impl.MetricsSystemImpl: JobTracker metrics system started
2021-01-31 12:08:33,255 INFO input.FileInputFormat: Total input files to process : 1
2021-01-31 12:08:33,272 INFO mapreduce.JobSubmitter: number of splits:1
2021-01-31 12:08:33,346 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local1276790053_0001
2021-01-31 12:08:33,346 INFO mapreduce.JobSubmitter: Executing with tokens: []
2021-01-31 12:08:33,416 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
2021-01-31 12:08:33,416 INFO mapreduce.Job: Running job: job_local1276790053_0001
2021-01-31 12:08:33,417 INFO mapred.LocalJobRunner: OutputCommitter set in config null
2021-01-31 12:08:33,422 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 2
2021-01-31 12:08:33,422 INFO output.FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: false
2021-01-31 12:08:33,423 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
2021-01-31 12:08:33,453 INFO mapred.LocalJobRunner: Waiting for map tasks
2021-01-31 12:08:33,453 INFO mapred.LocalJobRunner: Starting task: attempt_local1276790053_0001_m_000000_0
2021-01-31 12:08:33,470 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 2
2021-01-31 12:08:33,470 INFO output.FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: false
2021-01-31 12:08:33,575 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
2021-01-31 12:08:33,600 INFO mapred.MapTask: Processing split: hdfs://namenodemaster/demo/demo.txt:0+106
2021-01-31 12:08:34,799 INFO mapreduce.Job: Job job_local1276790053_0001 running in uber mode : false
2021-01-31 12:08:34,799 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
2021-01-31 12:08:34,799 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
2021-01-31 12:08:34,799 INFO mapred.MapTask: soft limit at 83886080
2021-01-31 12:08:34,799 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
2021-01-31 12:08:34,799 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
2021-01-31 12:08:34,800 INFO mapreduce.Job:  map 0% reduce 0%
2021-01-31 12:08:34,802 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
2021-01-31 12:08:34,866 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-01-31 12:08:35,091 INFO mapred.LocalJobRunner: 
2021-01-31 12:08:35,093 INFO mapred.MapTask: Starting flush of map output
2021-01-31 12:08:35,093 INFO mapred.MapTask: Spilling map output
2021-01-31 12:08:35,093 INFO mapred.MapTask: bufstart = 0; bufend = 168; bufvoid = 104857600
2021-01-31 12:08:35,093 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214336(104857344); length = 61/6553600
2021-01-31 12:08:35,159 INFO mapred.MapTask: Finished spill 0
2021-01-31 12:08:35,202 INFO mapred.Task: Task:attempt_local1276790053_0001_m_000000_0 is done. And is in the process of committing
2021-01-31 12:08:35,207 INFO mapred.LocalJobRunner: map
2021-01-31 12:08:35,207 INFO mapred.Task: Task 'attempt_local1276790053_0001_m_000000_0' done.
2021-01-31 12:08:35,213 INFO mapred.Task: Final Counters for attempt_local1276790053_0001_m_000000_0: Counters: 24
	File System Counters
		FILE: Number of bytes read=316693
		FILE: Number of bytes written=841987
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=106
		HDFS: Number of bytes written=0
		HDFS: Number of read operations=5
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=1
		HDFS: Number of bytes read erasure-coded=0
	Map-Reduce Framework
		Map input records=6
		Map output records=16
		Map output bytes=168
		Map output materialized bytes=95
		Input split bytes=100
		Combine input records=16
		Combine output records=7
		Spilled Records=7
		Failed Shuffles=0
		Merged Map outputs=0
		GC time elapsed (ms)=0
		Total committed heap usage (bytes)=303562752
	File Input Format Counters 
		Bytes Read=106
2021-01-31 12:08:35,213 INFO mapred.LocalJobRunner: Finishing task: attempt_local1276790053_0001_m_000000_0
2021-01-31 12:08:35,215 INFO mapred.LocalJobRunner: map task executor complete.
2021-01-31 12:08:35,218 INFO mapred.LocalJobRunner: Waiting for reduce tasks
2021-01-31 12:08:35,219 INFO mapred.LocalJobRunner: Starting task: attempt_local1276790053_0001_r_000000_0
2021-01-31 12:08:35,253 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 2
2021-01-31 12:08:35,253 INFO output.FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: false
2021-01-31 12:08:35,253 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
2021-01-31 12:08:35,277 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@5a9ca056
2021-01-31 12:08:35,278 WARN impl.MetricsSystemImpl: JobTracker metrics system already initialized!
2021-01-31 12:08:35,364 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=1299919616, maxSingleShuffleLimit=324979904, mergeThreshold=857947008, ioSortFactor=10, memToMemMergeOutputsThreshold=10
2021-01-31 12:08:35,366 INFO reduce.EventFetcher: attempt_local1276790053_0001_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
2021-01-31 12:08:35,441 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local1276790053_0001_m_000000_0 decomp: 91 len: 95 to MEMORY
2021-01-31 12:08:35,444 INFO reduce.InMemoryMapOutput: Read 91 bytes from map-output for attempt_local1276790053_0001_m_000000_0
2021-01-31 12:08:35,446 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 91, inMemoryMapOutputs.size() -> 1, commitMemory -> 0, usedMemory ->91
2021-01-31 12:08:35,448 INFO reduce.EventFetcher: EventFetcher is interrupted.. Returning
2021-01-31 12:08:35,464 INFO mapred.LocalJobRunner: 1 / 1 copied.
2021-01-31 12:08:35,464 INFO reduce.MergeManagerImpl: finalMerge called with 1 in-memory map-outputs and 0 on-disk map-outputs
2021-01-31 12:08:35,464 WARN io.ReadaheadPool: Failed readahead on ifile
EBADF: Bad file descriptor
	at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posix_fadvise(Native Method)
	at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posixFadviseIfPossible(NativeIO.java:271)
	at org.apache.hadoop.io.nativeio.NativeIO$POSIX$CacheManipulator.posixFadviseIfPossible(NativeIO.java:148)
	at org.apache.hadoop.io.ReadaheadPool$ReadaheadRequestImpl.run(ReadaheadPool.java:209)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
2021-01-31 12:08:35,535 INFO mapred.Merger: Merging 1 sorted segments
2021-01-31 12:08:35,535 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 83 bytes
2021-01-31 12:08:35,536 INFO reduce.MergeManagerImpl: Merged 1 segments, 91 bytes to disk to satisfy reduce memory limit
2021-01-31 12:08:35,536 INFO reduce.MergeManagerImpl: Merging 1 files, 95 bytes from disk
2021-01-31 12:08:35,536 INFO reduce.MergeManagerImpl: Merging 0 segments, 0 bytes from memory into reduce
2021-01-31 12:08:35,536 INFO mapred.Merger: Merging 1 sorted segments
2021-01-31 12:08:35,537 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 83 bytes
2021-01-31 12:08:35,537 INFO mapred.LocalJobRunner: 1 / 1 copied.
2021-01-31 12:08:35,587 INFO Configuration.deprecation: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
2021-01-31 12:08:35,886 INFO mapreduce.Job:  map 100% reduce 0%
2021-01-31 12:08:35,894 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-01-31 12:08:36,319 INFO mapred.Task: Task:attempt_local1276790053_0001_r_000000_0 is done. And is in the process of committing
2021-01-31 12:08:36,321 INFO mapred.LocalJobRunner: 1 / 1 copied.
2021-01-31 12:08:36,321 INFO mapred.Task: Task attempt_local1276790053_0001_r_000000_0 is allowed to commit now
2021-01-31 12:08:36,337 INFO output.FileOutputCommitter: Saved output of task 'attempt_local1276790053_0001_r_000000_0' to hdfs://namenodemaster/output
2021-01-31 12:08:36,338 INFO mapred.LocalJobRunner: reduce > reduce
2021-01-31 12:08:36,338 INFO mapred.Task: Task 'attempt_local1276790053_0001_r_000000_0' done.
2021-01-31 12:08:36,338 INFO mapred.Task: Final Counters for attempt_local1276790053_0001_r_000000_0: Counters: 30
	File System Counters
		FILE: Number of bytes read=316915
		FILE: Number of bytes written=842082
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=106
		HDFS: Number of bytes written=61
		HDFS: Number of read operations=10
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=3
		HDFS: Number of bytes read erasure-coded=0
	Map-Reduce Framework
		Combine input records=0
		Combine output records=0
		Reduce input groups=7
		Reduce shuffle bytes=95
		Reduce input records=7
		Reduce output records=7
		Spilled Records=7
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=291
		Total committed heap usage (bytes)=303562752
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Output Format Counters 
		Bytes Written=61
2021-01-31 12:08:36,339 INFO mapred.LocalJobRunner: Finishing task: attempt_local1276790053_0001_r_000000_0
2021-01-31 12:08:36,339 INFO mapred.LocalJobRunner: reduce task executor complete.
2021-01-31 12:08:36,887 INFO mapreduce.Job:  map 100% reduce 100%
2021-01-31 12:08:36,887 INFO mapreduce.Job: Job job_local1276790053_0001 completed successfully
2021-01-31 12:08:36,897 INFO mapreduce.Job: Counters: 36
	File System Counters
		FILE: Number of bytes read=633608
		FILE: Number of bytes written=1684069
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=212
		HDFS: Number of bytes written=61
		HDFS: Number of read operations=15
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=4
		HDFS: Number of bytes read erasure-coded=0
	Map-Reduce Framework
		Map input records=6
		Map output records=16
		Map output bytes=168
		Map output materialized bytes=95
		Input split bytes=100
		Combine input records=16
		Combine output records=7
		Reduce input groups=7
		Reduce shuffle bytes=95
		Reduce input records=7
		Reduce output records=7
		Spilled Records=14
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=291
		Total committed heap usage (bytes)=607125504
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=106
	File Output Format Counters 
		Bytes Written=61
[hadoop@namenodemaster ~]$ hadoop fs -ls /output
Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2021-01-31 12:08 /output/_SUCCESS
-rw-r--r--   3 hadoop supergroup         61 2021-01-31 12:08 /output/part-r-00000
[hadoop@namenodemaster ~]$ hadoop fs -text /output/part-r-00000
2021-01-31 12:09:31,329 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
Linux	3
MapReduce	1
Unix	2
hadoop	4
hive	2
spark	2
windows	2
[hadoop@namenodemaster ~]$ 

在上面的操作中,通过执行“hadoop jar”后面跟上 jar 包示例文件,并给出执行的功能是 wordcount,即可完成任务的执行,请注意,最后的两个路径都是 HDFS 上的路径,第一个路径是分析读取文件的目录,必须存在;第二个路径是分析任务输出结果的存放路径,必须不存在,分析任务会自动创建这个目录

任务执行完毕后,可以查看 /output 目录下有两个文件,其中:

  • _SUCCESS,任务完成标识,表示执行成功;

  • part-r-00000,表示输出文件名,常见的名称有 part-m-00000、part-r-00001,其中,带 m 标识的文件是 mapper 输出,带 r 标识的文件是 reduce 输出的,00000 为 job 任务编号,part-r-00000 整个文件为结果输出文件。

通过查看 part-r-00000 文件内容,可以看到 wordcount 的统计结果。左边一列是统计的单词,右边一列是在文件中单词出现的次数。

(4)在 ResourceManager 的 Web 页面展示运行任务

细心的你可能已经发现了,上面在命令行执行的 wordcount 统计任务虽然最后显示是执行成功了,统计结果也正常,但是在 ResourceManager 的 Web 页面并没有显示出来。

究其原因,其实很简单:这是因为那个 mapreduce 任务并没有真正提交到 yarn 上来,因为默认 mapreduce 的运行环境是 local(本地),要让 mapreduce 在 yarn 上运行,需要做几个参数配置就行了。

需要修改的配置文件有两个,即 mapred-site.xml 和 yarn-site.xml,在你的配置文件目录,找到它们。

打开 mapred-site.xml 文件,在 标签内添加如下内容:

[hadoop@namenodemaster conf]$ pwd
/etc/hadoop/conf
[hadoop@namenodemaster conf]$ vim mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  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>
<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
</property>
<property>
   <name>yarn.app.mapreduce.am.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
   <name>mapreduce.map.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
   <name>mapreduce.reduce.env</name>
   <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
[hadoop@namenodemaster conf]$ 

其中,mapreduce.framework.name 选项就是用来指定 mapreduce 的运行时环境,指定为 yarn 即可,下面的三个选项是指定 mapreduce 运行时一些环境信息。

最后,修改另一个文件 yarn-site.xml,添加如下内容到 标签中

[hadoop@namenodemaster conf]$ vim yarn-site.xml 
<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  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.
-->
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
  <name>yarn.namenodemaster.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
</configuration>
[hadoop@namenodemaster conf]$ 

其中,yarn.nodemanager.aux-services 选项代表可在 NodeManager 上运行的扩展服务,需配置成 mapreduce_shuffle,才可运行 MapReduce 程序。

配置修改完成后,需要重启 ResourceManager 与 nodemanager 服务才能使配置生效。

现在,我们再次运行刚才的那个 mapreduce 的 wordcount 统计,所有执行的任务都会在 ResourceManager 的 Web 页面展示出来,如下图所示:

从图中可以清晰的看出,执行任务的 ID 名、执行任务的用户、程序名、任务类型、队列、优先级、启动时间、完成时间、最终状态等信息。从运维角度来说,这个页面有很多信息都需要引起关注,比如任务最终状态是否有失败的,如果有,可以点击倒数第二列“Tracking UI”下面的 History 链接查看日志进行排查问题。

Namenode 的 Web 页面和 ResourceManager 的 Web 页面在进行大数据运维工作中,经常会用到,这些 Web 界面主要用来状态监控、故障排查,更多使用细节和技巧。

猜你喜欢

转载自blog.csdn.net/yanghuadong_1992/article/details/113487548
今日推荐