【问题标题】:how to force hive to distribute rows equally in insert overwrite into a partitioned table from another table among the reducers to improve performance如何强制 hive 在 reducer 之间从另一个表中将行平均分配到分区表中以提高性能
【发布时间】:2017-05-18 05:43:26
【问题描述】:

我想从另一个配置单元表中插入一个分区配置单元表。数据在目标表的单个分区中。问题是所有减速器完成得非常快,但其中一个减速器需要很长时间,因为所有工作都在单个减速器上完成。

我想找到一种方法来将工作平均分配给所有减速器。有什么办法吗?如何提高插入覆盖的性能?

源表 DDL:

 CREATE EXTERNAL TABLE employee ( id INT,first_name String,latst_name String,email String,gender String) STORED AS TEXTFILE '/emp/data'

目标表 DDL:

 CREATE EXTERNAL TABLE employee_stage ( id INT,first_name String,latst_name String,email String,gender String) PARTITIONED BY (batch_id bigint) STORED AS ORC LOCATION '/stage/emp/data'

这是数据快照

1   Helen   Perrie  hperrie0@lulu.com   Female
2   Rafaelita   Jancso  rjancso1@cdbaby.com Female
3   Letti   Kelley  lkelley2@slideshare.net Female
4   Adela   Dmisek  admisek3@state.gov  Female
5   Lay Reyner  lreyner4@wired.com  Male
6   Robby   Felder  rfelder5@microsoft.com  Male
7   Thayne  Brunton tbrunton6@sun.com   Male
8   Lorrie  Roony   lroony7@oracle.com  Male
9   Hodge   Straun  hstraun8@w3.org Male
10  Gawain  Tomblett    gtomblett9@toplist.cz   Male
11  Carey   Facher  cfachera@ca.gov Male
12  Pamelina    Elijahu pelijahub@goo.ne.jp Female
13  Carmelle    Dabs    cdabsc@bizjournals.com  Female
14  Moore   Baldrick    mbaldrickd@yandex.ru    Male
15  Sheff   Morin   smorine@purevolume.com  Male
16  Zed Eary    zearyf@livejournal.com  Male
17  Angus   Pollastrone apollastroneg@wikispaces.com    Male
18  Moises  Hubach  mhubachh@usnews.com Male
19  Lilllie Beetham lbeethami@diigo.com Female
20  Mortimer    De Hooge    mdehoogej@ucoz.com  Male

源表包含超过 100M 的记录。

这是我正在使用的 hql。

insert overwrite table employee_stage
PARTITION (batch_id)
SELECT
  id,
  first_name,
  latst_name,
  email,
  gender,
  123456789 as batch_id
FROM employee;

数据在单个分区中。

请告诉我在这种情况下如何提高性能? 有没有办法在所有 reducer 之间平均分配行?

【问题讨论】:

  • 您能提供更多信息吗?你的表是如何分区的?你的数据集是什么?
  • (1) 请将附加信息添加到您的原始帖子并删除 cmets (2) 请为两个表和您用于填充目标表的代码
  • @DuduMarkovitz 我已经添加了 DDL 和 hql。请找到。
  • 此操作中没有reducer...
  • @DuduMarkovitz 虽然插入覆盖将运行,但它将运行减速器

标签: performance hive hiveql


【解决方案1】:

我想您没有在 insert overwrite 查询中进行 JOINS 或其他一些繁重的转换,并且在插入期间确实发生了倾斜。因为如果你这样做了,那么问题不应该是关于插入的。

尝试将distribute by batch_id 添加到您的插入查询并重新运行。如果仍在运行倾斜,请检查您的数据。某些特定的batch_id 的数据太多,或者您可能有很多空值。如何处理倾斜数据有不同的方法。其中之一是过滤掉倾斜的键并单独加载它们。检查作业跟踪器上长时间运行的减速器日志,它将为您提供有关问题所在位置的更多信息。

【讨论】:

  • 源表中的全部数据都用于单个batch_id。这样所有行都用于单个减速器。我可以强制 hive 在所有减速器之间平均分配行吗?
  • 尝试distribute by 一些其他分布更均匀的密钥。理想情况下,它应该启动许多减速器,每个减速器都会创建自己的文件。还要检查这个属性:set hive.exec.reducers.bytes.per.reducer=67108864; 以确保每个 reducer 没有太多数据
  • 默认值为 1G。将其设置为 67108864 将创建更多减速器,从而增加并行度。并检查您是否没有 order by 或其他导致所有数据在单个减速器上运行的东西
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2014-05-19
相关资源
最近更新 更多