我正在使用 AWS EMR
. 我已经创建了指向s3位置的外部表。
这个 "INSERT INTO TABLE"
以及 "INSERT OVERWRITE"
当使用目标表作为指向s3的外部表时,语句的速度非常慢。主要问题是,配置单元首先将数据写入临时目录,然后将数据移动到原始位置。
有人有更好的解决办法吗?使用s3真的会减慢我们的工作速度。
cloudera建议使用该设置 hive.mv.files.threads
. 但看起来在emr或apache配置单元中提供的配置单元中不提供该设置。
好的,我想提供更多细节。
下面是我的源表结构
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天的订单数据。表的大小是100gb,所以目标表预计有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分钟内完成Map并缩减部分,但将数据从/tmp/hive/hadoop/b0eac2bb-7151-4e29-9640-3e7c15115b60/hive仈2018-02-15仈15-02-32仈051590427475440081364-1/-mr-10001移动到目标s3路径需要大量时间。
如果我启用参数“set hive.blobstore.optimizations.enabled=false;”
将数据从配置单元暂存目录移动到目标表目录需要时间。
令人惊讶的是,我发现了一个问题,即使我把我的压缩设置为snappy输出表的大小是108gb比原始输入文本文件是100gb。
暂无答案!
目前还没有任何答案,快来回答吧!