数据摄取问题 hive:java.lang.OutOfMemoryError:无法创建新的本机线程

Posted

技术标签:

【中文标题】数据摄取问题 hive:java.lang.OutOfMemoryError:无法创建新的本机线程【英文标题】:Data ingest issues hive: java.lang.OutOfMemoryError: unable to create new native thread 【发布时间】:2018-09-17 20:08:30 【问题描述】:

我是 Hive 新手,在将大型 (1TB) 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 GB 内存 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 配置:

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 上集群 分区日期,svcpt 上的布隆过滤器,按 svcpt_id 排序 按日期分区,对 svcpt 进行布隆过滤器,按 svcpt_id 分配和排序

我可以让我的映射顶点运行,但我的第一个 reducer 顶点还没有完成。这是我在上述查询中的最新示例:

----------------------------------------------------------------------------------------------
        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 周了。任何我可以支付费用来解决此问题的专业顾问的联系方式也将不胜感激。

提前致谢!

【问题讨论】:

你能尝试减少redecuer任务的数量吗?将此设置为 set mapred.reduce.tasks=100 并查看您在查询中看到了多少减速器任务。 您的查询中真的需要DISTRIBUTE BYSORT BY 吗?您是否尝试过不同的执行引擎,例如set hive.execution.engine=mr @serge_k set hive.execution.engine=mr 在我的 Hortonworks Data Platform 版本中不受支持。我试过有没有DISTRIBUTE BYSORT BY @GaurangShah 我尝试了 125 个 reduce 任务,但我让节点离线。 @serge_k 我在查询中添加了SORT BY,因为如果数据未对传入的数据进行排序,则使用 ORC 布隆过滤器,则每个 ORC 文件中的文件就布隆过滤器而言不是互斥的。例如,如果我在值为 1-10 的 col 上设置我的布隆过滤器并且我有 5 个文件,我想确保每个文件中只有 2 个数字。为此,数据必须经过排序。 【参考方案1】:

在与 Hortonworks 技术人员交谈后,我最终解决了这个问题。原来我过度分区了我的桌子。在大约 4 年的时间里,我没有按天分区,而是按月分区,效果很好。

【讨论】:

以上是关于数据摄取问题 hive:java.lang.OutOfMemoryError:无法创建新的本机线程的主要内容,如果未能解决你的问题,请参考以下文章

JSON 到 HIVE 摄取

替代递归运行Spark-submit作业

实时 Hive 数据转换?

java.lang.out of memory error Android 位图工厂

什么是 nvarchar 合适的数据类型,MYSQL 数据库位在 HIVE 中?

大数据测试方法