У меня есть 100GB из JSON файлов, чьи каждая строка выглядит следующим образом:Преобразование файла JSON в Hadoop
{"field1":100, "field2":200, "field3":[{"in1":20, "in2":"abc"},{"in1":30, "in2":"xyz"}]}
(Это на самом деле гораздо сложнее, но для этого будет делать, как небольшой демо.)
Я хочу, чтобы обработать его к чему-то, чья каждая строка выглядит следующим образом:
{"field1":100, "field2":200, "abc":20, "xyz":30}
Будучи чрезвычайно новым для Hadoop, я просто хочу знать, если я нахожусь на правильном пути:
Отсносящийся к этому: http://www.glennklockwood.com/di/hadoop-streaming.php Для обычных приложений, которые я бы создать аа картографа и редуктор в Python и выполнить его, используя что-то вроде:
hadoop \
jar /opt/hadoop/contrib/streaming/hadoop-streaming-1.0.3.jar \
-mapper "python $PWD/mapper.py" \
-reducer "python $PWD/reducer.py" \
-input "wordcount/mobydick.txt" \
-output "wordcount/output"
Теперь дайте мне знать, если я нахожусь на правильном пути:
Поскольку мне просто нужно разобрать много файлов в другой форме; Полагаю, мне не нужен какой-либо шаг сокращения. Я могу просто написать картограф, который:
- принимает данные из стандартного ввода
- Читает std.in построчно
- преобразует каждую линию по моим спецификациям
- выходов в стандартный вывод
Тогда я могу запустить хауп с помощью простого картографа и 0 редукторов.
Этот подход кажется правильным? Смогу ли я на самом деле правильно использовать кластер или это будет так же плохо, как запуск сценария Python на одном хосте?
Это замечательно! Но выход будет в какой форме? Если я дам ему место с 2000 файлами в качестве входных данных, то вывод из mapper через stdout будет автоматически сохранен в виде файлов 2000? Я попробую это завтра, но я хотел бы получить приличное представление о том, что происходит в этом процессе. – user1265125
Количество выходных файлов зависит от количества редукторов, так как он создает один файл на редуктор. Однако, если вы установите его на 0 редукторов, то это будет зависеть от количества карт. Если вы хотите, чтобы все было в одном файле, тогда поставьте 1 редуктор, IdentityReducer в этом случае, который принимает только вывод mapper и выводит его как выход редуктора. – Balduz