JVM理解
在接触了Hadoop中MapReduce程序后,才慢慢深入学习了Java方面的知识,自然而然也就听到了JVM这个术语,一直蒙绕在脑海里,觉得很神乎很抽象,到今天我似乎也真正消化了它,觉得也不是那么的难以理解。
1. JVM是什么?
JVM:Java虚拟机。是可运行Java代码的假想的计算机,在实际的计算机上通过软件模拟来实现。它有自己想象中的硬件(CPU、堆栈、寄存器等)和相应的指令系统。
2. 为什么需要JVM?
那Java代码又为什么要在假想的计算机(JVM)上运行而不在真实计算机上运行呢?
是因为“跨平台”的一个设计。Java语言的一个非常重要的特点就是与平台的无关性。所以Java代码不在具体平台上运行,而是在具体平台上模拟自己的一套JVM,这样就显得它可以在任意平台上运行。
3.JVM如何配置?
4.在Hadoop中关于JVM的部分如何设置?
(1)Hadoop默认为每个task(map task 或者 reduce task) 启动一个jvm。
在mapred-site.xml中,有个配置参数"mapred.child.java.opts",是专门来配置JVM(一些堆、垃圾回收之类)的,如下配置:
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx200m</value>
</property>
默认情况下,-Xmx都是配置200m的,但是在实际情况下,这个显然是不够用的,所以客户端可以将其相应调大。
(2) JVM还可以复用,这样对于小文件,可以避免资源浪费(因为默认是一个task用一个jvm)。但是JVM重用技术不是指同一Job的两个或两个以上的task可以同时运行于同一JVM上,而是排队按顺序执行。
鉴于小文件过多的问题,设置了jvm复用,即一个job内,多个task共享jvm,避免多次启动jvm,浪费资源和时间。
那么,在mapred-site.xml文件中有个配置参数“mapred.job.reuse.jvm.num.tasks”以供使用,默认值是1,如果设置value是5,表示5个task共用一个jvm。(注意: mapred.job.reuse.jvm.num.tasks这个参数都是客户端参数,修改不需要重启tasktracker(或者yarn集群),可以在提交job的shell或者代码中设置。)

浙公网安备 33010602011771号