一、MapReduce的概述
1、 MapReduce 定义
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架,其核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
2、 MapReduce 产生缘由
为什么需要MapReduce?
- 海量数据在单机上处理因为硬件资源限制,无法胜任。
- 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度。
- 引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。
设想一个海量数据场景下的wordcount需求:
- 单机版:内存受限,磁盘受限,运算能力受限
- 分布式:文件分布式存储(HDFS)、运算逻辑需要至少分成2个阶段(一个阶段独立并发,一个阶段汇聚)、运算程序如何分发、程序如何分配运算任务(切片)、两阶段的程序如何启动?如何协调?、整个程序运行过程中的监控?容错?重试?
可见在程序由单机版扩成分布式时,会引入大量的复杂工作。
3、MapReduce与Yarn的关系
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台。而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
YARN的重要概念:
- yarn并不清楚用户提交的程序的运行机制;
- yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源);
- yarn中的主管角色叫ResourceManager;
- yarn中具体提供运算资源的角色叫NodeManager;
- 这样一来,yarn其实就与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(MapReduce只是其中的一种),比如MapReduce、storm程序,spark程序,tez……;
- 所以,spark、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制即可;
- Yarn就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享。
-
- MapReduce集群环境搭建
MapReduce配置
Hadoop MapReduce是一个软件框架,可以轻松编写 处理大量数据的应用程序(多 TB 数据集) 在商用的大型集群(数千个节点)上并行 以可靠、容错的方式提供硬件。
MapReduce作业通常将输入数据集拆分为 由地图任务处理的独立块 完全平行的方式。该框架对地图的输出进行排序, 然后将其输入到Reduce任务中。通常,两者都 作业的输入和输出存储在文件系统中。框架 负责调度任务,监控它们并重新执行失败的任务 任务。
通常,计算节点和存储节点是相同的,即 MapReduce框架和Hadoop分布式文件系统(参见HDFS架构指南) 在同一组节点上运行。此配置 允许框架有效地调度数据所在的节点上的任务 已存在,导致 簇。
MapReduce框架由一个主JobTracker和一个从TaskTracker组成。 cluster-node。主节点负责调度作业的组件 从属设备上的任务,监视它们并重新执行失败的任务。这 从站按照主站的指示执行任务。
最低限度,应用程序通过实现 适当的接口和/或抽象类。这些,以及其他工作 参数,包括作业配置。然后,Hadoop 作业客户端提交作业(jar/可执行文件等),并 配置到 JobTracker,然后假设 负责将软件/配置分发给从站, 安排任务并对其进行监控,提供状态和诊断 向作业客户提供信息。
尽管Hadoop框架是用JavaTM实现的, MapReduce应用程序不需要用Java编写。
- Hadoop Streaming 是一个允许用户创建和运行的实用程序 使用任何可执行文件(例如 shell 实用程序)作为映射器和/或 减速机。
- Hadoop Pipes 是一个 SWIG- 兼容的 C++ API 来实现 MapReduce 应用程序(非 基于JNITM)。
MapReduce是运行在YARN上的,所以MapReduce只需要配置,YARN需要部署并启动。
- 关于MapReduce: 修改相关配置文件,但是没有进程可以启动
- 关于YARN: 修改相关配置文件, 并启动ResourceManager、NodeManager进程以及辅助进程(代理服务器、历史服务器)\
Mapreduce和YARN部署结构图如下:
有3台服务器,其中node1配置较高,集群规划如下:
主机 | 角色 |
node1 | ResourceManager、NodeManager、ProxyServer、JobHistoryServer |
node2 | NodeManager |
node3 | NodeManager |
配置MapReduce和YARN
MapReduce配置文件
修改mapred-site.xml
配置文件,在其configuration标签内增加以下内容:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/data/mr-history/tmp</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/data/mr-history/done</value>
<description></description>
</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>
首先要对mapred.job.tracker这个访问地址进行配置,通过host加端口的方式,host我们可以填入IP地址,端口可以自己取一个
mapred.loca.dir记录的是本地文件系统下逗号分隔的路径列表,MapReudce临时数据存放的地方。
Mapred.tasktracker这个属性可以配置在本地的{map/reduce}.tasks最大的个数
YRAN配置文件:
vim yarn-env.sh
在顶部添加以下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
设置JDK路径的环境变量
设置HADOOP_HOME的环境变量
设置配置文件路径的环境变量
设置日志文件路径的环境变量
vim yarn-site.xml
在<configuration></configuration>之间添加以下内容
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
<discription>ResourceManager设置在node1节点</discription>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/nm-local</value>
<discription>NodeManager中间数据本地存储路径</discription>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
<discription>NodeManager数据日志本地存储路径</discription>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<discription>为MapReduce程序开启Shuffle服务</discription>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
<discription>历史服务器URL</discription>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>node1:8089</value>
<discription>代理服务器主机和端口</discription>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<discription>开启日志聚合</discription>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<discription>程序日志HDFS的存储路径</discription>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<discription>选择公平调度器</discription>
</property>
代码原文出处:(黑马大数据学习笔记3-MapReduce配置和YARN部署以及基本命令-CSDN博客)
MapReduce Wordcount(单词计数)
1.1 Map过程
首先,Hadoop会把输入数据划分成等长的输入分片(input split) 或分片发送到MapReduce。Hadoop为每个分片创建一个map任务,由它来运行用户自定义的map函数以分析每个分片中的记录。在我们的单词计数例子中,输入是多个文件,一般一个文件对应一个分片,如果文件太大则会划分为多个分片。map函数的输入以 <key, value> 形式做为输入,value为文件的每一行,key 为该行在文件中的偏移量(一般我们会忽视)。这里map函数起到的作用为将每一行进行分词为多个word ,并在 context 中写入<word, 1> 以代表该单词出现一次。
map过程的示意图如下:
1.2 Reduce过程
接下来我们看reducer的编写。reduce任务的多少并不是由输入大小来决定,而是需要人工单独指定的(默认为1个)。和上面map不同的是,reduce任务不再具有本地读取的优势————一个reduce任务的输入往往来自于所有mapper的输出,因此map和reduce之间的数据流被称为 shuffle(洗牌) 。Hadoop会先按照key-value对进行排序,然后将排序好的map的输出通过网络传输到reduce任务运行的节点,并在那里进行合并,然后传递到用户定义的reduce函数中。
reduce 函数示意图如下:
Hadoop eclipse插件
Hadoop Eclipse是Hadoop开发环境的插件,在安装该插件之前需要首先配置Hadoop的相关信息。用户在创建Hadoop程序时,Eclipse插件会自动导入Hadoop编程接口的jar文件,这样用户就可以在Eclipse插件的图形界面中进行编码、调试和运行Hadop程序,也能通过Eclipse插件查看程序的实时状态、错误信息以及运行结果。除此之外,用户还可以通过Eclipse插件对HDFS进行管理和查看。
- Hadoop自0.20.x版本后不在提供现成的Hadoop-eclipse插件,而是给出了源码自行编译。
- 编译采用的是ant+ivy。