Я новичок в Hadoop, но это был мой учебный проект за последний месяц.Hadoop 1 входной файл = 1 выходной файл, только для карт
В попытке сохранить это достаточно расплывчатым, чтобы быть полезным для других, позвольте мне выбросить основную цель первого .... Предположим:
- У вас есть большой набор данных (очевидно), миллионов основных текстовых файлов ASCII.
- Каждый файл является «записью».
- Записи сохраняются в структуре каталога для идентификации клиента & даты
- например/Пользователь/hduser/данные/customer1/YYYY-MM-DD,/пользователь/hduser/данные/customer2/YYYY-MM-DD
- Вы хотите, чтобы имитировать структуру ввода для вывода структуры
- например/Пользователь/hduser/выход/customer1/YYYY-MM-DD,/пользователь/hduser/выход/customer2/YYYY-MM-DD
Я посмотрел на несколько потоков:
- Multiple output path java hadoop mapreduce
- MultipleTextOutputFormat alternative in new api
- Separate Output files in Hadoop mapreduce
- Speculative Task Execution - Для того, чтобы попытаться решить -m-часть #### выпуск
И многое другое .. Я также читал книгу Хэдоопа Том Уайта. Я с нетерпением пытаюсь это узнать. и я часто обмениваюсь между новым API и старым API, что добавляет к путанице попытки узнать об этом.
Многие указали на MultipleOutputs (или на старые версии api), но я, похоже, не могу произвести свой желаемый результат - например, MultipleOutputs, похоже, не принимает «/» для создания структуры каталогов в write()
Какие шаги необходимо предпринять для создания файла с желаемой структурой вывода? В настоящее время у меня есть WholeFileInputFormat класс, и связанной с ним RecordReader, который имеет (NullWritable K, ByteWritable V) пара (который можно изменить при необходимости)
Моя установка карта:
public class MapClass extends Mapper<NullWritable, BytesWritable, Text, BytesWritable> {
private Text filenameKey;
private MultipleOutputs<NullWritable, Text> mos;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
InputSplit split = context.getInputSplit();
Path path = ((FileSplit) split).getPath();
filenameKey = new Text(path.toString().substring(38)); // bad hackjob, until i figure out a better way.. removes hdfs://master:port/user/hduser/path/
mos = new MultipleOutputs(context);
}
}
Существует также очистки() функция, которая вызывает mos.close() и карта() функция в настоящее время неизвестно (что мне нужна помощь здесь)
является ли это достаточно информации указать новичку в направлении ответа? Мои последующие мысли заключались в создании объекта MultipleOutputs() в каждой задаче map(), каждая из которых имеет новую базовую строку String, но я не уверен, что это эффективный или даже правильный вид действий.
Совет будет оценен, что-либо в программе может измениться на данный момент, за исключением ввода - я просто пытаюсь изучить фреймворк, - но я хотел бы как можно ближе подойти к этому результату (позже на Я, вероятно, посмотрю на объединение записей с большими файлами, но они уже имеют значение 20 МБ на запись, и я хочу убедиться, что он работает до того, как я сделаю невозможным чтение в Notepad.
Редактировать: может ли эта проблема быть решена путем изменения/расширение TextOutputFormat.class? Кажется, у него могут быть некоторые из методов, которые могут работать, но я не уверен, какие методы мне нужно переопределить ...
Я не пробовал это, но книга «Hadoop окончательное руководство» говорит MultipleOutputs из нового API поддерживает использование путь к файлу разделитель (/). Вы говорите, что это не работает? – Rags
@Rags Вероятно, ошибка в моем выполнении MultipleOutputs – Pseudo