Hadoop中有个参数是mapred.job.reuse.jvm.num.tasks(hadoop2 为:mapreduce.job.jvm.numtasks),默认是1,表示一个JVM上最多可以顺序执行的task数目(属于同一个Job)是1。也就是说一个task启一个JVM。
比如我配的是每个slave节点最多同时运行8个map和8个reduce。那么在map阶段,slave节点会启动最多8个JVM用于map。如下:
root@slave1:~# jps
28291 Child
28290 Child
28281 Child
28293 Child
28277 Child
1487 DataNode
28298 Child
28273 Child
28272 Child
1636 TaskTracker
28799 Jps
root@slave1:~# ps -e | grep java
1487 ? 00:53:26 java |
TaskTracker |
1636 ? 00:12:42 java |
DataNode |
28272 ? 00:00:35 java |
Child |
28273 ? 00:00:35 java |
Child |
28277 ? 00:00:36 java |
Child |
28281 ? 00:00:36 java |
Child |
28290 ? 00:00:36 java |
Child |
28291 ? 00:00:37 java |
Child |
28293 ? 00:00:36 java |
Child |
28298 ? 00:00:36 java |
Child |
其中前两个是固定的进程。
为每个task启动一个新的JVM将耗时1秒左右,对于运行时间较长(比如1分钟以上)的job影响不大,但如果都是时间很短的task,那么频繁启停JVM会有开销。
如果我们想使用JVM重用技术来提高性能,那么可以将mapred.job.reuse.jvm.num.tasks设置成大于1的数。这表示属于同一job的顺序执行的task可以共享一个JVM,也就是说第二轮的map可以重用前一轮的JVM,而不是第一轮结束后关闭JVM,第二轮再启动新的JVM。
那么最多一个JVM能顺序执行多少个task才关闭呢?这个值就是mapred.job.reuse.jvm.num.tasks。如果设置成-1,那么只要是同一个job的task(无所谓多少个),都可以按顺序在一个JVM上连续执行。
如果task属于不同的job,那么JVM重用机制无效,不同job的task需要不同的JVM来运行。
注意:
JVM重用技术不是指同一Job的两个或两个以上的task可以同时运行于同一JVM上,而是排队按顺序执行。
一个tasktracker最多可以同时运行的task数目由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum
决定,并且这两个参数在mapred-site.xml中设置。其他方法,如在JobClient端通过命令行
-Dmapred.tasktracker.map.tasks.maximum=number或者conf.set("mapred.tasktracker.map.tasks.maximum","number")设置都是无效的。
附《Hadoop权威指南》上的介绍:
Task JVM Reuse
Hadoop runs tasks in their own Java Virtual Machine to isolate them from other running tasks. The overhead of starting a new JVM for each task can take around a second, which for jobs that run for a minute or so is insignificant. However, jobs that have a large number of very short-lived tasks (these are usually map tasks), or that have lengthy initialization, can see performance gains when the JVM is reused for subsequent tasks.
With task JVM reuse enabled, tasks do not run concurrently in a single JVM. The JVM runs tasks sequentially. Tasktrackers can, however, run more than one task at a time, but this is always done in separate JVMs. The properties for controlling the tasktrackers number of map task slots and reduce task slots are discussed in “Memory” on page 269.
The property for controlling task JVM reuse is mapred.job.reuse.jvm.num.tasks: it specifies the maximum number of tasks to run for a given job for each JVM launched; the default is 1 (see Table 6-4). Tasks from different jobs are always run in separate JVMs. If the property is set to –1, there is no limit to the number of tasks from the same job that may share a JVM. The methodsetNumTasksToExecutePerJvm() on JobConf can also be used to configure this property.
Tasks that are CPU-bound may also benefit from task JVM reuse by taking advantage of runtime optimizations applied by the HotSpot JVM. After running for a while, the HotSpot JVM builds up enough information to detect performance-critical sections in the code and dynamically translates the Java byte codes of these hot spots into native machine code. This works well for long-running processes, but JVMs that run for seconds or a few minutes may not gain the full benefit of HotSpot. In these cases, it is worth enabling task JVM reuse.
Another place where a shared JVM is useful is for sharing state between the tasks of a job. By storing reference data in a static field, tasks get rapid access to the shared data.
相关推荐
解决方案包括移除Spring,开启JVM重用,使用LZO压缩,增加reduce并行复制线程数。 - 事故三:DataNode大面积故障。原因是交换机模块故障和DN内存不足。解决策略是升级到CDH3u4并增大DN内存至2GB。 6. **压缩与...
重用JVM 跳过坏记录 任务执行环境 第7章 MapReduce的类型与格式 MapReduce的类型 默认的MapReduce作业 输入格式 输入分片与记录 文本输入 二进制输入 多种输入 数据库输入(和输出) 输出格式...
本章还详细介绍了Shuffle和排序过程、任务执行环境、推测执行、输出提交器、任务JVM重用和跳过不良记录。 第七章讨论了MapReduce类型和格式,介绍了默认的MapReduce作业类型、输入和输出格式(包括文本、二进制、...
6. **JVM重用** - **mapreduce.task.jvm.numtasks**:设置每个JVM执行的任务数量,重用JVM可以减少启动时间,但过多可能导致内存不足。 7. **Reduce侧优化** - **io.sort.factor**和**io.sort.mb**:在Reduce阶段...
重用JVM 跳过坏记录 任务执行环境 第7章 MapReduce的类型与格式 MapReduce的类型 默认的MapReduce作业 输入格式 输入分片与记录 文本输入 二进制输入 多种输入 数据库输入(和输出) 输出格式 文本输出 二进制输出 ...
- **JVM重用机制**:通过设置`mapred.job.reuse.jvm.num.tasks`属性,可以在一个JVM中运行多个Map任务,以减少JVM的启动次数,从而节省资源。 - **优点**:减少JVM启动的开销,提高资源利用率。 **2. ...
此外,跳过环记录、JVM重用等优化技术也被提及,旨在提高资源利用率和处理效率。任务执行环境包括了子主题1和子主题2,虽然在给出的内容中没有具体说明,但可以推测涉及任务调度、资源管理等高级特性。 Hadoop I/O...
4. **推测执行和JVM重用**:这两种优化策略可以提高MapReduce的性能,通过预测任务可能的延迟并提前启动新的任务实例,以及复用已存在的JVM进程,减少资源浪费。 5. **Hadoop均衡器**:用于调整集群中数据的分布,...
例如,通过设置`mapred.job.reuse.jvm.num.tasks`属性,可以在同一个JVM中重用Map Task,以减少JVM的启动开销。此外,MultiFileInputSplit可以让一个Map Task处理多个输入split,进一步提高效率。 小文件产生的原因...
1286.3 性能调优 1296.3.1 通过combiner来减少网络流量 1296.3.2 减少输入数据量 1296.3.3 使用压缩 1296.3.4 重用JVM 1326.3.5 根据猜测执行来运行 1326.3.6 代码重构与算法重写 1336.4 小结 134第7章 细则手册 ...
3. **操作系统限制**:在某些操作系统中,如Windows,可能会有端口重用的延迟,即使原始进程已经结束,端口也可能在一段时间内不可用。 ### 解决方案 1. **检查并结束占用端口的进程**:你可以使用任务管理器...
- **重用JVM**:减少JVM启动开销,提高效率。 ### 安全性和监控 Hadoop支持安全模式,提供fsck工具进行文件系统检查,以及各种守护进程的配置管理,便于日常维护和监控。 ### 应用场景 Hadoop不仅适用于搜索引擎...
4. **JVM调优**:调整JVM参数,如堆大小、垃圾收集器类型等,以适应大数据处理的需要。 总结来说,Hive、Hadoop和Spark的优化涵盖了元数据、分区、内存、计算任务调度、网络传输、数据持久化等多个方面。通过这些...
- **重用JVM**:优化资源利用率,避免频繁创建和销毁JVM实例。 - **IDS(Input Descriptor Set)**:MapReduce作业的输入描述符。 - **输入格式和输出格式**:自定义数据输入和输出的类。 - **计数器**:跟踪...
- 启用JVM重用:设置**mapreduce.job.jvm.numtasks**,该参数指定单个JVM实例可以运行的Map或Reduce任务的数量。 - 根据作业的具体情况调整JVM重用策略。 综上所述,通过对Hive作业的各个阶段进行细致的调优,可以...
+ 开启 JVM 重用 5. Shuffle 及优化: * Shuffle 过程:Map -> Shuffle -> Reduce * 优化方法: + 增大环形缓冲区大小 + 增大环形缓冲区溢写的比例 + 减少对溢写文件的 merge 次数 + 采用 Combiner 提前...
此外,通过重用已经初始化好的JVM,可以避免频繁的JVM启动带来的开销,提高效率。用户可以配置单个JVM上能运行的最大任务数量,以平衡资源利用和任务并发。 在运行过程中,Hadoop系统可能会遇到DataNode上的block...