Установить размер файла быстрого вывода паркета - улей?

Я пытаюсь разделить файлы parquet / snappy, созданные hive INSERT OVERWRITE TABLE ... на границе dfs.block.size, поскольку импала выдает предупреждение, когда файл в разделе больше, чем размер блока.

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?


person Hatim Diab    schedule 15.06.2015    source источник
comment
В итоге я взломал решение, используя pyspark. Проверьте размер исходных данных и определите хороший коэффициент сжатия от оригинала к паркету мгновенно (~ 1,4 от gz) n = int (math.ceil (size * 1.4 / hdfs_block_size)) df.repartition (n) .write. parquet (some_path) (это было решение, которое сработало еще в 2015 году)   -  person Hatim Diab    schedule 31.03.2018


Ответы (3)


Невозможно закрыть файлы, когда они увеличиваются до размера одного блока HDFS, и запускать новый файл. Это будет противоречить тому, как обычно работает HDFS: наличие файлов, охватывающих множество блоков.

Правильным решением для Impala является планирование своих задач, в которых блоки являются локальными, вместо того, чтобы жаловаться на то, что файл занимает более одного блока. Это было недавно завершено как IMPALA-1881 и будет выпущено в Impala 2.3.

person blue    schedule 13.11.2015
comment
Спасибо, Райан, это действительно хорошо работает для столбцов несложного типа. Есть ли альтернативный способ использования INSERT INTO...SELECT в Impala для обработки сложных событий? Кроме того, если HDFS настроен с размером блока 128 МБ, тогда будет ли иметь смысл установка размера блока паркета на 256 МБ? Является ли сокращение до одного блока на файл идеальным сценарием? Спасибо! - person user2727704; 26.01.2016

Вам необходимо установить размер блока паркета и размер блока dfs:

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

Оба должны быть установлены на одно и то же, потому что вы хотите, чтобы паркетный блок поместился внутри блока hdfs.

person Stamperious    schedule 17.06.2015
comment
Спасибо, только что попробовал, не сработало, я предполагаю, что окончательный результат будет паркетным / мгновенным. - person Hatim Diab; 17.06.2015
comment
А что насчет mapred.max.split.size? Думаю, это тоже имеет значение. - person Tagar; 24.07.2015
comment
Начиная с Parquet 1.8.0, размер блока автоматически устанавливается равным размеру группы строк, если он меньше размера группы строк (parquet.block.size). Таким образом, вы не должны получать эту ошибку, если забудете ее установить. - person blue; 14.11.2015

В некоторых случаях вы можете установить размер блока паркета, установив mapred.max.split.size (паркет 1.4.2+), что вы уже сделали. Вы можете установить его меньше, чем размер блока hdfs, чтобы увеличить параллелизм. Parquet пытается выровнять по блокам hdfs, когда это возможно:

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

Изменить 16.11.2015: согласно https://github.com/Parquet/parquet-mr/pull/365#issuecomment-157108975 это также может быть IMPALA-1881, исправленный в Impala 2.3.

person Tagar    schedule 24.07.2015