关于impala:设置实木复合地板的活泼输出文件大小是否为hive?

Set parquet snappy output file size is hive?

我正在尝试在dfs.block.size边界上拆分由hiveINSERT OVERWRITE TABLE ...创建的镶木地板/易拉皮文件,因为当分区中的文件大于块大小时,impala会发出警告。

impala记录以下警告:

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

代码:

1
2
3
4
5
6
7
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脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
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>;

问题在于到处都有文件检获:

1
2
3
4
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设置(以及上面的其他设置)增加到256M512M1G(对于不同的数据集),问题都是相同的。

是否有一种方法/设置来确保输出实木复合地板/快照文件的分割刚好低于hdf??s块大小?


一旦文件增长到单个HDFS块的大小并启动??新文件,就无法关闭文件。这将与HDFS通常的工作方式背道而驰:拥有跨越多个块的文件。

Impala的正确解决方案是在块位于本地的情况下安排其任务,而不是抱怨文件跨越多个块。这是最近以IMPALA-1881完成的,并将在Impala 2.3中发布。


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

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

两个都需要设置为相同,因为您希望将镶木地板块放入hdfs块中。


在某些情况下,您可以通过设置已经完成的mapred.max.split.size(镶木地板1.4.2)来设置镶木地板块的大小。您可以将其设置为小于hdfs块大小,以提高并行度。在可能的情况下,Parquet尝试与hdfs块对齐:

https://github.com/Parquet/parquet-mr/pull/365

编辑11/16/2015:
根据
https://github.com/Parquet/parquet-mr/pull/365#issuecomment-157108975
这也可能是在Impala 2.3中修复的IMPALA-1881。