首页 > 解决方案 > 为什么在 Hive 查询中选择较少的列时会发生 Java OutOfMemoryError?

问题描述

我有两个配置单元选择语句:

select * from ode limit 5;

这成功地从表“ode”中提取了 5 条记录。所有列都包含在结果中。但是,以下查询导致错误:

select content from ode limit 5;

其中“内容”是表中的一列。错误是:

hive> select content from ode  limit 5;
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)

第二个查询应该便宜很多,为什么会导致内存问题?如何解决这个问题?

标签: hive

解决方案


当你选择整个表时,Hive 会触发 Fetch 任务而不是 MR 不涉及解析(就像调用hdfs dfs -cat ... | head -5)。

据我在您的情况下可以看到,配置单元客户端尝试在本地运行地图。
您可以选择以下两种方式之一:

  1. 强制远程执行hive.fetch.task.conversion
  2. HADOOP_CLIENT_OPTS使用env 变量增加 hive 客户端堆大小。

您可以在此处找到有关获取任务的更多详细信息。


推荐阅读