<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>简单之美 &#187; Category &#187; Hadoop/Hive/ZooKeeper</title>
	<atom:link href="http://shiyanjun.cn/archives/category/opensource/hadoop-hvie-zookeeper/feed" rel="self" type="application/rss+xml" />
	<link>http://shiyanjun.cn</link>
	<description>简单之美，难得简单，享受简单的唯美。</description>
	<lastBuildDate>Wed, 04 Mar 2026 07:04:53 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>CDH-5.7.0：基于Parcels方式离线安装配置</title>
		<link>http://shiyanjun.cn/archives/1728.html</link>
		<comments>http://shiyanjun.cn/archives/1728.html#comments</comments>
		<pubDate>Thu, 28 Sep 2017 08:04:10 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[CDH]]></category>
		<category><![CDATA[Hadoop]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1728</guid>
		<description><![CDATA[<p>CDH是Cloudera公司提供的Hadoop发行版，它在原生开源的Apache Hadoop基础之上，针对特定版本的Hadoop以及Hadoop相关的软件，如Zookeeper、HBase、Flume、Sqoop等做了兼容性开发，我们在安装CDH发行版的Hadoop时就无需进行额外繁琐的兼容性测试。
以往安装配置使用Apache Hadoop时，完全需要手动在服务器上，通过命令和脚本进行安装配置，比较复杂而繁琐。使用CDH，我们可以通过Cloudera提供的CM（Cloudera Manager）来进行安装，CM是一个面向Hadoop相关软件的强大SCM工具，它提供了通过Web界面向导的方式进行软件的安装配置，此外还提供了比较基础、友好的监控、预警功能，通过Web UI展示各种已安装软件的资源使用情况、系统运行状态等等。
如果使用CM来管理CDH平台，因为CM使用了监控管理、运行状态数据采集、预警等等很多服务，所以在集群服务器资源使用方面也会比通常的Apache Hadoop版本多很多，如果所需要的Hadoop集群规模超大，比如成百上千个节点，使用CM来安装管理CDH集群能够节省大量时间，而且节省了对整个集群基本的监控的配置管理；如果集群规模比较小，</p>]]></description>
	<p>CDH是Cloudera公司提供的Hadoop发行版，它在原生开源的Apache Hadoop基础之上，针对特定版本的Hadoop以及Hadoop相关的软件，如Zookeeper、HBase、Flume、Sqoop等做了兼容性开发，我们在安装CDH发行版的Hadoop时就无需进行额外繁琐的兼容性测试。
以往安装配置使用Apache Hadoop时，完全需要手动在服务器上，通过命令和脚本进行安装配置，比较复杂而繁琐。使用CDH，我们可以通过Cloudera提供的CM（Cloudera Manager）来进行安装，CM是一个面向Hadoop相关软件的强大SCM工具，它提供了通过Web界面向导的方式进行软件的安装配置，此外还提供了比较基础、友好的监控、预警功能，通过Web UI展示各种已安装软件的资源使用情况、系统运行状态等等。
如果使用CM来管理CDH平台，因为CM使用了监控管理、运行状态数据采集、预警等等很多服务，所以在集群服务器资源使用方面也会比通常的Apache Hadoop版本多很多，如果所需要的Hadoop集群规模超大，比如成百上千个节点，使用CM来安装管理CDH集群能够节省大量时间，而且节省了对整个集群基本的监控的配置管理；如果集群规模比较小，</p>			<content:encoded><![CDATA[<p>CDH是Cloudera公司提供的Hadoop发行版，它在原生开源的Apache Hadoop基础之上，针对特定版本的Hadoop以及Hadoop相关的软件，如Zookeeper、HBase、Flume、Sqoop等做了兼容性开发，我们在安装CDH发行版的Hadoop时就无需进行额外繁琐的兼容性测试。
以往安装配置使用Apache Hadoop时，完全需要手动在服务器上，通过命令和脚本进行安装配置，比较复杂而繁琐。使用CDH，我们可以通过Cloudera提供的CM（Cloudera Manager）来进行安装，CM是一个面向Hadoop相关软件的强大SCM工具，它提供了通过Web界面向导的方式进行软件的安装配置，此外还提供了比较基础、友好的监控、预警功能，通过Web UI展示各种已安装软件的资源使用情况、系统运行状态等等。
如果使用CM来管理CDH平台，因为CM使用了监控管理、运行状态数据采集、预警等等很多服务，所以在集群服务器资源使用方面也会比通常的Apache Hadoop版本多很多，如果所需要的Hadoop集群规模超大，比如成百上千个节点，使用CM来安装管理CDH集群能够节省大量时间，而且节省了对整个集群基本的监控的配置管理；如果集群规模比较小，</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1728.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：MapTask执行流程分析</title>
		<link>http://shiyanjun.cn/archives/1457.html</link>
		<comments>http://shiyanjun.cn/archives/1457.html#comments</comments>
		<pubDate>Tue, 02 Feb 2016 09:42:38 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1457</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
在文章《MapReduce V1：TaskTracker设计要点概要分析》中我们已经了解了org.apache.hadoop.mapred.Child启动的基本流程，在Child VM启动的过程中会运行MapTask，实际是运行用户编写的MapReduce程序中的map方法中的处理逻辑，我们首先看一下，在Child类中，Child基于TaskUmbilicalProtocol协议与TaskTracker通信，获取到该Child VM需要加载的Task相关数据，包括Task本身，代码如下所示：
上面代码中，JvmTask中就包含了一个Task，也就是task，它可能是MapTask或ReduceTask。
看一下在org.apache.hadoop.mapred.Child中运行Task的基本代码，如下所示：
我们关注执行MapTask，上面，通过调用MapTask的run方法，来实际启动MapTask的运行。
MapTask整体执行流程
MapTask运行的整体流程，如下图所示：

上面流程比较直观，我们结合MapTask的run方法的代码，来进行分析，代码如下所示：
上面代码中，run方法的参数TaskUmbilicalProtocol umbilical表示一个RPC代理对象，通过该对象可以与TaskTracker进行通信，从而在</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
在文章《MapReduce V1：TaskTracker设计要点概要分析》中我们已经了解了org.apache.hadoop.mapred.Child启动的基本流程，在Child VM启动的过程中会运行MapTask，实际是运行用户编写的MapReduce程序中的map方法中的处理逻辑，我们首先看一下，在Child类中，Child基于TaskUmbilicalProtocol协议与TaskTracker通信，获取到该Child VM需要加载的Task相关数据，包括Task本身，代码如下所示：

    final TaskUmbilicalProtocol umbilical =
      taskOwner.doAs(new PrivilegedExceptionAction&lt;TaskUmbilicalProtocol&gt;() {
        @Override
        public TaskUmbilicalProtocol run() throws Exception { // 建立Child到TaskTracker的RPC连接
          return (TaskUmbilicalProtocol)RPC.getProxy(TaskUmbilicalProtocol.class,
              TaskUmbilicalProtocol.versionID,
              address,
              defaultConf);
        }
    });
... ...
    JvmContext context </p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
在文章《MapReduce V1：TaskTracker设计要点概要分析》中我们已经了解了org.apache.hadoop.mapred.Child启动的基本流程，在Child VM启动的过程中会运行MapTask，实际是运行用户编写的MapReduce程序中的map方法中的处理逻辑，我们首先看一下，在Child类中，Child基于TaskUmbilicalProtocol协议与TaskTracker通信，获取到该Child VM需要加载的Task相关数据，包括Task本身，代码如下所示：
上面代码中，JvmTask中就包含了一个Task，也就是task，它可能是MapTask或ReduceTask。
看一下在org.apache.hadoop.mapred.Child中运行Task的基本代码，如下所示：
我们关注执行MapTask，上面，通过调用MapTask的run方法，来实际启动MapTask的运行。
MapTask整体执行流程
MapTask运行的整体流程，如下图所示：

上面流程比较直观，我们结合MapTask的run方法的代码，来进行分析，代码如下所示：
上面代码中，run方法的参数TaskUmbilicalProtocol umbilical表示一个RPC代理对象，通过该对象可以与TaskTracker进行通信，从而在</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1457.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：TaskTracker端启动Task流程分析</title>
		<link>http://shiyanjun.cn/archives/1418.html</link>
		<comments>http://shiyanjun.cn/archives/1418.html#comments</comments>
		<pubDate>Sun, 20 Dec 2015 11:59:17 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1418</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
TaskTracker周期性地向JobTracker发送心跳报告，在RPC调用返回结果后，解析结果得到JobTracker下发的运行Task的指令，即LaunchTaskAction，就会在TaskTracker节点上准备运行这个Task。Task的运行是在一个与TaskTracker进程隔离的JVM实例中执行，该JVM实例是通过org.apache.hadoop.mapred.Child来创建的，所以在创建Child VM实例之前，需要做大量的准备工作来启动Task运行。一个Task的启动过程，如下序列图所示：

通过上图，结合源码，我们将一个Task启动的过程，分为下面3个主要的步骤：

初始化跟踪Task运行的相关数据结构
准备Task运行所共享的Job资源
启动Task

下面，我们详细分析上面3个步骤的流程：
初始化跟踪Task运行的相关数据结构
如果是LaunchTaskAction，则TaskTracker会将该指令加入到一个启动Task的队列中，进行一步加载处理，如下所示：
根据Task的类型，分别加入到对应类型的TaskLauncher的队列中。这里需要了解一下TaskLauncher线程类，在TaskTracker中创建了2个TaskLauncher线程，一个是为</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
TaskTracker周期性地向JobTracker发送心跳报告，在RPC调用返回结果后，解析结果得到JobTracker下发的运行Task的指令，即LaunchTaskAction，就会在TaskTracker节点上准备运行这个Task。Task的运行是在一个与TaskTracker进程隔离的JVM实例中执行，该JVM实例是通过org.apache.hadoop.mapred.Child来创建的，所以在创建Child VM实例之前，需要做大量的准备工作来启动Task运行。一个Task的启动过程，如下序列图所示：

通过上图，结合源码，我们将一个Task启动的过程，分为下面3个主要的步骤：

初始化跟踪Task运行的相关数据结构
准备Task运行所共享的Job资源
启动Task

下面，我们详细分析上面3个步骤的流程：
初始化跟踪Task运行的相关数据结构
如果是LaunchTaskAction，则TaskTracker会将该指令加入到一个启动Task的队列中，进行一步加载处理，如下所示：

  private void addToTaskQueue(LaunchTaskAction action) {
    if (action.getTask().isMapTask()) {
      mapLauncher.addToTaskQueue(action);</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
TaskTracker周期性地向JobTracker发送心跳报告，在RPC调用返回结果后，解析结果得到JobTracker下发的运行Task的指令，即LaunchTaskAction，就会在TaskTracker节点上准备运行这个Task。Task的运行是在一个与TaskTracker进程隔离的JVM实例中执行，该JVM实例是通过org.apache.hadoop.mapred.Child来创建的，所以在创建Child VM实例之前，需要做大量的准备工作来启动Task运行。一个Task的启动过程，如下序列图所示：

通过上图，结合源码，我们将一个Task启动的过程，分为下面3个主要的步骤：

初始化跟踪Task运行的相关数据结构
准备Task运行所共享的Job资源
启动Task

下面，我们详细分析上面3个步骤的流程：
初始化跟踪Task运行的相关数据结构
如果是LaunchTaskAction，则TaskTracker会将该指令加入到一个启动Task的队列中，进行一步加载处理，如下所示：
根据Task的类型，分别加入到对应类型的TaskLauncher的队列中。这里需要了解一下TaskLauncher线程类，在TaskTracker中创建了2个TaskLauncher线程，一个是为</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1418.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：TaskTracker设计要点概要分析</title>
		<link>http://shiyanjun.cn/archives/1408.html</link>
		<comments>http://shiyanjun.cn/archives/1408.html#comments</comments>
		<pubDate>Sun, 13 Dec 2015 08:23:51 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1408</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
本文不打算深入地详细分析TaskTracker某个具体的处理流程，而是概要地分析TaskTracker在MapReduce框架中的主要负责处理那些事情，是我们能够在宏观上了解TaskTracker端都做了哪些工作。我尽量将TaskTracker端的全部要点内容提出来，但是涉及到详细的分析，只是点到为止，后续会对相应模块的处理流程结合代码进行分析。
TaskTracker主要负责MapReduce计算集群中Task运行的管理，所以TaskTracker要管理的事情比较多。一个MapReduce Job由很多的Task组成，而一个Job的所有Task被分成几个相斥的子集，每个子集被分配到某一个TaskTracker上去运行，所以一个TaskTracker管理运行了一个Job的所有Task的一个子集，也就是说TaskTracker不仅要维护每个Job对应的一个Task的子集，还要维护这些Task所属的Job的运行状态，对于Job/Task的状态的管理都是与JobTracker通过RPC通信保持状态的同步。
下面是TaskTracker端的主要组件，如下图所示：

为了了解TaskTracker中各个组件都负责处理哪些工作，我们通过下表来简要地说明各</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
本文不打算深入地详细分析TaskTracker某个具体的处理流程，而是概要地分析TaskTracker在MapReduce框架中的主要负责处理那些事情，是我们能够在宏观上了解TaskTracker端都做了哪些工作。我尽量将TaskTracker端的全部要点内容提出来，但是涉及到详细的分析，只是点到为止，后续会对相应模块的处理流程结合代码进行分析。
TaskTracker主要负责MapReduce计算集群中Task运行的管理，所以TaskTracker要管理的事情比较多。一个MapReduce Job由很多的Task组成，而一个Job的所有Task被分成几个相斥的子集，每个子集被分配到某一个TaskTracker上去运行，所以一个TaskTracker管理运行了一个Job的所有Task的一个子集，也就是说TaskTracker不仅要维护每个Job对应的一个Task的子集，还要维护这些Task所属的Job的运行状态，对于Job/Task的状态的管理都是与JobTracker通过RPC通信保持状态的同步。
下面是TaskTracker端的主要组件，如下图所示：

为了了解TaskTracker中各个组件都负责处理哪些工作，我们通过下表来简要地说明各</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
本文不打算深入地详细分析TaskTracker某个具体的处理流程，而是概要地分析TaskTracker在MapReduce框架中的主要负责处理那些事情，是我们能够在宏观上了解TaskTracker端都做了哪些工作。我尽量将TaskTracker端的全部要点内容提出来，但是涉及到详细的分析，只是点到为止，后续会对相应模块的处理流程结合代码进行分析。
TaskTracker主要负责MapReduce计算集群中Task运行的管理，所以TaskTracker要管理的事情比较多。一个MapReduce Job由很多的Task组成，而一个Job的所有Task被分成几个相斥的子集，每个子集被分配到某一个TaskTracker上去运行，所以一个TaskTracker管理运行了一个Job的所有Task的一个子集，也就是说TaskTracker不仅要维护每个Job对应的一个Task的子集，还要维护这些Task所属的Job的运行状态，对于Job/Task的状态的管理都是与JobTracker通过RPC通信保持状态的同步。
下面是TaskTracker端的主要组件，如下图所示：

为了了解TaskTracker中各个组件都负责处理哪些工作，我们通过下表来简要地说明各</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1408.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：JobTracker处理Heartbeat流程分析</title>
		<link>http://shiyanjun.cn/archives/1306.html</link>
		<comments>http://shiyanjun.cn/archives/1306.html#comments</comments>
		<pubDate>Fri, 20 Nov 2015 13:46:01 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1306</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。这篇文章的内容，更多地主要是描述处理/交互流程性的东西，大部分流程图都是经过我梳理后画出来的（开始我打算使用序列图来描述流程，但是发现很多流程在单个对象内部都已经非常复杂，想要通过序列图表达有点担心描述不清，所以选择最基本的程序流程图），可能看起来比较枯燥，重点还是关注主要的处理流程要点，特别的地方我会刻意标示出来，便于理解。
JobTracker与TaskTracker之间通过org.apache.hadoop.mapred.InterTrackerProtocol协议来进行通信，TaskTracker通过该接口进行远程调用实现Heartbeat消息的发送，协议方法定义如下所示：
通过该方法可以看出，最核心的Heartbeat报告数据都封装在TaskTrackerStatus对象中，JobTracker端会接收TaskTracker周期性地发送的心跳报告，根据这些心跳信息来更新整个Hadoop集群中计算资源的状态/数量，以及Task的运行状态。
另外，在JobTracker端维护的对象的数据结构，主要包括如下3个：

TaskTracker：这个类是在JobTracker端定义的，描述了TaskTracker的基本信息和</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。这篇文章的内容，更多地主要是描述处理/交互流程性的东西，大部分流程图都是经过我梳理后画出来的（开始我打算使用序列图来描述流程，但是发现很多流程在单个对象内部都已经非常复杂，想要通过序列图表达有点担心描述不清，所以选择最基本的程序流程图），可能看起来比较枯燥，重点还是关注主要的处理流程要点，特别的地方我会刻意标示出来，便于理解。
JobTracker与TaskTracker之间通过org.apache.hadoop.mapred.InterTrackerProtocol协议来进行通信，TaskTracker通过该接口进行远程调用实现Heartbeat消息的发送，协议方法定义如下所示：

  HeartbeatResponse heartbeat(TaskTrackerStatus status,
                              boolean restarted,
                              boolean initialContact,
                              boolean acceptNewTasks,
                              short responseId) throws IOException;

通过该方法可以看出，最核心的Heartbeat报告数据都封装在Ta</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。这篇文章的内容，更多地主要是描述处理/交互流程性的东西，大部分流程图都是经过我梳理后画出来的（开始我打算使用序列图来描述流程，但是发现很多流程在单个对象内部都已经非常复杂，想要通过序列图表达有点担心描述不清，所以选择最基本的程序流程图），可能看起来比较枯燥，重点还是关注主要的处理流程要点，特别的地方我会刻意标示出来，便于理解。
JobTracker与TaskTracker之间通过org.apache.hadoop.mapred.InterTrackerProtocol协议来进行通信，TaskTracker通过该接口进行远程调用实现Heartbeat消息的发送，协议方法定义如下所示：
通过该方法可以看出，最核心的Heartbeat报告数据都封装在TaskTrackerStatus对象中，JobTracker端会接收TaskTracker周期性地发送的心跳报告，根据这些心跳信息来更新整个Hadoop集群中计算资源的状态/数量，以及Task的运行状态。
另外，在JobTracker端维护的对象的数据结构，主要包括如下3个：

TaskTracker：这个类是在JobTracker端定义的，描述了TaskTracker的基本信息和</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1306.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：JobTracker端Job/Task数据结构</title>
		<link>http://shiyanjun.cn/archives/1228.html</link>
		<comments>http://shiyanjun.cn/archives/1228.html#comments</comments>
		<pubDate>Tue, 27 Oct 2015 13:28:39 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1228</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。在MapReduce程序运行的过程中，JobTracker端会在内存中维护一些与Job/Task运行相关的信息，了解这些内容对分析MapReduce程序执行流程的源码会非常有帮助。
在编写MapReduce程序时，我们是以Job为单位进行编程处理，一个应用程序可能由一组Job组成，而MapReduce框架给我们暴露的只是一些Map和Reduce的函数接口，在运行期它会构建对应MapTask和ReduceTask，所以我们知道一个Job是由一个或多个MapTask，以及0个或1个ReduceTask组成。而对于MapTask，它是根据输入的数据文件的的逻辑分片（InputSplit）而定的，通常有多少个分片就会有多少个MapTask；而对于ReduceTask，它会根据我们编写的MapReduce程序配置的个数来运行。
有了这些信息，我们能够预想到，在Job运行过程中，无非也需要维护与这些Job/Task相关的一些状态信息，通过一定的调度策略来管理Job/Task的运行。这里，我们主要关注JobTracker端的一些非常有用的数据结构：JobTracker、JobInProgress、TaskInProgress，来熟悉各种数据结构的定义及作用。
数据</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。在MapReduce程序运行的过程中，JobTracker端会在内存中维护一些与Job/Task运行相关的信息，了解这些内容对分析MapReduce程序执行流程的源码会非常有帮助。
在编写MapReduce程序时，我们是以Job为单位进行编程处理，一个应用程序可能由一组Job组成，而MapReduce框架给我们暴露的只是一些Map和Reduce的函数接口，在运行期它会构建对应MapTask和ReduceTask，所以我们知道一个Job是由一个或多个MapTask，以及0个或1个ReduceTask组成。而对于MapTask，它是根据输入的数据文件的的逻辑分片（InputSplit）而定的，通常有多少个分片就会有多少个MapTask；而对于ReduceTask，它会根据我们编写的MapReduce程序配置的个数来运行。
有了这些信息，我们能够预想到，在Job运行过程中，无非也需要维护与这些Job/Task相关的一些状态信息，通过一定的调度策略来管理Job/Task的运行。这里，我们主要关注JobTracker端的一些非常有用的数据结构：JobTracker、JobInProgress、TaskInProgress，来熟悉各种数据结构的定义及作用。
数据</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。在MapReduce程序运行的过程中，JobTracker端会在内存中维护一些与Job/Task运行相关的信息，了解这些内容对分析MapReduce程序执行流程的源码会非常有帮助。
在编写MapReduce程序时，我们是以Job为单位进行编程处理，一个应用程序可能由一组Job组成，而MapReduce框架给我们暴露的只是一些Map和Reduce的函数接口，在运行期它会构建对应MapTask和ReduceTask，所以我们知道一个Job是由一个或多个MapTask，以及0个或1个ReduceTask组成。而对于MapTask，它是根据输入的数据文件的的逻辑分片（InputSplit）而定的，通常有多少个分片就会有多少个MapTask；而对于ReduceTask，它会根据我们编写的MapReduce程序配置的个数来运行。
有了这些信息，我们能够预想到，在Job运行过程中，无非也需要维护与这些Job/Task相关的一些状态信息，通过一定的调度策略来管理Job/Task的运行。这里，我们主要关注JobTracker端的一些非常有用的数据结构：JobTracker、JobInProgress、TaskInProgress，来熟悉各种数据结构的定义及作用。
数据</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1228.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：Job提交流程之JobTracker端分析</title>
		<link>http://shiyanjun.cn/archives/1210.html</link>
		<comments>http://shiyanjun.cn/archives/1210.html#comments</comments>
		<pubDate>Sat, 17 Oct 2015 09:34:37 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1210</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。
上一篇我们分析了Job提交过程中JobClient端的处理流程（详见文章 MapReduce V1：Job提交流程之JobClient端分析），这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现，这部分的处理逻辑还是有点复杂，经过梳理，更加细化清晰的流程，如下图所示：

上图中主要分为两大部分：一部分是JobClient基于RPC调用提交Job到JobTracker后，在JobTracker端触发TaskScheduler所注册的一系列Listener进行Job信息初始化；另一部分是JobTracker端监听Job队列的线程，监听到Job状态发生变更触发一系列Listener更新状态。我们从这两个方面展开分析：
JobTracker接收Job提交
JobTracker接收到JobClient提交的Job，在JobTracker端具体执行流程，描述如下：

JobClient基于JobSubmissionProtocol协议远程调用JobTracker的s</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。
上一篇我们分析了Job提交过程中JobClient端的处理流程（详见文章 MapReduce V1：Job提交流程之JobClient端分析），这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现，这部分的处理逻辑还是有点复杂，经过梳理，更加细化清晰的流程，如下图所示：

上图中主要分为两大部分：一部分是JobClient基于RPC调用提交Job到JobTracker后，在JobTracker端触发TaskScheduler所注册的一系列Listener进行Job信息初始化；另一部分是JobTracker端监听Job队列的线程，监听到Job状态发生变更触发一系列Listener更新状态。我们从这两个方面展开分析：
JobTracker接收Job提交
JobTracker接收到JobClient提交的Job，在JobTracker端具体执行流程，描述如下：

JobClient基于JobSubmissionProtocol协议远程调用JobTracker的s</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。
上一篇我们分析了Job提交过程中JobClient端的处理流程（详见文章 MapReduce V1：Job提交流程之JobClient端分析），这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现，这部分的处理逻辑还是有点复杂，经过梳理，更加细化清晰的流程，如下图所示：

上图中主要分为两大部分：一部分是JobClient基于RPC调用提交Job到JobTracker后，在JobTracker端触发TaskScheduler所注册的一系列Listener进行Job信息初始化；另一部分是JobTracker端监听Job队列的线程，监听到Job状态发生变更触发一系列Listener更新状态。我们从这两个方面展开分析：
JobTracker接收Job提交
JobTracker接收到JobClient提交的Job，在JobTracker端具体执行流程，描述如下：

JobClient基于JobSubmissionProtocol协议远程调用JobTracker的s</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1210.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MapReduce V1：Job提交流程之JobClient端分析</title>
		<link>http://shiyanjun.cn/archives/1200.html</link>
		<comments>http://shiyanjun.cn/archives/1200.html#comments</comments>
		<pubDate>Wed, 30 Sep 2015 06:46:24 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop-1.2.1]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1200</guid>
		<description><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。下图是《Hadoop权威指南》一书给出的MapReduce V1处理Job的抽象流程图：

如上图，我们展开阴影部分的处理逻辑，详细分析Job提交在JobClient端的具体流程。
在编写好MapReduce程序以后，需要将Job提交给JobTracker，那么我们就需要了解在提交Job的过程中，在JobClient端都做了哪些工作，或者说执行了哪些处理。在JobClient端提交Job的处理流程，如下图所示：

上图所描述的Job的提交流程，说明如下所示：

在MR程序中创建一个Job实例，设置Job状态
创建一个JobClient实例，准备将创建的Job实例提交到JobTracker
在创建JobClient的过程中，首先必须保证建立到JobTracker的RPC连接
基于JobSubmissionProtocol协议远程调用JobTracker获取一个新的Job ID
根据MR程序中配置的Job，在HDFS上创建Job相关目录，并将配置的tmpfiles、tmpja</p>]]></description>
	<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。下图是《Hadoop权威指南》一书给出的MapReduce V1处理Job的抽象流程图：

如上图，我们展开阴影部分的处理逻辑，详细分析Job提交在JobClient端的具体流程。
在编写好MapReduce程序以后，需要将Job提交给JobTracker，那么我们就需要了解在提交Job的过程中，在JobClient端都做了哪些工作，或者说执行了哪些处理。在JobClient端提交Job的处理流程，如下图所示：

上图所描述的Job的提交流程，说明如下所示：

在MR程序中创建一个Job实例，设置Job状态
创建一个JobClient实例，准备将创建的Job实例提交到JobTracker
在创建JobClient的过程中，首先必须保证建立到JobTracker的RPC连接
基于JobSubmissionProtocol协议远程调用JobTracker获取一个新的Job ID
根据MR程序中配置的Job，在HDFS上创建Job相关目录，并将配置的tmpfiles、tmpja</p>			<content:encoded><![CDATA[<p>我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
MapReduce V1实现中，主要存在3个主要的分布式进程（角色）：JobClient、JobTracker和TaskTracker，我们主要是以这三个角色的实际处理活动为主线，并结合源码，分析实际处理流程。下图是《Hadoop权威指南》一书给出的MapReduce V1处理Job的抽象流程图：

如上图，我们展开阴影部分的处理逻辑，详细分析Job提交在JobClient端的具体流程。
在编写好MapReduce程序以后，需要将Job提交给JobTracker，那么我们就需要了解在提交Job的过程中，在JobClient端都做了哪些工作，或者说执行了哪些处理。在JobClient端提交Job的处理流程，如下图所示：

上图所描述的Job的提交流程，说明如下所示：

在MR程序中创建一个Job实例，设置Job状态
创建一个JobClient实例，准备将创建的Job实例提交到JobTracker
在创建JobClient的过程中，首先必须保证建立到JobTracker的RPC连接
基于JobSubmissionProtocol协议远程调用JobTracker获取一个新的Job ID
根据MR程序中配置的Job，在HDFS上创建Job相关目录，并将配置的tmpfiles、tmpja</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1200.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Pig简介与实践</title>
		<link>http://shiyanjun.cn/archives/1154.html</link>
		<comments>http://shiyanjun.cn/archives/1154.html#comments</comments>
		<pubDate>Sat, 25 Jul 2015 07:19:45 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Pig]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1154</guid>
		<description><![CDATA[<p>Apache Pig是一个用来分析大数据集的平台，它由两部分组成：一部分是用于表达数据分析程序的高级脚本语言，另一部分是用于评估分析程序的基本工具。目前来看，Pig主要用于离线数据的批量处理应用场景，但是随着Pig的发展处理数据的速度会不断地提升，这可能依赖于Pig底层的执行引擎。比如，Pig通过指定执行模式，可以使用Hadoop的MapReduce计算引擎来实现数据处理，也可以使用基于Tez的计算引擎来实现（Tez是为了绕开MapReduce多阶段Job写磁盘而设计的DAG计算引擎，性能应该比MapReduce要快），看到Pig未来的发展路线图，以后可能会基于Storm或Spark计算平台实现底层计算引擎，那样速度会有极大地提升。
我们基于最新的0.15.0版本的Pig（Hadoop使用的是2.2.0版本），通过编写一些例子脚本来实践Pig的语言特性。
Pig安装与执行
Pig安装非常简单，只需要下载Pig包，然后解压缩即可：
如果希望直接使用pig命令，可以修改环境变量文件~/.bashrc，增加如下配置：
使变量配置生效：
Pig支持如下4种执行模式：

本地模式

本地模式主要是基于本地文件系统，比较适合调试脚本</p>]]></description>
	<p>Apache Pig是一个用来分析大数据集的平台，它由两部分组成：一部分是用于表达数据分析程序的高级脚本语言，另一部分是用于评估分析程序的基本工具。目前来看，Pig主要用于离线数据的批量处理应用场景，但是随着Pig的发展处理数据的速度会不断地提升，这可能依赖于Pig底层的执行引擎。比如，Pig通过指定执行模式，可以使用Hadoop的MapReduce计算引擎来实现数据处理，也可以使用基于Tez的计算引擎来实现（Tez是为了绕开MapReduce多阶段Job写磁盘而设计的DAG计算引擎，性能应该比MapReduce要快），看到Pig未来的发展路线图，以后可能会基于Storm或Spark计算平台实现底层计算引擎，那样速度会有极大地提升。
我们基于最新的0.15.0版本的Pig（Hadoop使用的是2.2.0版本），通过编写一些例子脚本来实践Pig的语言特性。
Pig安装与执行
Pig安装非常简单，只需要下载Pig包，然后解压缩即可：

wget http://mirror.bit.edu.cn/apache/pig/pig-0.15.0/pig-0.15.0.tar.gz
tar xvzf pig-0.15.0.tar.gz
sudo ln -s /usr/local/pig-0.15.0 /usr/local/pig
cd /usr/local/pig
bi</p>			<content:encoded><![CDATA[<p>Apache Pig是一个用来分析大数据集的平台，它由两部分组成：一部分是用于表达数据分析程序的高级脚本语言，另一部分是用于评估分析程序的基本工具。目前来看，Pig主要用于离线数据的批量处理应用场景，但是随着Pig的发展处理数据的速度会不断地提升，这可能依赖于Pig底层的执行引擎。比如，Pig通过指定执行模式，可以使用Hadoop的MapReduce计算引擎来实现数据处理，也可以使用基于Tez的计算引擎来实现（Tez是为了绕开MapReduce多阶段Job写磁盘而设计的DAG计算引擎，性能应该比MapReduce要快），看到Pig未来的发展路线图，以后可能会基于Storm或Spark计算平台实现底层计算引擎，那样速度会有极大地提升。
我们基于最新的0.15.0版本的Pig（Hadoop使用的是2.2.0版本），通过编写一些例子脚本来实践Pig的语言特性。
Pig安装与执行
Pig安装非常简单，只需要下载Pig包，然后解压缩即可：
如果希望直接使用pig命令，可以修改环境变量文件~/.bashrc，增加如下配置：
使变量配置生效：
Pig支持如下4种执行模式：

本地模式

本地模式主要是基于本地文件系统，比较适合调试脚本</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1154.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadoop YARN架构设计要点</title>
		<link>http://shiyanjun.cn/archives/1119.html</link>
		<comments>http://shiyanjun.cn/archives/1119.html#comments</comments>
		<pubDate>Mon, 01 Jun 2015 14:57:15 +0000</pubDate>
		<dc:creator><![CDATA[Yanjun]]></dc:creator>
				<category><![CDATA[Hadoop/Hive/ZooKeeper]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[Hadoop2]]></category>
		<category><![CDATA[YARN]]></category>

		<guid isPermaLink="false">http://shiyanjun.cn/?p=1119</guid>
		<description><![CDATA[<p>YARN是开源项目Hadoop的一个资源管理系统，最初设计是为了解决Hadoop中MapReduce计算框架中的资源管理问题，但是现在它已经是一个更加通用的资源管理系统，可以把MapReduce计算框架作为一个应用程序运行在YARN系统之上，通过YARN来管理资源。如果你的应用程序也需要借助YARN的资源管理功能，你也可以实现YARN提供的编程API，将你的应用程序运行于YARN之上，将资源的分配与回收统一交给YARN去管理，可以大大简化资源管理功能的开发。当前，也有很多应用程序已经可以构建于YARN之上，如Storm、Spark等计算框架。
YARN整体架构
YARN是基于Master/Slave模式的分布式架构，我们先看一下，YARN的架构设计，如图所示（来自官网文档）：

上图，从逻辑上定义了YARN系统的核心组件和主要交互流程，各个组件说明如下：

YARN Client

YARN Client提交Application到RM，它会首先创建一个Application上下文件对象，并设置AM必需的资源请求信息，然后提交到RM。YARN Client也可以与RM通信，获取到一个已经提交并运行的Application的状态信息等，具体详见后面ApplicationClientPro</p>]]></description>
	<p>YARN是开源项目Hadoop的一个资源管理系统，最初设计是为了解决Hadoop中MapReduce计算框架中的资源管理问题，但是现在它已经是一个更加通用的资源管理系统，可以把MapReduce计算框架作为一个应用程序运行在YARN系统之上，通过YARN来管理资源。如果你的应用程序也需要借助YARN的资源管理功能，你也可以实现YARN提供的编程API，将你的应用程序运行于YARN之上，将资源的分配与回收统一交给YARN去管理，可以大大简化资源管理功能的开发。当前，也有很多应用程序已经可以构建于YARN之上，如Storm、Spark等计算框架。
YARN整体架构
YARN是基于Master/Slave模式的分布式架构，我们先看一下，YARN的架构设计，如图所示（来自官网文档）：

上图，从逻辑上定义了YARN系统的核心组件和主要交互流程，各个组件说明如下：

YARN Client

YARN Client提交Application到RM，它会首先创建一个Application上下文件对象，并设置AM必需的资源请求信息，然后提交到RM。YARN Client也可以与RM通信，获取到一个已经提交并运行的Application的状态信息等，具体详见后面ApplicationClientPro</p>			<content:encoded><![CDATA[<p>YARN是开源项目Hadoop的一个资源管理系统，最初设计是为了解决Hadoop中MapReduce计算框架中的资源管理问题，但是现在它已经是一个更加通用的资源管理系统，可以把MapReduce计算框架作为一个应用程序运行在YARN系统之上，通过YARN来管理资源。如果你的应用程序也需要借助YARN的资源管理功能，你也可以实现YARN提供的编程API，将你的应用程序运行于YARN之上，将资源的分配与回收统一交给YARN去管理，可以大大简化资源管理功能的开发。当前，也有很多应用程序已经可以构建于YARN之上，如Storm、Spark等计算框架。
YARN整体架构
YARN是基于Master/Slave模式的分布式架构，我们先看一下，YARN的架构设计，如图所示（来自官网文档）：

上图，从逻辑上定义了YARN系统的核心组件和主要交互流程，各个组件说明如下：

YARN Client

YARN Client提交Application到RM，它会首先创建一个Application上下文件对象，并设置AM必需的资源请求信息，然后提交到RM。YARN Client也可以与RM通信，获取到一个已经提交并运行的Application的状态信息等，具体详见后面ApplicationClientPro</p>]]></content:encoded>
			<wfw:commentRss>http://shiyanjun.cn/archives/1119.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
