【问题标题】:Transfer big table from one Hive database to another将大表从一个 Hive 数据库转移到另一个
【发布时间】:2018-06-01 06:25:39
【问题描述】:

我想将一个大(超过 1.5 亿条记录和 700 列)表从一个 Hive 数据库转移到另一个,其中包括一些转换,例如在日期列上使用一个 castsubstr 在字符串列和一个简单的 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;

问题是这个查询会花费很多时间(每小时 100 万行)。也许有人知道如何加快速度?

我正在为此任务使用 map reduce 引擎。

谢谢!

【问题讨论】:

  • 尝试将结果插入临时表,然后将其插入主表。
  • 谢谢@Vamsi。现在好多了。还有其他改进的想法吗?
  • 在 hive 中,将数据加载到不同的数据库或读取数据的同一数据库之间没有性能差异。 Hive 数据库通常指的是 hdfs 目录。就 SQL 而言,我看不出如何调整它。性能将取决于 HDFS 集群的大小。你试过运行这个吗?以及指标是什么?
  • 这里最重要的是这个过程最终会生成一个大文件(20 GB)而不是几个小文件。此外,reduce 过程花费了大部分时间,所以上述设置可能有什么问题?为什么这么大的文件最终变成了一个大文件?在这个过程中有很多 mapper 和 reducer,reduce = 99% 需要几个小时。

标签: performance hive bigdata hiveql


【解决方案1】:

关于如何加快查询速度的一些建议:

  1. 尽可能避免使用 unix_timestamp()。此函数是非确定性的,会阻止查询的适当优化,它将在每个映射器或减速器中执行,并且可能返回不同的值。改为使用

    current_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 以增加reducer 的数量。

使用这些设置。成功标准是更多的 mapper/reducer,并且你的 map 和 reduce 阶段运行得更快。

详情请看这个答案:https://stackoverflow.com/a/42842117/2700344

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

【讨论】:

    【解决方案2】:

    由于 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/.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2011-05-19
      • 2012-11-27
      • 2012-04-07
      相关资源
      最近更新 更多