2014-08-27 4 views
-1

У меня есть 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" 

Теперь дайте мне знать, если я нахожусь на правильном пути:

Поскольку мне просто нужно разобрать много файлов в другой форме; Полагаю, мне не нужен какой-либо шаг сокращения. Я могу просто написать картограф, который:

  1. принимает данные из стандартного ввода
  2. Читает std.in построчно
  3. преобразует каждую линию по моим спецификациям
  4. выходов в стандартный вывод

Тогда я могу запустить хауп с помощью простого картографа и 0 редукторов.

Этот подход кажется правильным? Смогу ли я на самом деле правильно использовать кластер или это будет так же плохо, как запуск сценария Python на одном хосте?

ответ

0

Вы правы, в этом случае вам не нужен редуктор, вывод вашего картографа напрямую зависит от того, что вы хотите, поэтому вы должны установить количество редукторов на 0. Когда вы укажете Hadoop путь ввода, где ваш JSON данных, он автоматически подаст каждому картографу случайное количество строк JSON, которое будет обрабатывать ваш картограф, и вам нужно будет передать его в контекст, чтобы он сохранял значение в пути вывода. Подход правильный, и эта задача на 100% параллелизуема, поэтому, если у вас в вашем кластере несколько компьютеров, и ваша конфигурация верна, она должна в полной мере использовать кластер, и он будет работать намного быстрее, чем запустить его на одном хост.

+0

Это замечательно! Но выход будет в какой форме? Если я дам ему место с 2000 файлами в качестве входных данных, то вывод из mapper через stdout будет автоматически сохранен в виде файлов 2000? Я попробую это завтра, но я хотел бы получить приличное представление о том, что происходит в этом процессе. – user1265125

+0

Количество выходных файлов зависит от количества редукторов, так как он создает один файл на редуктор. Однако, если вы установите его на 0 редукторов, то это будет зависеть от количества карт. Если вы хотите, чтобы все было в одном файле, тогда поставьте 1 редуктор, IdentityReducer в этом случае, который принимает только вывод mapper и выводит его как выход редуктора. – Balduz

Смежные вопросы