如何合理设置hadoop相关组件的jvm Xmx
来源:互联网 发布:java调用方法 编辑:程序博客网 时间:2024/05/23 19:51
1.这个问题不是很简单么?
直接设置不久好了,java -Xmx2000m像这样不就好了。No,我说的不仅仅是这个问题,比如,你看到
/usr/local/bigdata/jdk/bin/java -Xmx2048m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/local/bigdata/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/local/bigdata/hadoop -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,console -Djava.library.path=/usr/local/bigdata/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx512m -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /usr/local/bigdata/hive/lib/hive-cli-0.13.0.jar org.apache.hadoop.hive.cli.CliDriver为什么出现2个-Xmx,这二个货是从哪里冒出来的?
其实,根本问题是我想调整hiveserver2的jvm Xmx大小,我想直接修改hive/conf/hive-env.sh,修改
# The heap size of the jvm stared by hive shell script can be controlled via:#export HADOOP_HEAPSIZE=2000#
不就好了么,可是,我太天真了,任凭我怎么修改,都是没有用的!!
2.那究竟怎么修改?或者说这些参数是在哪里设定的?
我们一起看看:
1)hive/hiveserver2的命令最终都指向了hive/bin/ext/util/execHiveCmd.sh
cat hive/bin/ext/util/execHiveCmd.sh execHiveCmd () { ...... # hadoop 20 or newer - skip the aux_jars option. picked up from hiveconf exec $HADOOP jar ${HIVE_LIB}/hive-cli-*.jar $CLASS $HIVE_OPTS "$@" }
也即hive所有命令都是通过hadoop jar命令加上自己的hive相关的jar包名执行的。
2)所以我们看hadoop/bin/hadoop命令
cat hadoop/bin/hadoop . $HADOOP_LIBEXEC_DIR/hadoop-config.sh ...... exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
即先执行了hadoop/libexec/hadoop-config.sh再执行java命令的,注意$JAVA_HEAP_MAX和$HADOOP_OPTS
3)看hadoop/libexec/hadoop-config.sh
cat hadoop/libexec/hadoop-config.sh if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then . "${HADOOP_CONF_DIR}/hadoop-env.sh" fi ...... # some Java parameters JAVA_HEAP_MAX=-Xmx1000m # check envvars which might override default args if [ "$HADOOP_HEAPSIZE" != "" ]; then #echo "run with heapsize $HADOOP_HEAPSIZE" JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m" #echo $JAVA_HEAP_MAX fi
先执行hadoop/conf/hadoop-env.sh,获取hadoop中的HADOOP_HEAPSIZE
看到这里应该就明白了,hive/conf/hive-env.sh即使设定了HADOOP_HEAPSIZE=2000,也会被后来的再执行hadoop命令的时候给覆盖掉。
4)那之前hive命令中出现的Xmx512m又是从哪里来的呢?
cat hadoop/conf/hadoop-env.sh # The following applies to multiple commands (fs, dfs, fsck, distcp etc) export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS" #HADOOP_JAVA_PLATFORM_OPTS="-XX:-UsePerfData $HADOOP_JAVA_PLATFORM_OPTS" cat hadoop/bin/hadoop # Always respect HADOOP_OPTS and HADOOP_CLIENT_OPTS HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS" export CLASSPATH=$CLASSPATH exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
原来是通过在hadoop/conf/hadoop-env.sh中的HADOOP_CLIENT_OPTS设定死的
5)那hadoop中启动一个namenode/datanode/resourcemanager/nodemanager等又是怎么设定的呢?长话短说,整理一张图
所以问题的根本在于hadoop/hdfs命令都公用了HADOOP_HEAPSIZE这个参数(hive命令也实际上是hadoop命令),而yarn则非常好的没有公用,而是采用YARN_HEAPSIZE/YARN_RESOURCEMANAGER_HEAPSIZE/YARN_NODEMANAGER_HEAPSIZE分别设置。
3.结论:
为了保证hadoop集群中各个组件Xmx参数可以独立设置不干扰(关键是hive中可以设定Xmx大小),而且结构清晰层次分明:
1)对于namenode/datanode通过设定HADOOP_NAMENODE_OPTS/HADOOP_DATANODE_OPTS设定Xmx
2)取消hadoop/conf/hadoop-env.sh中HADOOP_HEAPSIZE设定
3)取消HADOOP_CLIENT_OPTS中Xmx的设定
4)设定hive/conf/hive-env.sh中HADOOP_HEAPSIZE
最后的最后,
写的口吐白沫终于写完了,就这样啊,再见
- 如何合理设置hadoop相关组件的jvm Xmx
- JVM内存设置多大合适?Xmx和Xmn如何设置?
- Jvm的Xmx参数详解
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理设置Linux的swap分区
- 如何合理的设置培训体系
- 如何合理的规划一次jvm性能调优
- [Hadoop]设置Task的jvm heap size
- 如何设置jvm的内存
- JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
- JVM 内存设置大小(Xms Xmx PermSize MaxPermSize)
- JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
- JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
- xcode 创建 workspace 过程
- 第六周项目 3 完成第8章知识点的思维导图
- 【c语言】设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积
- List 序列化与反序列化到struts2的<s:hidden>变量
- 利用Responsive Nav.js插件制作响应式导航
- 如何合理设置hadoop相关组件的jvm Xmx
- ArcGIS教程:北京54坐标(或西安80)与WGS84的坐标转换
- 【c语言】输入3个数,要求按从小到大顺序输出
- HDU 2850 Load Balancing
- 黑马程序员——Java学习笔记 基础常识
- 【c语言】 输入一个字符,判断它是否为大写字母,如果是,将它转换成小写字母,如果不是不转换
- sql 结果折分,一行变多行
- openstack学习笔记 --- keystone 客户端管理工程,用户 和 角色
- 【c语言】有一函数:x < 0 ,y = -1;x = 0,y = 0;x > 0,y = 1,编程输入一个x值,要求输出对应的y