这篇来说道说道job在到达Job Tracker后会有哪些动作,涉及上篇job生命周期的第五步和第六步。因为job在初始化后紧接着需要应付Job Tracker对Task Tracker的task分发响应,所以我们从Job Tracker的分发过程倒着来看job初始化。
Task Tracker在运行时会周期性地向Job Tracker发送心跳请求,汇报Task Tracker的状态数据、本Task Tracker上task执行状态及希望从Job Tracker得到可以执行的task来做。在这里再得明确下task的概念。Task是job的基本单元,由Job Tracker分发到Task Tracker来执行。task分为两类: map task与reduce task。map task处理输入数据,它就应该是输入数据、job相关信息等组成的对象;reduce task汇总map task的输出结果,最后生成job的输出,它也应是由job相关信息组成。task是在Task Tracker上执行,所以task需要的信息须与Job Tracker的状态信息有关,以便task执行时需要。
在前一节Job提交过程中说到,job将所有输入数据组装成了逻辑分片,这些逻辑分片只是HDFS上物理数据block的索引及存储信息。map task依赖于这些信息来决定将task分发到哪些Task Tracker上。Job Tracker可以取到job相关的metadata信息,然后由这些信息来决定如何分发task。因此,上一节的这些分片的相关信息就存放在特定的目录下,Job Tracker通过jobId可以访问到。
Reduce task不管在哪个Task Tracker上执行,都得从其它那些执行map task的Task Tracker上拉取数据,所以对它的分发Job Tracker不需要准备什么,只要在合适的时候放到某台Task Tracker上执行即可。Job Tracker主要还是关注map task的准备工作(Reduce task并不是从所有map task拉取临时数据。如果有多个reduce task的话,每个reduce task只拉取一部分map task的临时数据。关于partition等相关的细节以后会说到)。
这里介绍Job Tracker分发task过程中比较重要的一步:data locality级别。map task的执行效率依赖于读取输入数据的效率。输入数据越靠近执行task的Task Tracker,map task就执行的越快。根据数据所处的位置与Task Tracker的距离,有如下几种data locality级别:
引用
0 node-local 输入分片就在Task Tracker本地
1 rack-local 输入分片在Task Tracker所在的rack内其它Task Tracker上
2 off-switch 输入分片在其它的rack内
Job Tracker在task分发时应充分考虑data locality级别。分发策略对job执行效率的影响很大程度是如何优化map task的locality。
Job Tracker可以从job的metadata中得到并维护这样一种映射关系:job split ----> HDFS block && slave node。这种映射关系就是生成map task的基础。有多少个split,就会有map task。如上所述,响应心跳而选择map task的处理就像这样:
1. 根据Task Tracker的机器,查看Job Tracker中是否存在一个map task,它关联的block(假设一个block划分为一个split)存储在Task Tracker的本地磁盘上,那么就优先执行这个map task。
2. 如果没有1可选的map task,那么查看是否有map关联的block在Task Tracker所在的rack内。
3. 如果上面两步都没有选到某个map task,那么就根据情况看是否执行跨rack的task或其它推测式执行task。
初始化的基本工作就很少一些,主要的选择逻辑还是task scheduler应该做的事情。既然提到Scheduler,还得说MapReduce默认的JobQueue scheduler在理论上有个严重的问题。如果它没有从1或2中选取到map task,那么它就会执行某个跨rack的map task。理想情况下应该尽量避免这样做,当前的Task Tracker本地或rack内不存在task所需的split,但其它rack内的Task Tracker上肯定会存在那个split的,那个有split存在的Task Tracker之后也会从Job Tracker取task,把这种map task放到有数据的Task Tracker上做肯定比跨rack取数据快。所以如果可能的话,尽量按照实际情况选取合适的scheduler(以上之所以是理论,也是因为大部分的执行环境都没有与rack有关物理拓扑结构)。
Scheduler还得注意的一点是,当用户开启task推测式执行,那推测式执行就会发生在Job Tracker意识到某个task执行效率低的时候,尽量要让推测式task是node local级别的。如果推测式task要跨rack取数据,比原来的task执行还慢,就没有现实意义了。
Job初始化过程主要是在Job Tracker建立一个slave node对task的映射模型,其它都是附属工作。我会把job生命周期的重点放在task执行的过程,也就是那个“奇迹发生的地方”。To be continued...
- 大小: 50.3 KB
分享到:
相关推荐
- `jobContext` 和 `taskContext`:保存Job和Task的上下文信息。 - `committer`:定制与Task生命周期相关的特殊处理,如提交任务。 - `outputFormat`:定义任务的输出格式。 - `spilledRecordsCounter`, `task...
4. 初始化Hadoop环境:输入命令【hadoop4win-init】,此命令将会进行JDK与Hadoop解压缩动作,最后将执行Hadoop Namenode的格式化。 5. 启动Hadoop服务:按下任意键,会依次启动Hadoop Name Node,Data Node,Job ...
1. 初始化NameNode:运行`hadoop namenode -format`。 2. 启动DataNodes、NameNode、Secondary NameNode。 3. 启动ResourceManager、NodeManager、JobHistory Server。 4. 配置 slaves 文件,列出所有的DataNode节点...
- 初始化HDFS:在Namenode上执行`hadoop namenode -format`来格式化HDFS。 - 启动Hadoop服务:通过`start-dfs.sh`和`start-mapred.sh`启动Hadoop的HDFS和MapReduce服务。 至此,Hadoop的分布式环境已经准备就绪,...
- 在启动Hadoop集群之前,需要对名称节点进行一次性的格式化操作,这将初始化HDFS的元数据。 5. **启动和停止集群** - **启动**:通过执行相应的脚本启动namenode、datanode、jobtracker和tasktracker。 - **...
- `<name>mapred.job.tracker</name>`:这是JobTracker的地址,设置为`localhost:9001`,意味着JobTracker也在本地主机的9001端口运行。 完成以上配置后,你需要对HDFS进行初始化,即“格式化”NameNode。在命令行...
启动Hadoop服务之前,需要初始化HDFS和YARN。打开命令提示符,使用以下命令: ``` hadoop namenode -format start-dfs.cmd start-yarn.cmd ``` 至此,Hadoop已经启动,可以在Windows上运行了。为了在Eclipse中开发...
- **初始化和启动**:在Master节点上格式化NameNode,然后在所有节点上启动Hadoop服务。 4. **注意事项** - **IP与主机名**:确保所有机器间的网络连接正常,主机名解析正确,可以通过`/etc/hosts`文件进行配置。...
安装Hadoop到所有奴隶节点后,需要进行初始化和启动操作。使用`hadoop namenode -format`对HDFS进行格式化,这是首次启动前必须执行的步骤。然后通过`./start-all.sh`脚本启动所有Hadoop服务。 验证Hadoop是否正常...
使用以下命令初始化HDFS: ```bash bin/hadoop namenode -format ``` 6. **启动Hadoop服务**: 启动所有Hadoop服务: ```bash bin/start-all.sh ``` 7. **验证Hadoop是否启动成功**: 通过浏览器...
- **mapred-site.xml**: 设置`mapred.job.tracker`为你虚拟机的IP(192.168.116.128:9001),这是JobTracker的地址。 **5. 配置环境变量** 将Hadoop和Java的路径添加到系统环境变量中,通常在`/etc/profile`文件中...
最后,在 `mapred-site.xml` 文件中,配置 JobTracker 地址,如 `<name>mapred.job.tracker</name> <value>localhost:9001</value>`。 完成配置后,需要对 NameNode 进行格式化,以初始化 HDFS 文件系统。在 `/usr/...
而在`mapred-site.xml`中,指定JobTracker的地址(`mapred.job.tracker`)。 完成配置后,执行**格式化NameNode**,这是首次启动Hadoop集群的必要步骤,用以初始化HDFS文件系统: ```bash cd /opt/hadoop source ...
此命令会格式化HDFS,为集群初始化做准备。 **2. 启动 HDFS 和 MapReduce 服务** bin/start-dfs.sh bin/start-mapred.sh 执行以上命令分别启动HDFS和MapReduce服务。 **3. 查看进程** jps 使用 `jps` 命令...
初始化Hadoop** - 使用 `hadoop namenode -format` 对名称节点进行格式化。 - 切换到 `hadoop/bin` 目录,运行 `start-all.sh` 启动所有Hadoop服务。 - 使用 `jps` 查看服务状态,正常情况下应显示 `JobTracker`, `...