Подтвердить что ты не робот

Как выводить несколько файлов s3 в Паркет

Запись паркетных данных может быть выполнена следующим образом. Но если я пытаюсь написать не только один файл и, более того, хочу вывести на несколько файлов s3, чтобы чтение одного столбца не считывало все данные s3, как это можно сделать?

    AvroParquetWriter<GenericRecord> writer =
            new AvroParquetWriter<GenericRecord>(file, schema);

    GenericData.Record record = new GenericRecordBuilder(schema)
                .set("name", "myname")
                .set("favorite_number", i)
                .set("favorite_color", "mystring").build();
    writer.write(record);

Например, что, если я хочу разбить на значение столбца, чтобы все данные с красным символом favorite_color попадали в один файл и те, у которых синие в другом файле, чтобы минимизировать стоимость определенных запросов. В контексте Hadoop должно быть что-то подобное. Все, что я могу найти, это вещи, которые упоминают Spark, используя что-то вроде

df.write.parquet("hdfs:///my_file", partitionBy=["created_year", "created_month"])

Но я не могу найти эквивалент partitionBy в простой Java с Hadoop.

4b9b3361

Ответ 1

В типичном приложении Map-Reduce количество выходных файлов будет таким же, как количество сокращений в вашей работе. Поэтому, если вы хотите несколько выходных файлов, установите количество сокращений соответственно:

job.setNumReduceTasks(N);

или, альтернативно, через системное свойство:

-Dmapreduce.job.reduces=N

Я не думаю, что можно иметь один столбец на файл с форматом Паркета. Внутренняя структура файлов Parquet сначала разделяется группами строк, и только эти группы строк затем разбиваются на столбцы.

Формат паркета

Ответ 2

Я сделал это, просто записав вывод непосредственно из моего метода редуктора на S3, используя S3 toolkit. Поскольку я работал на EC2, это было быстро и бесплатно

В общем, вы хотите, чтобы Hadoop обрабатывал ваши входные и выходные данные как можно больше, для более чистых карт и редукторов; и, конечно же, вы хотите написать на S3 в самом конце вашего конвейера, чтобы позволить перемещению кода Hadoop выполнять эту работу поверх HDFS

В любом случае, я рекомендую делать все ваши разделы данных и записывать целые выходные наборы в S3 в конечной задаче сокращения, по одному для каждого файла S3. Это делает как можно меньше логики для записи в вашем коде. Это окупилось для меня, потому что у меня был минимальный набор инструментов Hadoop S3, который я использовал для нескольких потоков задач.