Hadoop集群上运行有多道MapReduce Job,到底每个Job消费集群计算资源(CPU,内存)的情况如何,通常我们是不知道的。这节来探讨下如果想获得这些信息,应该怎样做。
每个Job在运行时是散布在TaskTracker上,由不同的JVM来执行。所以这个问题归根结底就是想获取每个运行task的JVM对资源的消费情况。对于这种获取分布式环境数据的例子,就可以采用MapReduce框架自带的Counter机制,由它来采集各JVM运行期的实时数据,然后在Job结束后,做最终分析。
这项任务的意义在哪里?
正常情况下,Job会因为数据范围、服务的应用、数据量的大小及MapReduce逻辑的复杂程度等因素而被定义为不同的类别。当类别的概念形成后,我们就想知道每个类别Job对集群资源的使用情况是否符合预期,如果可以获得这些数据,就可以根据资源使用情况对Job的执行时间做相应的调整,以避免对其它Job的影响。
数据采集什么时候开始与结束?
我们的目标是分析每个子JVM的资源消耗情况,就应该在子JVM开始运行时介入收集。站在MapReduce框架外,只有一个地方可以作为介入点:Mapper和Reducer的setup方法。它的参数是task运行期Context,可以很方便地调用Counter。那我们的入口就可以像这样
public class ResourceCollectMapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
ChildJVMResourceCollector collector = null;
public void setup(Context context) {
collector = new ChildJVMResourceCollector(context);
collector.start();
}
}
资源收集器是一个独立线程,在setup方法中启动,在cleanup方法调用时结束。本来整个task的执行过程就包含在setup与cleanup之间,所以我们完全有机会收集这个过程中的资源利用情况。
如何获取运行task的JVM pid?
运行task的子JVM是由TaskTracker创建的,对用户完全透明。但幸运的是,TaskTrack在创建这个子JVM时,把它的pid作为参数传给了子JVM。获取的方式如下
private String getChildJVMPid() {
String pid = "";
if (!Shell.WINDOWS) {
pid = System.getenv().get("JVM_PID");
}
return pid;
}
怎样根据pid获取系统级的资源使用率?
得到当前子JVM的进程号后,就能用这个进程号查询Linux系统当前进程的资源使用情况。查询的方式网上很多资料都有说明
上图是通过ps命令查询某个进程的CPU与内存使用情况的截图。其它相似的查询方式大家可以自行实验
如果采用上述的linux命令,就需要分开组装,并调用Hadoop提供的Shell组件。
String[] queryCommand = new String[]{"ps", "-o", "%cpu,%mem", pid};
String result = Shell.execCommand(queryCommand);
返回的查询结果是一个字符串,解析字符串,拿到想要的结果,以特定的key把结果存入Counter中(当然获取次数也需要收集,在Counter中由独立key标识),这样我们的一次数据获取过程就结束了。
最终怎样分析?
在Job结束后,根据特定的key获取相应的数据,然后除以获取次数,就是平均的CPU与内存使用率。
要注意的情况是?
在这个过程中需要注意有两个地方:
1. 尽量让获取资源的线程不要占用太多的执行时间,每隔一段时间启用一次,减少对正常task执行的影响;
2. 如果遇到某个Job的多个task共用一个子JVM的情况(MapReduce优化的一点,减少频繁创建/销毁JVM的代价),就需要确保在当前task的cleanup方法中一定让获取资源的线程终结掉。这个线程包含着task运行期的Context,如果是Map task的话,那个默认100MB的内存缓冲区也在其中,可能会有OOM问题而影响下一个task的创建过程。
- 大小: 6.4 KB
分享到:
相关推荐
- **iStream计算模型**:搜索离线系统团队开发的实时流计算引擎,运行在YARN上,与其他计算模型(如MapReduce、Spark)统一调度。iStream支持分布式计算,并具有良好的弹性、负载均衡和故障恢复特性。其特点包括...
YARN负责为这些程序分配必要的资源(如内存、CPU等),确保资源的有效利用和管理。 #### 二、YARN WebUI服务 ##### 2.1 WebUI V1 YARN提供了两种Web用户界面服务:WebUI V1和WebUI V2。WebUI V1是早期版本中使用的...
Hadoop就像吞吐量巨大的轮船,启动开销大,如果每次只做小数量的输入输出,利用率将会很低。所以用好Hadoop的首要任务是增大每次任务所搭载的数据量。 Hadoop的核心能力是partition和sort,因此这也是优化的根本。...
在大数据处理中,Hive的性能优化是一个关键环节,以提高查询速度和系统资源的利用率。以下是对"Hive调优总结文档-hive tuning ppt"中可能涉及的多个知识点的详细阐述: 1. **元数据优化**: - **分区策略**:根据...
YARN通过分离资源管理和作业调度,实现了多用户、多任务的高效并发执行,提升了Hadoop集群的利用率和整体性能。此外,YARN的这种设计使得其他计算框架(如Spark、Tez等)也能无缝接入,实现了大数据处理的多样化和...
在Hive的整体架构中进行优化,主要是为了提升查询处理效率及资源利用率。以下是一些关键点: 1. **表设计**: - **分区表**:根据查询维度进行分区,如日期分区等。这有助于减少扫描的数据量。 - **桶表**:通过...
- **状态上报**:定期向Master报告自己的状态,如内存使用情况、CPU利用率等。 ##### 2.4 Executor(执行器) **定义:** Executor是在每个Worker节点上运行的进程,用于执行具体的计算任务。每个Executor可以拥有...
- **任务调度**:优化任务调度策略,提高资源利用率。 - **数据处理**: - **数据压缩**:使用合适的压缩算法减少数据传输量。 - **数据切分**:合理切分数据以提高并行处理能力。 - **容错机制**:实施有效的...
2. **性能监控**:定期评估集群性能,如 I/O、CPU、网络利用率,针对性优化。 **十、故障排查** 1. **错误日志检查**:查看 Hadoop 进程的日志,定位问题所在。 2. **集群状态检查**:使用 `hdfs dfsadmin` 和 `...
- `mapreduce.job.maps.per.node`和`mapreduce.job.reduces.per.node`控制每个节点上并行运行的任务数。 #### 2.2 YARN内存和CPU优化 - 优化内存分配,确保每个任务有足够资源运行,同时避免过度分配导致资源浪费...
该系统的核心目标是提供99.999%的可用性,并通过统一资源管理和调度提高磁盘、CPU和网络等硬件资源的利用率,以达到85%以上。 在面临大数据应用的挑战时,腾讯云通过Gaia解决了多个关键问题。首先,Gaia解决了可...
8. **预提交(Preemption)**:为了提高资源利用率和响应时间,Capacity Scheduler可以触发预提交,即强制结束已经运行但资源利用率低的任务,以释放资源给更高优先级或等待时间更长的任务。 配置Capacity ...
如果上层计算应用对CPU的计算能力要求不高,可以配置为2倍的逻辑CPU。 **原则4:提高磁盘IO吞吐率** - 尽可能挂载较多的硬盘,以提高磁盘IO吞吐率。 **影响性能的因素** - **因素1:文件服务器磁盘I/O** - 一般...
存储利用率保持在75%-80%之间,CPU利用率峰值可达85%。 #### 服务器数量的增长趋势 自2009年到2014年期间,阿里巴巴的Hadoop集群服务器数量经历了快速的增长,从最初的几百台服务器增加至五千台以上。这种快速增长...
一旦作业被选中执行,作业处理程序会创建一个进程来运行该作业,并分配必要的资源,如内存、CPU时间、I/O设备等。 8. **输入/输出处理**: 作业处理程序需要处理输入输出操作,包括数据的读取、处理和写入。这...
5. **资源管理**:查看YARN集群的资源状态,包括节点状态、内存使用情况、CPU利用率等。 6. **代码智能提示**:提供对Hadoop API的智能感知和代码补全,提升开发效率。 7. **单元测试**:支持对Hadoop应用程序进行...
单机多线程在索引构建时虽然可以提高CPU利用率,但它的容错能力较差,一旦发生故障需要人工干预。而多机多进程的方式能够更好地处理硬件故障,通过任务的自动重新分配,保证索引构建过程的连续性。 总之,基于...
5. 统计报告:提供关于任务执行时间、资源利用率等的统计报告,帮助优化工作流程。 三、C#实现 在C#环境中实现JobTrackerAPI,开发者通常会使用.NET框架提供的多线程和并发控制类,如`System.Threading.Tasks.Task...