设置Parquet弹出输出文件大小是Hive?

uqxowvwt  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(477)

我正在尝试拆分由配置单元插入覆盖表创建的Parquet/snappy文件。。。当分区中的文件大于块大小时,impala会发出警告。
Impala 记录以下警告:

Parquet files should not be split into multiple hdfs-blocks. file=hdfs://<SERVER>/<PATH>/<PARTITION>/000000_0 (1 of 7 similar)

代码:

CREATE TABLE <TABLE_NAME>(<FILEDS>)
PARTITIONED BY (
    year SMALLINT,
    month TINYINT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\037'
STORED AS PARQUET TBLPROPERTIES ("parquet.compression"="SNAPPY");

至于 INSERT hql脚本:

SET dfs.block.size=134217728;
SET hive.exec.reducers.bytes.per.reducer=134217728;
SET hive.merge.mapfiles=true;
SET hive.merge.size.per.task=134217728;
SET hive.merge.smallfiles.avgsize=67108864;
SET hive.exec.compress.output=true;
SET mapred.max.split.size=134217728;
SET mapred.output.compression.type=BLOCK;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
INSERT OVERWRITE TABLE <TABLE_NAME>
PARTITION (year=<YEAR>, month=<MONTH>)
SELECT <FIELDS>
from <ANOTHER_TABLE> where year=<YEAR> and month=<MONTH>;

问题是文件被查封的地方到处都是:

partition 1: 1 file: size = 163.9 M 
partition 2: 2 file: size = 207.4 M, 128.0 M
partition 3: 3 file: size = 166.3 M, 153.5 M, 162.6 M
partition 4: 3 file: size = 151.4 M, 150.7 M, 45.2 M

不管发生什么事,问题都是一样的 dfs.block.size 设置(及以上其他设置)增加到 256M , 512M 或者 1G (针对不同的数据集)。
是否有方法/设置来确保输出Parquet/snappy文件的拆分刚好低于hdfs块大小?

nxagd54h

nxagd54h1#

在某些情况下,可以通过设置mapred.max.split.size(parquet 1.4.2+)来设置 parquet 块大小,您已经这样做了。您可以将其设置为低于hdfs块大小以增加并行性。Parquet地板尽量与hdfs块对齐,如有可能:
https://github.com/parquet/parquet-mr/pull/365
编辑20151616:根据https://github.com/parquet/parquet-mr/pull/365#issuecomment-157108975这也可能是 Impala -1881,固定在 Impala 2.3。

emeijp43

emeijp432#

一旦文件增长到单个hdfs块的大小,就无法关闭文件并启动新文件。这与hdfs通常的工作方式背道而驰:文件跨越许多块。
正确的解决方案是让impala将其任务安排在块是本地的位置,而不是抱怨文件跨越多个块。这是最近完成的 Impala -1881,将在 Impala 2.3发布。

d5vmydt9

d5vmydt93#

您需要同时设置Parquet地板块大小和dfs块大小:

SET dfs.block.size=134217728;  
SET parquet.block.size=134217728;

两者都需要设置为相同的,因为您希望Parquet地板块适合hdfs块。

相关问题