将大表从一个Hive数据库转移到另一个

问题描述 投票:1回答:2

我想将一个大的(超过150万条记录和700列)表从一个Hive数据库转移到另一个Hive数据库,其中包括一些转换,例如在日期列上使用一个强制转换,在字符串列上使用substr和一个简单的case语句。

所以,像这样:

-- initial settings 
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.compress.intermediate=true;
SET hive.exec.parallel=true;
SET parquet.compression=SNAPPY;
SET hive.optimize.sort.dynamic.partition=true; 
SET hive.merge.size.per.task=1000000000;
SET hive.merge.smallfiles.avgsize=1000000000;

INSERT INTO databaseA.tableName PARTITION(parition_col)
CASE WHEN a='Something' THEN 'SOMETHING'
     WHEN a is null THEN 'Missing'
     ELSE a END AS a,
column1,
column2, 
...
cast(to_date(from_unixtime(unix_timestamp(),'yyyy-MM-dd')) AS string) AS 
run_date,
substr(some_string, 1, 3)
FROM databaseB.tableName;

问题是此查询将花费大量时间(每小时1百万行)。也许有人知道如何加快速度?

我正在使用map reduce engine来完成这项任务。

谢谢!

performance hive bigdata hiveql
2个回答
0
投票

由于Hive表中的所有数据都是HDFS上的文件,为什么不将文件直接移动/复制到新表的HDFS位置。

例:

Assuming the table you want to move is already present in db1 as table_to_cpy;

create database db2;
create table db2.table_to_cpy like db1.table_to_cpy;
desc formatted db1.table_to_cpy;
--copy the hdfs table path ---> /user/hive/warehouse/db1.db/table_to_cpy

desc formatted db2.table_to_cpy;
--copy the hdfs table path ---> /user/hive/warehouse/db2.db/table_to_cpy

hadoop fs -cp /user/hive/warehouse/db1.db/table_to_cpy/* /user/hive/warehouse/db2.db/table_to_cpy/.

0
投票

关于如何加速查询的几点建议:

  1. 如果可能,请避免使用unix_timestamp()。此函数是非确定性的并且阻止了对查询的正确优化,它将在每个映射器或缩减器中执行,并且可能返回不同的值。请改用 current_date()AS run_date 有关更多详细信息,请参阅此答案:https://stackoverflow.com/a/41140298/2700344
  2. 调整映射器和减速器的并行性。如果你的进程以一个大文件(20 GB)而不是一些小文件结束,那么显然没有足够的并行性。

对于地图制作者,请使用以下设置:

set mapreduce.input.fileinputformat.split.minsize=16777216; -- 16 MB
set mapreduce.input.fileinputformat.split.minsize=1073741824; -- 1 GB

减少hive.exec.reducers.bytes.per.reducer以增加减速器的数量。

玩这些设置。成功标准是更多的映射器/缩减器,并且您的map和reduce阶段运行得更快。

有关详细信息,请参阅此答案:https://stackoverflow.com/a/42842117/2700344

  1. 尝试添加distribute by parition_col它将根据分区键在reducers之间分配数据,因此每个reducer将创建更少的分区并消耗更少的内存。此外,它有助于避免太多小输出文件。此设置应与hive.exec.reducers.bytes.per.reducer一起使用,以避免Reducer之间分布不均匀的问题,并避免输出文件太大。
© www.soinside.com 2019 - 2024. All rights reserved.