hadoop hive执行count(*)提示OutOfMemoryError: Java heap space

昨天在把hive部署到hadoop2.0 HA MR1集群中的时候,hive执行count(*)出错,日志为:
java.lang.Exception: java.lang.OutOfMemoryError: Java heap space
        at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:399)
Caused by: java.lang.OutOfMemoryError: Java heap space


找了很久的原因,做了以下尝试

1.修改HADOOP_HEAP=4096  
  无效


2.增加mapreduce中hadoop-env.sh的HADOOP_CLIENT_OPTS=1024
  无效


3.在.bash_profile中增加JAVA_OPTS
  无效


解决方法:

在hive命令行中 !env; 查看hive所有的环境变量

参数HADOOP_OPTS

HADOOP_OPTS=-Djava.net.preferIPv4Stack=true  -Dhadoop.log.dir=/home/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/home/hadoop/freeware/hadoop-2.0.0-cdh4.2.1 -Dhadoop.id.str=aimcpro -Dhadoop.root.logger=INFO,console -Djava.library.path=/home/hadoop/freeware/hadoop-2.0.0-cdh4.2.1/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx128m  -Dhadoop.security.logger=INFO,NullAppender


发现 Xmx128m,说明最大的被设置为128MB,问题就在这里
既然HADOOP_MAPRED_HOME/conf/hadoop-env.sh中HADOOP_CLIENT_OPTS已经被加大为1024m,那为何hive执行job仍然OOM?

于是从HADOOP_HDFS_HOME/etc/hadoop/hadoop-env.sh中去查看HADOOP_CLIENT_OPTS仍然为128m

****问题所在。说明hive在执行的时候仍然优先去读取hadoop conf目录中的配置



于是把这里的HADOOP_CLIENT_OPTS改为1024重启HDFS后,重新执行hive的 select count(*) OK
### 解决 Hive 执行 DDL 任务时 Java 堆空间不足的问题 当遇到 `java.lang.OutOfMemoryError: Java heap space` 错误时,这通常意味着 JVM 的堆内存不足以完成当前操作。对于 Hive 来说,在执行复杂的查询或大量数据处理的任务期间可能会发生这种情况。 #### 调整 JVM 参数 为了增加可用的堆内存量,可以调整启动 Hive CLI 或 Beeline 客户端时使用的 JVM 参数: ```bash export HADOOP_CLIENT_OPTS="-Xmx4g" ``` 这条命令会将最大堆大小设置为 4GB。可以根据实际需求适当增大此数值[^1]。 #### 修改 MapReduce 和 YARN 配置 如果是在分布式环境中运行,则还需要考虑修改与MapReduce作业有关的一些配置项来优化资源分配: - 设置更合理的 reducer 数量以减少单个 task 对内存的需求; - 减少 shuffle 过程中的缓存比例,从而释放更多物理 RAM 给其他组件使用; 具体可以通过如下 SQL 语句实现这些更改: ```sql SET mapreduce.job.reduces=<number_of_reducers>; SET mapreduce.reduce.shuffle.memory.limit.percent=0.25; ``` 这里 `<number_of_reducers>` 应替换为你认为合适的reducer数量值[^4]。 #### 启用并行读取目录功能 有时问题可能源于访问过多的小文件而导致元数据膨胀,进而耗尽了Heap Space。此时启用递归扫描输入路径以及支持子目录的功能或许有所帮助: ```sql SET mapred.input.dir.recursive=true; SET hive.mapred.supports.subdirectories=true; ``` 上述设置允许 Spark SQL 查询能够遍历整个目录树结构而不是仅仅局限于顶层文件夹内的对象。 通过以上措施应该能有效缓解甚至彻底解决问题。当然,最佳实践还是依据具体情况灵活调整各项参数直至找到最适合自己环境的最佳组合方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值