4

ハイブ INSERT OVERWRITE TABLE... によって作成された parquet/snappy ファイルを dfs.block.size 境界で分割しようとしています。これは、パーティション内のファイルがブロック サイズより大きい場合に 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");

INSERThql スクリプトについては、次のようになります。

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設定 (および上記の他の設定) が256M512Mまたは1G(異なるデータ セットの場合) に増加しても、問題は同じです。

出力寄木細工/スナッピーファイルの分割がhdfsブロックサイズのすぐ下になるようにする方法/設定はありますか?

4

3 に答える 3

3

ファイルが 1 つの HDFS ブロックのサイズにまで大きくなると、ファイルを閉じて新しいファイルを開始する方法はありません。これは、多くのブロックにまたがるファイルを持つという HDFS の通常の動作に反します。

適切な解決策は、Impala がファイルが複数のブロックにまたがっていると不平を言うのではなく、ブロックがローカルであるタスクをスケジュールすることです。これは最近IMPALA-1881として完成し、Impala 2.3 でリリースされる予定です。

于 2015-11-13T23:25:19.040 に答える