Производительность Hadoop - PullRequest
4 голосов
/ 30 января 2012

Я установил hadoop 1.0.0 и попробовал пример подсчета слов (кластер с одним узлом). Это заняло 2 м 48 сек. Затем я попробовал стандартную программу подсчета слов linux, которая работает за 10 миллисекунд на том же наборе (данные 180 кБ). Я что-то делаю не так или Hadoop очень медленный?

time hadoop jar /usr/share/hadoop/hadoop*examples*.jar wordcount someinput someoutput
12/01/29 23:04:41 INFO input.FileInputFormat: Total input paths to process : 30
12/01/29 23:04:41 INFO mapred.JobClient: Running job: job_201201292302_0001
12/01/29 23:04:42 INFO mapred.JobClient:  map 0% reduce 0%
12/01/29 23:05:05 INFO mapred.JobClient:  map 6% reduce 0%
12/01/29 23:05:15 INFO mapred.JobClient:  map 13% reduce 0%
12/01/29 23:05:25 INFO mapred.JobClient:  map 16% reduce 0%
12/01/29 23:05:27 INFO mapred.JobClient:  map 20% reduce 0%
12/01/29 23:05:28 INFO mapred.JobClient:  map 20% reduce 4%
12/01/29 23:05:34 INFO mapred.JobClient:  map 20% reduce 5%
12/01/29 23:05:35 INFO mapred.JobClient:  map 23% reduce 5%
12/01/29 23:05:36 INFO mapred.JobClient:  map 26% reduce 5%
12/01/29 23:05:41 INFO mapred.JobClient:  map 26% reduce 8%
12/01/29 23:05:44 INFO mapred.JobClient:  map 33% reduce 8%
12/01/29 23:05:53 INFO mapred.JobClient:  map 36% reduce 11%
12/01/29 23:05:54 INFO mapred.JobClient:  map 40% reduce 11%
12/01/29 23:05:56 INFO mapred.JobClient:  map 40% reduce 12%
12/01/29 23:06:01 INFO mapred.JobClient:  map 43% reduce 12%
12/01/29 23:06:02 INFO mapred.JobClient:  map 46% reduce 12%
12/01/29 23:06:06 INFO mapred.JobClient:  map 46% reduce 14%
12/01/29 23:06:09 INFO mapred.JobClient:  map 46% reduce 15%
12/01/29 23:06:11 INFO mapred.JobClient:  map 50% reduce 15%
12/01/29 23:06:12 INFO mapred.JobClient:  map 53% reduce 15%
12/01/29 23:06:20 INFO mapred.JobClient:  map 56% reduce 15%
12/01/29 23:06:21 INFO mapred.JobClient:  map 60% reduce 17%
12/01/29 23:06:28 INFO mapred.JobClient:  map 63% reduce 17%
12/01/29 23:06:29 INFO mapred.JobClient:  map 66% reduce 17%
12/01/29 23:06:30 INFO mapred.JobClient:  map 66% reduce 20%
12/01/29 23:06:36 INFO mapred.JobClient:  map 70% reduce 22%
12/01/29 23:06:37 INFO mapred.JobClient:  map 73% reduce 22%
12/01/29 23:06:45 INFO mapred.JobClient:  map 80% reduce 24%
12/01/29 23:06:51 INFO mapred.JobClient:  map 80% reduce 25%
12/01/29 23:06:54 INFO mapred.JobClient:  map 86% reduce 25%
12/01/29 23:06:55 INFO mapred.JobClient:  map 86% reduce 26%
12/01/29 23:07:02 INFO mapred.JobClient:  map 90% reduce 26%
12/01/29 23:07:03 INFO mapred.JobClient:  map 93% reduce 26%
12/01/29 23:07:07 INFO mapred.JobClient:  map 93% reduce 30%
12/01/29 23:07:09 INFO mapred.JobClient:  map 96% reduce 30%
12/01/29 23:07:10 INFO mapred.JobClient:  map 96% reduce 31%
12/01/29 23:07:12 INFO mapred.JobClient:  map 100% reduce 31%
12/01/29 23:07:22 INFO mapred.JobClient:  map 100% reduce 100%
12/01/29 23:07:28 INFO mapred.JobClient: Job complete: job_201201292302_0001
12/01/29 23:07:28 INFO mapred.JobClient: Counters: 29
12/01/29 23:07:28 INFO mapred.JobClient:   Job Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Launched reduce tasks=1
12/01/29 23:07:28 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=275346
12/01/29 23:07:28 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
12/01/29 23:07:28 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
12/01/29 23:07:28 INFO mapred.JobClient:     Launched map tasks=30
12/01/29 23:07:28 INFO mapred.JobClient:     Data-local map tasks=30
12/01/29 23:07:28 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=137186
12/01/29 23:07:28 INFO mapred.JobClient:   File Output Format Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Bytes Written=26287
12/01/29 23:07:28 INFO mapred.JobClient:   FileSystemCounters
12/01/29 23:07:28 INFO mapred.JobClient:     FILE_BYTES_READ=71510
12/01/29 23:07:28 INFO mapred.JobClient:     HDFS_BYTES_READ=89916
12/01/29 23:07:28 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=956282
12/01/29 23:07:28 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=26287
12/01/29 23:07:28 INFO mapred.JobClient:   File Input Format Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Bytes Read=85860
12/01/29 23:07:28 INFO mapred.JobClient:   Map-Reduce Framework
12/01/29 23:07:28 INFO mapred.JobClient:     Map output materialized bytes=71684
12/01/29 23:07:28 INFO mapred.JobClient:     Map input records=2574
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce shuffle bytes=71684
12/01/29 23:07:28 INFO mapred.JobClient:     Spilled Records=6696
12/01/29 23:07:28 INFO mapred.JobClient:     Map output bytes=118288
12/01/29 23:07:28 INFO mapred.JobClient:     CPU time spent (ms)=39330
12/01/29 23:07:28 INFO mapred.JobClient:     Total committed heap usage (bytes)=5029167104
12/01/29 23:07:28 INFO mapred.JobClient:     Combine input records=8233
12/01/29 23:07:28 INFO mapred.JobClient:     SPLIT_RAW_BYTES=4056
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce input records=3348
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce input groups=1265
12/01/29 23:07:28 INFO mapred.JobClient:     Combine output records=3348
12/01/29 23:07:28 INFO mapred.JobClient:     Physical memory (bytes) snapshot=4936278016
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce output records=1265
12/01/29 23:07:28 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=26102546432
12/01/29 23:07:28 INFO mapred.JobClient:     Map output records=8233

