Оптимизировать запрос улья. java .lang.OutOfMemoryError: Java пространство кучи / G C превышен предел служебных данных - PullRequest
1 голос
/ 09 июля 2020

Как мне оптимизировать запрос этой формы, если я постоянно сталкиваюсь с этой ошибкой OOM? Или придумать лучший план выполнения? Если бы я удалил предложение подстроки, запрос работал бы нормально, предполагая, что для этого требуется много памяти.

Когда задание не выполняется, в выходных данных beeline отображается пространство кучи OOM Java. Читая онлайн, я предлагал увеличить export HADOOP_HEAPSIZE, но это все равно приводит к ошибке. Еще я попробовал увеличить hive.tez.container.size и hive.tez.java.opts (tez heap), но по-прежнему имеет эту ошибку. В журналах YARN будет превышен предел накладных расходов G C, что говорит о том, что сочетание нехватки памяти и / или плана запроса крайне неэффективно, поскольку он не может собрать достаточно памяти.

Я с использованием Azure HDInsight Interactive Query 4.0. 20 рабочих узлов, 8 ядер D13v2 и 56 ГБ ОЗУ.

Исходная таблица

create external table database.sourcetable(
  a,
  b,
  c,
  ...
  (183 total columns)
  ...
)
PARTITIONED BY ( 
  W string, 
  X int, 
  Y string, 
  Z int
)

Целевая таблица

create external table database.NEWTABLE(
  a,
  b,
  c,
  ...
  (187 total columns)
  ...
  W,
  X,
  Y,
  Z
)
PARTITIONED BY (
  aAAA,
  bBBB
)

Запрос

insert overwrite table database.NEWTABLE partition(aAAA, bBBB, cCCC)
select
a,
b,
c,
...
(187 total columns)
...
W,
X,
Y,
Z,
cast(a as string) as aAAA, 
from_unixtime(unix_timestamp(b,'yyMMdd'),'yyyyMMdd') as bBBB,
substring(upper(c),1,2) as cCCC
from database.sourcetable

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Если все остальное в порядке, попробуйте добавить распределение по ключу разделения в конце вашего запроса:

  from database.sourcetable 
  distribute by aAAA, bBBB, cCCC

В результате каждый редуктор создаст только один файл раздела, потребляя меньше памяти

0 голосов
/ 10 июля 2020

Попробуйте отсортировать разбитые на разделы столбцы:

SET hive.optimize.sort.dynamic.partition=true;

Если включено, столбец с разбиением на разделы Dynami c будет глобально отсортирован. Таким образом, мы можем держать открытой только один модуль записи для каждого значения раздела в редукторе, тем самым снижая нагрузку на память редукторов.

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

...