我正在使用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。