real    2m48.886s
user    0m3.300s
sys 0m0.304s


time wc someinput/*
  178  1001  8674 someinput/capacity-scheduler.xml
  178  1001  8674 someinput/capacity-scheduler.xml.bak
    7     7   196 someinput/commons-logging.properties
    7     7   196 someinput/commons-logging.properties.bak
   24    35   535 someinput/configuration.xsl
   80   122  1968 someinput/core-site.xml
   80   122  1972 someinput/core-site.xml.bak
    1     0     1 someinput/dfs.exclude
    1     0     1 someinput/dfs.include
   12    36   327 someinput/fair-scheduler.xml
   45   192  2141 someinput/hadoop-env.sh
   45   192  2139 someinput/hadoop-env.sh.bak
   20   137   910 someinput/hadoop-metrics2.properties
   20   137   910 someinput/hadoop-metrics2.properties.bak
  118   582  4653 someinput/hadoop-policy.xml
  118   582  4653 someinput/hadoop-policy.xml.bak
  241   623  6616 someinput/hdfs-site.xml
  241   623  6630 someinput/hdfs-site.xml.bak
  171   417  6177 someinput/log4j.properties
  171   417  6177 someinput/log4j.properties.bak
    1     0     1 someinput/mapred.exclude
    1     0     1 someinput/mapred.include
   12    15   298 someinput/mapred-queue-acls.xml
   12    15   298 someinput/mapred-queue-acls.xml.bak
  338   897  9616 someinput/mapred-site.xml
  338   897  9630 someinput/mapred-site.xml.bak
    1     1    10 someinput/masters
    1     1    18 someinput/slaves
   57    89  1243 someinput/ssl-client.xml.example
   55    85  1195 someinput/ssl-server.xml.example
 2574  8233 85860 total

real    0m0.009s
user    0m0.004s
sys 0m0.000s

Ответы [ 8 ]

11 голосов
/ 30 января 2012

Это зависит от большого числа факторов, включая вашу конфигурацию, вашу машину, конфигурацию памяти, настройки JVM и т. Д. Вам также необходимо вычесть время запуска JVM.

Это работает намного быстрее для меня.Тем не менее, конечно, это будет медленнее для небольших наборов данных, чем для специальной программы на C - подумайте, что она делает «за кулисами».посмотрим, что получится.

6 голосов
/ 30 января 2012

Как сказал Дейв, Hadoop оптимизирован для обработки больших объемов данных, а не на примерах Существует налог на «пробуждение слона», чтобы начать работу, которая не нужна, когда вы работаете на небольших сетах. Вы можете взглянуть на «О производительности Map Reduce Jobs» , чтобы узнать, что происходит

2 голосов
/ 30 января 2012

Ваши входные данные были небольшими, и вы заметили, что hadoop занял много времени.Процесс создания рабочих мест в Hadoop тяжел, поскольку он включает в себя много вещей.Если бы входные данные были большими, вы бы увидели, что hadoop работает лучше, чем wc.

1 голос
/ 30 января 2012

в дополнение к другим ответам есть еще один фактор:
У вас есть 30 файлов для обработки - таким образом, есть 30 задач для выполнения.Затраты Hadoop MR на выполнение одной задачи составляют от 1 до 3 секунд.Если вы объедините данные в один файл - производительность серьезно улучшится, а у вас все еще будут проблемы с началом работы.
Я думаю, что локальная нативная программа всегда будет превосходить Hadoop MR.Hadoop создан с учетом масштабируемости и отказоустойчивости - во многих случаях производительность снижается.

0 голосов
/ 11 декабря 2015

Несмотря на то, что Hadoop не предназначен для этого небольшого файла, мы все равно можем настроить его до некоторой степени.Размер файла составляет 180 кб.Но количество блоков составляет 30. Вы должны уменьшить "dfs.block.size" в hdfs-site.xml.Поскольку входные разбиения больше, число картографов также больше, что в этом случае не нужно.Hadoop должен быть настроен в соответствии с количеством узлов и входных данных.Таким образом, вам нужно увеличить «dfs.block.size» до 64 МБ, чтобы выполнить подсчет этих слов одним преобразователем, что значительно улучшит производительность.

0 голосов
/ 10 сентября 2015

Хм .. здесь путаница, или позвольте мне создать путаницу здесь.

Предположим, у вас есть проблема, которую можно решить, скажем, O(n) complexity что будет делать hadoop, если вы примените, допустим, K машин , тогда это уменьшит сложность в K раз. Так что в вашем случае задача должна была выполняться быстрее (задача hadoop).

Что пошло не так ?????

Предполагается, что у вас есть стандартная установка hadoop и все стандартные конфигурации hadoop, а также если вы по умолчанию запускаете hadoop в локальном режиме.

1) Вы запускаете программу на одном узле, поэтому не ожидайте времени выполнения чего-либо меньшего, чем стандартная программа. (Случай был бы другим, если бы вы использовали многоузловой кластер)

Теперь возникает вопрос, поскольку используется одна машина, время работы должно быть одинаковым ???

Ответ - нет, в hadoop данные сначала считываются устройством чтения записей, которое выдает пары значений ключа, которые передаются в преобразователь, который затем обрабатывает и выдает пары значений ключа (предположим, что объединитель не используется), затем данные сортируются и перемешивается и затем передается на фазу редуктора, после чего выполняется запись в hdfs. Итак, смотрите, здесь намного больше накладных расходов. И вы воспринимаете ухудшенную производительность по этим причинам.

Вы хотите посмотреть, что может сделать hadoop. Запустите ту же задачу на кластере узлов K и получите петабайты данных, а также запустите однопоточное приложение. Я обещаю, вы будете поражены.

0 голосов
/ 03 июля 2015

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

https://github.com/marek5050/Sparkie/tree/master/Java

, используя

hadoop jar ./target/wordcount.jar -r 1 -m 4 <input> <output>

Сила Hadoop заключается вРаспределение работы между несколькими узлами для обработки данных в ГБ / ТБ обычно не будет более эффективным, чем то, что ваш компьютер способен сделать за пару минут.

0 голосов
/ 30 января 2012

Для улучшения производительности Hadoop:

  • Установить количество картографов и редукторов .

    [Видя вывод вашей программы, я думаю, что вы использовали несколько редукторов и картографов. Используйте его в соответствии с вашими потребностями. Использование слишком большого количества картографов или редукторов не повысит производительность]

  • Использование Больший кусок данных. (в терабайтах или, по крайней мере, в ГБ)

    [В Hadoop есть некоторый фундамент размер блока 64 МБ.]

  • Настройте Hadoop на некоторые другие терминалы и попробуйте запустить в многоузловых кластерах . Это повысит производительность.

Hadoop - следующая большая вещь.

...