设为首页 收藏本站
查看: 976|回复: 0

[经验分享] hadoopJVM堆大小设置优化

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-21 08:51:47 | 显示全部楼层 |阅读模式
                      前段时间,公司Hadoop集群整体的负载很高,查了一下原因,发现原来是客户端那边在每一个作业上擅自配置了很大的堆空间,从而导致集群负载很高。下面我就来讲讲怎么来现在客户端那边的JVM堆大小的设置。  我们知道,在mapred-site.xml配置文件里面有个mapred.child.java.opts配置,专门来配置一些诸如堆、垃圾回收之类的。看下下面的配置:
mapred.child.java.opts-Xmx200mJava opts for the task tracker child processes.   The following symbol, if present, will be interpolated: @taskid@ is    replaced by current TaskID. Any other occurrences of '@' will go unchanged.   For example, to enable verbose gc logging to a file named for the taskid in   /tmp and to set the heap maximum to be a gigabyte, pass a 'value' of:         -Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc    The configuration variable mapred.child.ulimit can be used to control the   maximum virtual memory of the child processes.默认情况下,-Xmx都是配置200m的,但是在实际情况下,这个显然是不够用的,所以导致客户端那边会设置更大的值。那怎么来限制用户随便设置Xmx的值呢?有下面两种方法:  一、可以自己定义一个变量,比如如下:查看源代码打印帮助
mapred.task.java.opts-Xmx2000mmapred.child.java.opts${mapred.task.java.opts} -Xmx1000mtrue上面的mapred.task.java.opts属性是我们自己定义的,可以公布给用户配置;然后在mapred.child.java.opts中获取到mapred.task.java.opts的值,同时mapred.child.java.opts属性的final被设置为true,也就是不让客户修改。所以用户对mapred.child.java.opts直接配置是无效的;而且这里我们在获取${mapred.task.java.opts}之后再添加了-Xmx1000m,而在Java中,如果相同的jvm arg写在一起,比如”-Xmx2000m -Xmx1000m”,后面的会覆盖前面的,也就是说最终“-Xmx1000m”才会生效,通过这种方式,我们就可以有限度的控制客户端那边的heap size了。同样的道理,其他想覆盖的参数我们也可以写到后面。我们可以通过
mapred.map.child.java.opts-Xmx512Mmapred.reduce.child.java.opts-Xmx1024M来分别配置作业的Map和Reduce阶段的heap的大小。  二、通过mapreduce.admin.map.child.java.opts和和mapreduce.admin.reduce.child.java.opts设定  上述限制客户端那边随便设置堆大小是通过重新定义一个变量给用户使用,这样用户得使用新的变量来定义一些JVM相关的设定,如果用户那边的脚本非常多,他们就需要一个一个脚本的修改mapred.child.java.opts为mapred.task.java.opts。这样会恨不方便。这里介绍另外一种方法。可以通过mapreduce.admin.map.child.java.opts和mapreduce.admin.reduce.child.java.opts来限定作业map和reduce的堆的大小。他们都是管理员设定的map/reduce阶段申请的container的默认JVM启动参数。启动container的命令行会先连接管理员设定参数,然后再连接用户设定参数。我们来看看Hadoop源码是怎么获取客户端和管理员JVM参数的获取的:private static String getChildJavaOpts(JobConf jobConf, boolean isMapTask) {    String userClasspath = "";    String adminClasspath = "";    if (isMapTask) {      userClasspath =           jobConf.get(              JobConf.MAPRED_MAP_TASK_JAVA_OPTS,               jobConf.get(                  JobConf.MAPRED_TASK_JAVA_OPTS,                   JobConf.DEFAULT_MAPRED_TASK_JAVA_OPTS)          );      adminClasspath =           jobConf.get(              MRJobConfig.MAPRED_MAP_ADMIN_JAVA_OPTS,              MRJobConfig.DEFAULT_MAPRED_ADMIN_JAVA_OPTS);    } else {      userClasspath =          jobConf.get(              JobConf.MAPRED_REDUCE_TASK_JAVA_OPTS,               jobConf.get(                  JobConf.MAPRED_TASK_JAVA_OPTS,                  JobConf.DEFAULT_MAPRED_TASK_JAVA_OPTS)              );      adminClasspath =          jobConf.get(              MRJobConfig.MAPRED_REDUCE_ADMIN_JAVA_OPTS,              MRJobConfig.DEFAULT_MAPRED_ADMIN_JAVA_OPTS);    }         // Add admin classpath first so it can be overridden by user.    return adminClasspath + " " + userClasspath;}  通过上面的代码,我们可以发现Hadoop是先获取管理员的JVM参数配置,然后连接客户端那边JVM参数的配置。这样如果管理员那边的配置在客户端那边也配置了,那么客户端这边的配置将会覆盖掉管理员那边的参数配置。所以我们可以修改源码,将 return adminClasspath + ” ” + userClasspath;修改为 return userClasspath + ” ” + adminClasspath;然后在mapred-site.xml文件做如下配置:
mapreduce.admin.map.child.java.opts-Xmx1000mmapreduce.admin.reduce.child.java.opts-Xmx1000m这样,我们就可以覆盖客户端那边的配置。  总结  上面两种方法虽然能在一定程度上限制客户端使用堆的大小,但是这样的解决办法不是很好的!因为我们设定所有作业的堆大小都是1000M,但是实际情况下,很多作业不一定都用得到1000M;而且在一些情况下,有些作业用到的heap可能大于1000M,这样会使这样的作业出现OOM的问题。
                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-19347-1-1.html 上篇帖子: hadoop namenode启动异常,死活失败 下篇帖子: hadoop家族的各个成员
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表