使用S3外部表时,Hive insert overwrite和Insert into非常慢

时间:2018-02-14 22:31:25

标签: amazon-s3 hive amazon-emr

我正在使用AWS EMR。我创建了指向S3位置的外部表。

使用目标表作为指向S3的外部表时,"INSERT INTO TABLE""INSERT OVERWRITE"语句非常慢。主要问题是Hive首先将数据写入临时目录,然后将数据移动到原始位置。

有没有人有更好的解决方案呢?使用S3确实减缓了我们的工作。

Cloudera建议使用hive.mv.files.threads设置。但看起来设置在EMR或Apache Hive中提供的Hive中不可用。

好的,我想提供更多细节。

以下是我的源表结构

CREATE EXTERNAL TABLE ORDERS  (
O_ORDERKEY       INT,
O_CUSTKEY        INT,
O_ORDERSTATUS    STRING,
O_TOTALPRICE     DOUBLE,
O_ORDERDATE      DATE,
O_ORDERPRIORITY  STRING,  
O_CLERK          STRING, 
O_SHIPPRIORITY   INT,
O_COMMENT        STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'  
STORED AS TEXTFILE
LOCATION 's3://raw-tpch/orders/'; 

以下是目的地表的结构。

CREATE EXTERNAL TABLE ORDERS  (
O_ORDERKEY       INT,
 O_CUSTKEY INT,
 O_ORDERSTATUS STRING,
 O_TOTALPRICE decimal(12,2),
 O_ORDERPRIORITY STRING,
 O_CLERK STRING,
 O_SHIPPRIORITY INT,
 O_COMMENT STRING)
partitioned by (O_ORDERDATE string)
STORED AS PARQUET
LOCATION 's3://parquet-tpch/orders/';

源表包含2400天的订单数据。表的大小为100 GB。因此目标表预计有2400个分区。我已执行以下插入声明。

set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.reducers.bytes.per.reducer=500000000;
set hive.optimize.sort.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.dynamic.partitions.pernode=2000;
set hive.load.dynamic.partitions.thread=20;
set hive.mv.files.thread=25;
set hive.blobstore.optimizations.enabled=false;
set parquet.compression=snappy;
INSERT into TABLE orders_parq partition(O_ORDERDATE) 
SELECT  O_ORDERKEY, O_CUSTKEY,
O_ORDERSTATUS, O_TOTALPRICE, 
O_ORDERPRIORITY, O_CLERK,
O_SHIPPRIORITY, O_COMMENT, 
O_ORDERDATE from orders;

查询完成它的映射并在10分钟内减少部分,但需要花费大量时间从/ tmp / hive / hadoop / b0eac2bb-7151-4e29-9640-3e7c15115b60 / hive_2018-02-15_15-02-32_051_5904274475440081364-移动数据1 / -mr-10001到目的地s3路径。

如果我启用参数“set hive.blobstore.optimizations.enabled = false;”

将数据从hive登台目录移动到目标表目录需要时间。

令人惊讶的是,我发现了另外一个问题,即使我将压缩设置为snappy,输出表格大小比原始输入文本文件(100 GB)多108 GB。

0 个答案:

没有答案