将大表从一个配置单元数据库传输到另一个配置单元数据库

doinxwow  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(433)

我想将一个大表(超过150mln条记录和700列)从一个配置单元数据库传输到另一个配置单元数据库,其中包括一些转换,例如对日期列使用一个cast、对字符串列使用substr和一个简单的case语句。
比如说:

  1. -- initial settings
  2. SET hive.exec.dynamic.partition=true;
  3. SET hive.exec.dynamic.partition.mode=nonstrict;
  4. SET hive.exec.compress.intermediate=true;
  5. SET hive.exec.parallel=true;
  6. SET parquet.compression=SNAPPY;
  7. SET hive.optimize.sort.dynamic.partition=true;
  8. SET hive.merge.size.per.task=1000000000;
  9. SET hive.merge.smallfiles.avgsize=1000000000;
  10. INSERT INTO databaseA.tableName PARTITION(parition_col)
  11. CASE WHEN a='Something' THEN 'SOMETHING'
  12. WHEN a is null THEN 'Missing'
  13. ELSE a END AS a,
  14. column1,
  15. column2,
  16. ...
  17. cast(to_date(from_unixtime(unix_timestamp(),'yyyy-MM-dd')) AS string) AS
  18. run_date,
  19. substr(some_string, 1, 3)
  20. FROM databaseB.tableName;

问题是这个查询将花费很多时间(每小时一百万行)。也许有人知道怎么加速?
我正在使用map reduce引擎执行此任务。
谢谢!

u59ebvdq

u59ebvdq1#

关于如何加快查询速度的几点建议:
如果可能,请避免使用unix\u timestamp()。此函数是不确定的,会阻止查询的适当优化,它将在每个Map器或缩减器中执行,并可能返回不同的值。改用
当前日期()作为运行日期
有关更多详细信息,请参见此答案:https://stackoverflow.com/a/41140298/2700344
调整Map器和减速器的平行度。如果您的进程最终只有一个大文件(20gb)而不是几个小文件,那么显然没有足够的并行性。
对于Map器,请使用以下设置:

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

减少 hive.exec.reducers.bytes.per.reducer 增加减速器的数量。
播放这些设置。成功的标准是更多的Map器/还原器,你的Map和还原阶段运行得更快。
有关详细信息,请参见此答案:https://stackoverflow.com/a/42842117/2700344
尝试添加 distribute by parition_col 它将根据分区键在缩减器之间分配数据,因此每个缩减器将创建更少的分区并消耗更少的内存。它也有助于避免太多的小输出文件。此设置应与一起使用 hive.exec.reducers.bytes.per.reducer 避免减速器之间分布不均的问题,避免输出文件过大。

展开查看全部
a2mppw5e

a2mppw5e2#

既然配置单元表中的所有数据都是hdfs上的文件,为什么不直接将这些文件移动/复制到新表的hdfs位置呢。
例子:

  1. Assuming the table you want to move is already present in db1 as table_to_cpy;
  2. create database db2;
  3. create table db2.table_to_cpy like db1.table_to_cpy;
  4. desc formatted db1.table_to_cpy;
  5. --copy the hdfs table path ---> /user/hive/warehouse/db1.db/table_to_cpy
  6. desc formatted db2.table_to_cpy;
  7. --copy the hdfs table path ---> /user/hive/warehouse/db2.db/table_to_cpy
  8. hadoop fs -cp /user/hive/warehouse/db1.db/table_to_cpy/* /user/hive/warehouse/db2.db/table_to_cpy/.

相关问题