Улей проблем с приемом данных: java.lang.OutOfMemoryError: невозможно создать новый собственный поток

Я новичок в улье, и у меня возникла одиссея проблем с получением большого (1 ТБ) файла HDFS в секционированную управляемую таблицу Hive. Не могли бы вы помочь мне обойти это? Мне кажется, что у меня где-то плохая конфигурация, потому что я не могу выполнять задания редуктора.

Вот мой запрос:

DROP TABLE IF EXISTS ts_managed;

SET hive.enforce.sorting = true;

CREATE TABLE IF NOT EXISTS ts_managed (
 svcpt_id VARCHAR(20),
 usage_value FLOAT,
 read_time SMALLINT)
PARTITIONED BY (read_date INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC
TBLPROPERTIES("orc.compress"="snappy","orc.create.index"="true","orc.bloom.filter.columns"="svcpt_id");

SET hive.vectorized.execution.enabled = true;
SET hive.vectorized.execution.reduce.enabled = true;
SET set hive.cbo.enable=true;
SET hive.tez.auto.reducer.parallelism=true;
SET hive.exec.reducers.max=20000;
SET yarn.nodemanager.pmem-check-enabled = true;
SET optimize.sort.dynamic.partitioning=true;
SET hive.exec.max.dynamic.partitions=10000;

INSERT OVERWRITE TABLE ts_managed
PARTITION (read_date)
SELECT svcpt_id, usage, read_time, read_date
FROM ts_raw
DISTRIBUTE BY svcpt_id
SORT BY svcpt_id;

Мои характеристики кластера:

  • Кластер виртуальных машин
  • Всего узлов 4
  • 4 узла данных
  • 32 ядра
  • 140 ГБ RAM
  • Hortonworks HDP 3.0
  • Apache Tez в качестве движка Hive по умолчанию
  • Я единственный пользователь кластера

Мои конфигурации пряжи:

yarn.nodemanager.resource.memory-mb = 32GB
yarn.scheduler.minimum-allocation-mb = 512MB
yarn.scheduler.maximum-allocation-mb = 8192MB
yarn-heapsize = 1024MB

Мои конфигурации Hive:

hive.tez.container.size = 682MB
hive.heapsize = 4096MB
hive.metastore.heapsize = 1024MB
hive.exec.reducer.bytes.per.reducer = 1GB
hive.auto.convert.join.noconditionaltask.size = 2184.5MB
hive.tex.auto.reducer.parallelism = True
hive.tez.dynamic.partition.pruning = True

Мои тез-конфиги:

tez.am.resource.memory.mb = 5120MB
tez.grouping.max-size = 1073741824 Bytes
tez.grouping.min-size = 16777216 Bytes
tez.grouping.split-waves = 1.7
tez.runtime.compress = True
tez.runtime.compress.codec = org.apache.hadoop.io.compress.SnappyCodec

Я пробовал бесчисленное количество конфигураций, включая:

  • Разделение на дату
  • Разделение по дате, кластер по svcpt_id с ведрами
  • Разделение по дате, фильтр bloom по svcpt, сортировка по svcpt_id
  • Разделение по дате, фильтр bloom по svcpt, распределение и сортировка по svcpt_id

Я могу запустить свою вершину отображения, но я еще не завершил свою первую вершину редуктора. Вот мой самый последний пример из приведенного выше запроса:

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED   1043       1043        0        0       0       0
Reducer 2        container       RUNNING   9636          0        0     9636       1       0
Reducer 3        container        INITED   9636          0        0     9636       0       0
----------------------------------------------------------------------------------------------
VERTICES: 01/03  [=>>-------------------------] 4%    ELAPSED TIME: 6804.08 s
----------------------------------------------------------------------------------------------

Ошибка была:

Error: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Reducer 2, vertexId=vertex_1537061583429_0010_2_01, diagnostics=[Task failed, taskId=task_1537061583429_0010_2_01_000070, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while running task ( failure ) : java.lang.OutOfMemoryError: unable to create new native thread

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

На данный момент я занимаюсь устранением неполадок более 2 недель. Будем признательны за любые контакты профессиональных консультантов, которым я могу заплатить для решения этой проблемы.

Заранее спасибо!


person Zafar    schedule 17.09.2018    source источник
comment
Можете ли вы попробовать уменьшить количество задач redecuer. установите для него значение set mapred.reduce.tasks=100 и посмотрите, сколько задач редуктора вы видите в запросе.   -  person Gaurang Shah    schedule 18.09.2018
comment
Вам действительно нужны DISTRIBUTE BY и SORT BY в вашем запросе? Вы пробовали разные механизмы исполнения, например set hive.execution.engine=mr?   -  person serge_k    schedule 18.09.2018
comment
@serge_k set hive.execution.engine=mr не поддерживается в моей версии Hortonworks Data Platform. Я пробовал с DISTRIBUTE BY и SORT BY и без них   -  person Zafar    schedule 18.09.2018
comment
@GaurangShah Я пробовал с 125 задачами сокращения, и у меня узлы отключились.   -  person Zafar    schedule 18.09.2018
comment
@serge_k Я добавил SORT BY в свой запрос, потому что с фильтром цветения ORC, если входящие данные не сортируются, файлы в каждом файле ORC не являются взаимоисключающими в отношении фильтра цветения. Например, если я устанавливаю свой фильтр цветения для столбца со значениями 1-10 и у меня есть 5 файлов, я хочу убедиться, что в каждом файле есть только 2 числа. Для этого данные должны быть отсортированы.   -  person Zafar    schedule 18.09.2018
comment
@Zafar, какую ошибку вы получаете?   -  person Gaurang Shah    schedule 18.09.2018
comment
@GaurangShah с этой конфигурацией я обычно получаю ошибку отказа в соединении ввода-вывода из-за проблем с пространством, которые, честно говоря, не имеют для меня смысла. Если бы у меня было 100 редукторов, разве это не давало бы блоки по 10 ГБ каждый? Это немного великовато.   -  person Zafar    schedule 18.09.2018


Ответы (1)


Я решил эту проблему после разговора с техническим специалистом Hortonworks. Оказывается, я разбивал свою таблицу на разделы. Вместо того, чтобы разбивать по дням в течение примерно 4 лет, я разбивал по месяцам, и это отлично работало.

person Zafar    schedule 13.10.2018