Как выводить несколько файлов 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.
Ответы
Ответ 1
В типичном приложении Map-Reduce количество выходных файлов будет таким же, как количество сокращений в вашей работе. Поэтому, если вы хотите несколько выходных файлов, установите количество сокращений соответственно:
job.setNumReduceTasks(N);
или, альтернативно, через системное свойство:
-Dmapreduce.job.reduces=N
Я не думаю, что можно иметь один столбец на файл с форматом Паркета. Внутренняя структура файлов Parquet сначала разделяется группами строк, и только эти группы строк затем разбиваются на столбцы.
![Формат паркета]()
Ответ 2
Я сделал это, просто записав вывод непосредственно из моего метода редуктора на S3, используя S3 toolkit
. Поскольку я работал на EC2, это было быстро и бесплатно
В общем, вы хотите, чтобы Hadoop
обрабатывал ваши входные и выходные данные как можно больше, для более чистых карт и редукторов; и, конечно же, вы хотите написать на S3 в самом конце вашего конвейера, чтобы позволить перемещению кода Hadoop выполнять эту работу поверх HDFS
В любом случае, я рекомендую делать все ваши разделы данных и записывать целые выходные наборы в S3 в конечной задаче сокращения, по одному для каждого файла S3. Это делает как можно меньше логики для записи в вашем коде. Это окупилось для меня, потому что у меня был минимальный набор инструментов Hadoop S3, который я использовал для нескольких потоков задач.