Чрезвычайное количество накладных расходов в простой работе MapReduce - PullRequest
2 голосов
/ 26 августа 2011

Я экспериментирую с Hadoop и создаю очень простую карту и сокращаю работу. Входные данные представляют собой 30-строчный текстовый файл, а выходные данные - только 3 строки (это отрывок из файла журнала, где карта извлекает имя страницы и время выполнения, в то время как при уменьшении вычисляются минимальное, максимальное и среднее выполнение). раз) .

Это простое задание занимает 36 секунд для выполнения на Hadoop в псевдораспределенном режиме (fs.default.name = hdfs: // localhost, dfs.replication = 1, mapred.job.tracker = локальный: 8021). Это на 2,93 ГГц Nehalem, 8 ГБ памяти, X25-E SSD под управлением Ubuntu 10.04.

Я добавил отладочный вывод в маппере и редукторе для каждого вызова к нему, что давало понять, что каждый вызов мапперу соотв. редуктор происходит в ту же секунду. Другими словами, накладные расходы до и после того, как Hadoop фактически вызывает мой код.

Это окончательный вывод:

18:16:59 INFO input.FileInputFormat: Total input paths to process : 1
18:16:59 INFO mapred.JobClient: Running job: job_201108251550_0023
18:17:00 INFO mapred.JobClient:  map 0% reduce 0%
18:17:15 INFO mapred.JobClient:  map 100% reduce 0%
18:17:30 INFO mapred.JobClient:  map 100% reduce 100%
18:17:35 INFO mapred.JobClient: Job complete: job_201108251550_0023
18:17:35 INFO mapred.JobClient: Counters: 25
18:17:35 INFO mapred.JobClient:   Job Counters 
18:17:35 INFO mapred.JobClient:     Launched reduce tasks=1
18:17:35 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=11305
18:17:35 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
18:17:35 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
18:17:35 INFO mapred.JobClient:     Launched map tasks=1
18:17:35 INFO mapred.JobClient:     Data-local map tasks=1
18:17:35 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=12762
18:17:35 INFO mapred.JobClient:   File Output Format Counters 
18:17:35 INFO mapred.JobClient:     Bytes Written=140
18:17:35 INFO mapred.JobClient:   FileSystemCounters
18:17:35 INFO mapred.JobClient:     FILE_BYTES_READ=142
18:17:35 INFO mapred.JobClient:     HDFS_BYTES_READ=7979
18:17:35 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=41899
18:17:35 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=140
18:17:35 INFO mapred.JobClient:   File Input Format Counters 
18:17:35 INFO mapred.JobClient:     Bytes Read=7877
18:17:35 INFO mapred.JobClient:   Map-Reduce Framework
18:17:35 INFO mapred.JobClient:     Reduce input groups=3
18:17:35 INFO mapred.JobClient:     Map output materialized bytes=142
18:17:35 INFO mapred.JobClient:     Combine output records=0
18:17:35 INFO mapred.JobClient:     Map input records=30
18:17:35 INFO mapred.JobClient:     Reduce shuffle bytes=0
18:17:35 INFO mapred.JobClient:     Reduce output records=3
18:17:35 INFO mapred.JobClient:     Spilled Records=12
18:17:35 INFO mapred.JobClient:     Map output bytes=124
18:17:35 INFO mapred.JobClient:     Combine input records=0
18:17:35 INFO mapred.JobClient:     Map output records=6
18:17:35 INFO mapred.JobClient:     SPLIT_RAW_BYTES=102
18:17:35 INFO mapred.JobClient:     Reduce input records=6

Как видно, до создания карты требуется 16 секунд, затем 15 секунд, пока не будет выполнено уменьшение, а затем еще 6 секунд, пока работа считается завершенной.

Вот системный журнал только задачи сокращения:

18:17:14,894 INFO org.apache.hadoop.util.NativeCodeLoader: Loaded the native-hadoop library
18:17:15,007 WARN org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Source name ugi already exists!
18:17:15,088 INFO org.apache.hadoop.mapred.ReduceTask: ShuffleRamManager: MemoryLimit=130514944, MaxSingleShuffleLimit=32628736
18:17:15,093 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Thread started: Thread for merging on-disk files
18:17:15,093 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Thread started: Thread for merging in memory files
18:17:15,093 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Thread waiting: Thread for merging on-disk files
18:17:15,094 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Need another 1 map output(s) where 0 is already in progress
18:17:15,094 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Thread started: Thread for polling Map Completion Events
18:17:15,095 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Scheduled 0 outputs (0 slow hosts and0 dup hosts)
18:17:20,095 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201108251550_0023_r_000000_0 Scheduled 1 outputs (0 slow hosts and0 dup hosts)
18:17:21,103 INFO org.apache.hadoop.mapred.ReduceTask: GetMapEventsThread exiting
18:17:21,104 INFO org.apache.hadoop.mapred.ReduceTask: getMapsEventsThread joined.
18:17:21,104 INFO org.apache.hadoop.mapred.ReduceTask: Closed ram manager
18:17:21,104 INFO org.apache.hadoop.mapred.ReduceTask: Interleaved on-disk merge complete: 0 files left.
18:17:21,104 INFO org.apache.hadoop.mapred.ReduceTask: In-memory merge complete: 1 files left.
18:17:21,110 INFO org.apache.hadoop.mapred.Merger: Merging 1 sorted segments
18:17:21,110 INFO org.apache.hadoop.mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 138 bytes
18:17:21,113 INFO org.apache.hadoop.mapred.ReduceTask: Merged 1 segments, 138 bytes to disk to satisfy reduce memory limit
18:17:21,114 INFO org.apache.hadoop.mapred.ReduceTask: Merging 1 files, 142 bytes from disk
18:17:21,114 INFO org.apache.hadoop.mapred.ReduceTask: Merging 0 segments, 0 bytes from memory into reduce
18:17:21,114 INFO org.apache.hadoop.mapred.Merger: Merging 1 sorted segments
18:17:21,117 INFO org.apache.hadoop.mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 138 bytes
18:17:21,163 INFO org.apache.hadoop.mapred.Task: Task:attempt_201108251550_0023_r_000000_0 is done. And is in the process of commiting
18:17:24,170 INFO org.apache.hadoop.mapred.Task: Task attempt_201108251550_0023_r_000000_0 is allowed to commit now
18:17:24,180 INFO org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter: Saved output of task 'attempt_201108251550_0023_r_000000_0' to output.txt
18:17:27,088 INFO org.apache.hadoop.mapred.Task: Task 'attempt_201108251550_0023_r_000000_0' done.
18:17:27,091 INFO org.apache.hadoop.mapred.TaskLogsTruncater: Initializing logs' truncater with mapRetainSize=-1 and reduceRetainSize=-1
18:17:27,110 INFO org.apache.hadoop.io.nativeio.NativeIO: Initialized cache for UID to User mapping with a cache timeout of 14400 seconds.
18:17:27,110 INFO org.apache.hadoop.io.nativeio.NativeIO: Got UserName akira for UID 1000 from the native implementation

Мой действительный код редуктора называется в 18: 17: 21.

Что дает? Это нормально?

Ответы [ 4 ]

7 голосов
/ 26 августа 2011

Если в вашем файле 300 миллионов строк, то эти 30 лишних секунд издержек будут незначительными.

2 голосов
/ 26 августа 2011

Это все нормально. Но почему тебя это волнует?

Я надеюсь, что вы создаете что-то для гораздо большего набора данных, если не Hadoop, безусловно, не ваше решение.

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

Я бы порекомендовал нарисовать себе картину с момента, когда вы отправляете свою работу, и время, когда работа выполнена, которая иллюстрирует, какие демоны задействованы и на каких машинах они могут работать.

Масштабируемость! = Производительность

1 голос
/ 20 октября 2011

hadoop масштабируется с 5 узлов (наменод + вторичный + 3 датоданных) с безопасностью RAID5 (3 реплики).На одном узле у вас есть возможность протестировать свой код, не более.После того, как вы протестировали и вошли в «настоящий» кластер, вы должны знать, насколько большим будет ваш набор данных (размер блоков), а также ОЗУ наменода является важным параметром (каждый блок потребляет ОЗУ, больше места, больше ОЗУ)тест.

1 голос
/ 27 августа 2011

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

...