Серия «Атака на большие данные» (6): среда распределенных вычислений Hadoop MapReduce
Серия «Атака на большие данные» (6): среда распределенных вычислений Hadoop MapReduce

Обзор MapReduce

MapReduce — это модель программирования (без концепции кластера задачи будут передаваться для запуска в кластер Yarn), используемая для параллельных операций с крупномасштабными наборами данных (более 1 ТБ). Понятия «Карта» и «Сокращение», являющиеся их основными идеями, заимствованы из функциональных языков программирования, а также функции, заимствованные из языков векторного программирования. Это значительно облегчает программистам запуск собственных программ в распределенных системах без знания распределенного параллельного программирования.

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

Без MapReduce
  • Тогда это будет сложно сделать на распределенных вычислениях.,Непросто программировать.
  • Невозможно справиться с большими объемами на ранних стадиях. данныеиз Оффлайн расчет。
  • Сложность масштабируемости в программировании
  • распределенные Если вычислительная задача зависает, отказоустойчивого механизма для ее решения не существует.

Описание: В чем MapReduce не хорош (медленно!)

  • Расчеты в реальном времени: как и в MySQL, результаты возвращаются в течение миллисекунд или секунд.
  • Потоковые вычисления: набор входных данных MapReduce является статическим и не может изменяться динамически.
  • Расчет DAG: несколько приложений имеют зависимости, и входные данные последнего приложения являются выходными данными предыдущего.

Сейчас MapReduce постепенно заменяется такими фреймворками, как Spark и Flink. Но идеи важны и заслуживают изучения. Подробнее о больших данных Hadoopрядиз Учебные статьи,Видеть:Атака на серию больших данных,Эта серия постоянно обновляется.

Принцип MapReduce

Архитектура управления кластером MapReduce
  • 1. Клиент отправляет задачу MR в RM.
  • 2.RM выделяет ресурсы, находит соответствующий NM, выделяет контейнеры-контейнеры и запускает соответствующий мастер приложений.
  • 3. Мастер приложений регистрируется в диспетчере приложений.
  • 4. Мастер приложений подает заявку на ресурсы из планировщика ресурсов.
  • 5. Найдите соответствующий НМ
  • 6. Выделите контейнер «Контейнер» и запустите соответствующую задачу «Карта» или «Сокращение».
  • 7. Сопоставление задач и сокращение задач сообщает о пульсе и ходе выполнения задачи в Application Master.
  • 8. Мастер приложений сообщает диспетчеру приложений об общем ходе выполнения задачи. Если выполнение завершено, диспетчер приложений удалит мастер приложений.

Примечание. В принципе, MapReduce делится на два этапа: Задача сопоставления и Задача сокращения. Однако, поскольку этап перетасовки очень важен, этот этап искусственно разделен между задачами сопоставления и задачами сокращения. понимается как вторая половина сегмента задачи «Карта» и первая половина задачи «Сокращение».

MapReduce поток данных
MapTask
Механизм принятия решения о параллелизме
  • Если 1 ГБ данных разделить на 8 частей для параллельных вычислений, то данные, которые необходимо вычислить для каждой части, составят 128 МБ, что довольно неплохо.
  • Если 1М данных разделить на 8 частей для параллельного расчета, то каждая часть данных, которую необходимо вычислить, составит 128Б, что выглядит как серьезная трата ресурсов.

Затем должно быть что-то, чтобы решить, как его разделить, а именно InputFormat, а размер разделения обычно определяется размером блока HDFS.

  • Параллелизм фазы карты задания определяется количеством срезов, которые клиент выполняет при отправке задания.
  • Каждому срезу Split выделяется экземпляр параллельной обработки MapTask.
  • По умолчанию размер среза =BlockSize(128M).
  • При нарезке не учитывается весь набор данных, а нарезается каждый файл индивидуально.

По поводу четвертого пункта: Например, если есть 3 файла, один 300М, второй 50М, третий 50М, то всего будет вырезано 5 MapTasks.

Для каждого файла первые 300 МБ были разрезаны на 3 файла, вторые 50 МБ были разрезаны на один файл, а третьи 50 МБ были разрезаны на один файл, всего получилось 5 файлов.

А если есть только один файл размером 128М+1КБ,Тогда будет разделен только один,Поскольку правило оценки нарезки->Если файл меньше размера фрагмента1.1раз,Сразуиначальствоодинкусочек будет Сразупомещатьсуществоватьвместе,Это предотвратит слишком малыйиз Срез в действииизкогда,Планирование ресурсовиз Время превышает время выполненияиз Состояние。

Запущенный процесс MapReduce

Процесс выполнения задания в основном включает в себя следующие этапы:

  • 1、Сдача заданий
  • 2、Инициализация задания
  • 3、Постановка рабочих задач
  • 4、Выполнение должностных задач
  • 5. Обновление статуса выполнения задания.
  • 6. Домашнее задание выполнено.

Блок-схема процесса выполнения конкретного задания показана ниже:

Сдача заданий

существоватьMRиз Вызов по кодуwaitForCompletion()метод,Инкапсулированный внутриJob.submit()метод,иJob.submit()Метод создастJobSubmmiterобъект。когда мыwaitForCompletion(true)час,ноwaitForCompletionметод Буду опрашивать каждую секунду Операцияиз Ход выполнения,Если обнаружено, что это то же самое, что и последний запросиз Есть разница в статусе,затем распечатайте детали на консоли. Если выполнение задания прошло успешно,Показать счетчик вакансий,нетноприведет к Операциянеудачаиз Записыватьвыходутешать。

Примерный процесс реализации JobSubmmiter выглядит следующим образом:
  • 1. Отправьте заявку менеджеру ресурсов на получение идентификатора задания Mapreduce, как показано на шаге 2 на рисунке.
  • 2. Проверьте выходную конфигурацию задания и определите, существует ли уже каталог, и другую информацию.
  • 3. Рассчитайте размер входных фрагментов задания.
  • 4.выполню заданиеизjar,Конфигурационный файл,Входные фрагментыиз Вычислительные ресурсыкопироватьна работуIDимяизhdfsПрочасв каталоге,Есть много копий домашнего задания.,Значение по умолчанию — 10 (контролируется параметром mapreduce.client.submit.file.replication).,
  • 5. Отправьте задание с помощью метода submitApplication менеджера ресурсов.
Инициализация задания

1. Когда диспетчер ресурсов вызывается через метод submitApplication, запрос передается планировщику пряжи, а затем планировщик выделяет контейнер (container0) в диспетчере узлов для запуска приложения. мастер-процесс (основной класс — MRAppMaster). После запуска процесса он зарегистрируется у менеджера ресурсов и сообщит свою собственную информацию. Мастер также может отслеживать текущее состояние карты и уменьшать ее. Поэтому применение masterверно Инициализация задания Создав несколько книгобъектдержатьверно Операциярасписаниеизотслеживать。

2. Мастер приложения получает файлы ресурсов, jar-файлы, информацию о сегментировании, информацию о конфигурации и т. д. во временном общем каталоге HDFS при отправке задания. И создайте объект карты для каждого шарда, а количество редюсеров определите через параметр mapreduce.job.reduces (задание задается через метод setNumReduceTasks()).

3. Мастер приложения определит, использовать ли режим uber (задание и мастер приложения выполняются в одной и той же JVM, то есть Maptask и Reductask выполняются на одном и том же узле) для запуска задания. Условия работы режима uber: количество карт меньше 10, 1 сокращение, а входные данные меньше одного блока HDFS.

Вы можете передать параметры:

Язык кода:javascript
копировать
mapreduce.job.ubertask.enable   #Включить ли режим uber
mapreduce.job.ubertask.maxmaps   #Максимальное количество карт для ubertask
mapreduce.job.ubertask.maxreduces #Максимальное количество редьюсеров для ubertask
mapreduce.job.ubertask.maxbytes #ubertask максимальный размер задания

4. Мастер приложения вызывает метод setupJob, чтобы установить для OutputCommiter и FileOutputCommiter значение по умолчанию, что означает создание конечного выходного каталога и временной рабочей области для вывода задач.

Подробнее о больших данных Hadoopрядиз Учебные статьи,Видеть:Атака на серию больших данных,Эта серия постоянно обновляется.

Постановка рабочих задач

1. Когда мастер приложения определяет, что задание не соответствует режиму uber, мастер приложения подает заявку на контейнеры ресурсов для задач карты и сокращения от менеджера ресурсов.

2. Первым шагом является выдача запроса на приложение ресурсов для задачи карты. Когда 5% задач карты будут выполнены, будет сделан запрос на ресурсы, необходимые для задачи сокращения.

3. В процессе распределения задачи задача сокращения может выполняться на любом узле узла данных, но при выполнении задачи сопоставления необходимо учитывать механизм локализации данных. При указании ресурсов для задачи каждая карта и сокращение по умолчанию имеют объем памяти 1 ГБ. который можно настроить с помощью следующих параметров:

Язык кода:javascript
копировать
mapreduce.map.memory.mb
mapreduce.map.cpu.vcores
mapreduce.reduce.memory.mb
mapreduce.reduce.cpu.vcores
Выполнение должностных задач

После того как мастер приложения отправляет приложение, менеджер ресурсов выделяет ресурсы по требованию. В это время мастер приложения связывается с менеджером узлов для запуска контейнера. Эту задачу выполняет Java-приложение основного класса YarnChild. Прежде чем запускать задачу, сначала локализуйте необходимые ресурсы, включая конфигурацию задания, jar-файлы и т. д. Следующий шаг — запустить карту и сократить задачи. YarnChild работает в отдельной JVM.

Обновления статуса задания

Каждое задание и каждая его задача имеет статус: статус задания или задачи (выполняется, успешно, не удалось и т. д.), ход выполнения карты и сокращения, значение счетчика заданий, сообщение о состоянии или описание при Когда задание выполняется, клиент может напрямую взаимодействовать с мастером приложения и каждую секунду опрашивать статус выполнения, ход выполнения и другую информацию о задании (можно установить с помощью параметра mapreduce.client.progressmonitor.pollinterval).

выполнение домашнего задания
  • Когда мастер приложения получает уведомление о завершении последней задачи, он устанавливает статус задания на успешное.
  • Когда задание опрашивает статус задания, оно знает, что задача завершена, затем печатает сообщение, информирующее пользователя, и возвращается из метода waitForCompletion().
  • По завершении задания мастер приложения и контейнер устраняют временные проблемы, такие как результаты промежуточных данных. Вызывается метод commitJob() класса OutputCommiter, и информация о задании архивируется службой истории заданий для будущих запросов пользователя.

процесс перетасовки в MapReduce

Mapreduce обеспечивает сортировку входных данных каждого сокращения по значению ключа. Система выполняет сортировку. Процесс использования входных данных карты в качестве входных данных сокращения называется процессом перемешивания. Перемешивание также является ключевой частью нашей оптимизации. Блок-схема перемешивания показана ниже:

сторона карты
  • Перед созданием карты рассчитывается размер фрагментов файла.
  • Затем он будет разделен в соответствии с фрагментациейизрасчет размераmapизчисло,Для каждого сегмента будет создано задание карты.,или файл(Меньше размера осколка*1,1)создатьmapОперация,Затем настройтеизmapметод Сделайте настройкиизлогический расчет,После завершения расчета он будет записан на локальный диск.。
    • 1. Здесь не пишется напрямую на диск.,Чтобы обеспечить эффективность ввода-вывода,Используемая память с первой записью из кольцевого буфера,и сделать предварительную сортировку(Быстрая сортировка)。буфериз Размер по умолчанию равен100MB(Элементы конфигурации можно изменить с помощьюmpareduce.task.io.sort.mbВнести изменения),При записи в памятьбуферизразмерприезжатьдостичь определенной пропорциичас,По умолчанию80%(Сносноmapreduce.map.sort.spill.percentМодификация элемента конфигурации),Будет запущен поток сброса содержимого буфера памяти на диск (spill to disk),Этот поток переполнения независимиз,не влияетmapКбуфер Писатьрезультатизнить,существовать溢Писатьприезжатьдискизпроцесссередина,карта продолжает вводиться в буфер,Если буфер заполнен во время,ноmapЗапись будет заблокирована на переполненный диск.процесс Заканчивать。Переполнение осуществляется путем опросаизпуть будетбуферв Запись памяти в локальныйmapreduce.cluster.local.dirв каталоге。существовать溢Писатьприезжатьдиск之前,мы будем знатьreduceизколичество,Тогда это будет основано наreduceизколичестворазделять Раздел,По умолчанию на основеhashpartitionверно溢Писатьизданные Писать入приезжать Взаимноверноотвечатьиз Раздел。существоватькаждый Разделсередина,Фоновый поток будет сортироваться по ключу,Итак, переполнение записывается на дискиздокументда Раздели сортироватьиз。если естьcombinerфункция,этосуществовать После сортировкиизвыходбегать,делатьmapвыходболее компактный。Уменьшить запись на дискизданныеипередано вreduceизданные。
    • 2.Каждая кольцевая зона промывкиизпамять доприезжатьпорогчас,Сразу会溢Писатьприезжатьодинновыйиздокумент,Поэтому, когда переполнение карты завершено,,Локальное хранилищесуществовать Несколько Разделвырезать сортировкуиздокумент。существоватьmapЗаканчиватья ставил такиедокументсливаться водин Раздели сортировать(сортировка слиянием)издокумент,Можно передавать параметрыmapreduce.task.io.sort.factorконтроль Сколько можно объединить одновременно?документ。
    • 3.существоватьmapПерезаписать дискизпроцесссередина,верноданные Сжатие можетпредставлять на рассмотрениескоростьизпередача инфекции,Уменьшение дискового ввода-вывода,Уменьшите объем хранилища. Без сжатия по умолчанию,Используйте параметр mapreduce.map.output.compress для управления,Используемый алгоритм сжатияmapreduce.map.output.compress.codecКонтроль параметров。
уменьшить сторону
  • После завершения задачи карты приложение, отслеживающее статус задания Мастер узнает статус выполнения карты и запустит задачу сокращения, приложение Мастер также знает соответствующие отношения сопоставления между выходными данными карты и хостом, а сокращение опрашивает приложение. masterТогда вы знаете, чего хочет хозяинкопироватьизданные。
  • одинMapЗадачаизвыход,может быть несколькоReduceЗадачаползти。каждыйReduceЗадача可能需要НесколькоMapЗадачаизвыходкак нечто особенноеизвходитьдокумент,икаждыйMapЗадачаиз Заканчиватьчас Может варьироваться,Когда задача карты завершена,ReduceЗадача Сразуначинатьбегать。ReduceЗадачав соответствии с Раздел Числосуществовать НесколькоMapвыходсерединаползти(fetch)верноотвечать Разделизданные,этотпроцесстакже СразудаShuffleизcopyпроцесс。。reduceЕсть небольшая суммаизкопироватьнить,Так что это можно распараллелитьизкопироватьmapизвыход,По умолчанию5индивидуальныйнить。Можно передавать параметрыmapreduce.reduce.shuffle.parallelcopiesконтроль。
  • этоткопироватьпроцессиmapзаписать на дискпроцесспохожий,Также есть пороги и размеры памяти.,То же самое можно сделать и с порогомсуществовать Конфигурационный файл Конфигурация,и Объем памятида直接使用reduceизtasktrackerиз Объем памяти,копироватькогдаreduceТакже будут выполняться сортировочные операции.ислитьдокументдействовать。
  • еслиmapвыходочень маленький,нобудеткопироватьприезжатьReducerМестосуществоватьузелиз Памятьбуфер,буфериз Размер можно передатьmapred-site.xmlдокументвmapreduce.reduce.shuffle.input.buffer.percentобозначение。один разReducerМестосуществоватьузелиз Памятьбуфердостигатьприезжатьпорог,Или количество файлов в буфере достигает порога,Переполнение слияния записывается на диск.
  • еслиmapвыход Больше,нонапрямуюкопироватьприезжатьReducerМестосуществоватьузелиздисксередина。вместе сReducerМестосуществоватьузелиздисксередина溢Писатьдокументувеличивать,За кулисаминить会将это们слить为更большой且有序издокумент。когда Заканчиватькопироватьmapвыход,Входитьsortэтап。этотэтаппроходитьсортировка слиянием逐步将Несколькоmapвыход Маленькийдокументсливаться вбольшойдокумент。Последние несколько объединены визбольшойдокументкакreduceизвыход

Подробнее о больших данных Hadoopрядиз Учебные статьи,Видеть:Атака на серию больших данных,Эта серия постоянно обновляется.

Модель программирования MapReduce

Wordcount, который подсчитывает количество вхождений каждого слова в большом количестве документов, часто используется в качестве вводного примера для MapReduce. Основной процесс обработки выглядит следующим образом:

MapReduce делит весь процесс выполнения задания на два этапа: этап карты и этап сокращения.

Mapper отвечает за «разделение», то есть разложение сложных задач на несколько «простых задач» для обработки. «Простая задача» имеет три значения:

  • Масштаб данных или расчетов значительно уменьшается по сравнению с исходной задачей;
  • Принцип бесконтактных вычислений, то есть задачи будут распределяться по узлам, хранящим необходимые данные для расчета;
  • Эти небольшие задачи могут выполняться параллельно, практически не завися друг от друга.

Фаза карты состоит из определенного количества задач карты и включает в себя следующие шаги:

  • Анализ формата входных данных: InputFormat
  • Обработка входных данных: Mapper
  • Локальная агрегация результатов: Комбайнер (локальный редуктор)
  • Группировка данных: Разделитель

Редуктор отвечает за обобщение результатов фазы карты.

Фаза сокращения состоит из определенного количества задач сокращения и включает в себя следующие шаги:

  • Удаленное копирование данных
  • Данные сортируются по ключу
  • Обработка данных: Редуктор
  • Формат вывода данных: OutputFormat

Если взять в качестве примера Wordcount, то внутренний процесс выполнения MapReduce показан на рисунке ниже:

Внешняя физическая структура показана на рисунке ниже:

Комбайнер можно рассматривать как локальный редуктор. После завершения расчета Mapper значения, соответствующие одному и тому же ключу, объединяются (пример Wordcount), как показано на следующем рисунке:

Комбайнер обычно имеет ту же логику, что и Редуктор. Использование Комбайнера имеет следующие преимущества:

  • Уменьшите объем выходных данных Map Task (дисковый ввод-вывод).
  • Уменьшить объем данных, передаваемых по сети Редуц-Мап (сеть IO)

Следует отметить, что не все сценарии MapReduce могут использовать Объединитель. Обычно можно использовать сценарии, в которых можно накапливать результаты вычислений, например Sum. Другие сценарии, например усреднение, не могут использовать Объединитель.

Практическая работа

Настройка локальной среды отладки
  • 1. Установите jdk1.8 в среде Windows.
  • 2. Разархивируйте файл Hadoop, установите переменные среды и скопируйте правильные версии Hadoop.dll и Winutils.exe в каталог bin.
  • 3. Измените соответствующие файлы core-site.xml, hdfs-site.xml, Mapred-site.xml, Yarn-site.xml и измените Hadoop-env.cmd.
  • 4. Инициализация: формат имени узла hdfs.
core-site.xml
Язык кода:javascript
копировать
<property> 
<name>fs.defaultFS</name> 
<value>hdfs://localhost:9000</value> 
</property> 
hdfs-site.xml
Язык кода:javascript
копировать
<property> 
<name>dfs.replication</name> 
<value>1</value> 
</property> 
<property> 
<name>dfs.namenode.name.dir</name> 
<value>D:\software\hadoop\data\namenode</value> 
</property> 
<property> 
<name>dfs.datanode.data.dir</name> 
<value>D:\software\hadoop\data\datanode</value> 
</property> 
<!-- mapred-site.xml--> 
<property> 
<name>mapreduce.framework.name</name> 
<value>yarn</value> 
</property> 
yarn-site.xml
Язык кода:javascript
копировать
<property> 
<name>yarn.nodemanager.aux-services</name> 
<value>mapreduce_shuffle</value> 
</property> 
<property> 
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 
<value>org.apache.hadoop.mapred.ShuffleHandler</value> 
</property> 
hadoop-env.cmd
Язык кода:javascript
копировать
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_271 
set HADOOP_LOG_DIR=%HADOOP_LOG_DIR%\log
Java-операция MapReduce
Язык кода:javascript
копировать
Один MapReduce делится на: Mapper, Редюсер. и Driver。 Несколько MapReduce также могут выполняться последовательно. 
1. Этап картографа 
(1) Пользовательский Mapper должен наследовать свой собственный родительский класс. 
(2) Входные данные Mapper представлены в виде пар KV (тип KV можно настроить) 
(3) Бизнес-логика Mapper записана в методе map(). 
(4) Выходные данные Mapper представлены в виде пар KV (тип KV можно настроить) 
(5)map()метод(MapTaskпроцесс)верно Каждыйодин<K,V>позвони один раз 
2. Ступень редуктора 
(2) Тип входных данных Редюсера соответствует типу выходных данных Mapper, который также равен KV. 
(3) Бизнес-логика Редюсера написана в методе сокращения(). 
(4)ReduceTaskпроцессверно Каждый一Группа Взаимно同kиз<k,v>Группапозвони один разreduce()метод 
3. Водительский этап 
Эквивалент клиента кластера YARN, используемый для отправки всей нашей программы в кластер YARN. 
Объект задания, инкапсулирующий соответствующие рабочие параметры программы MapReduce.
Случай WordCount

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

Язык кода:javascript
копировать
<!-- MAVENСумка--> 
<dependency> 
<groupId>org.apache.hadoop</groupId> 
<artifactId>hadoop-client</artifactId> 
<version>${hadoop.version}</version> 
</dependency> 
//2. Написание локальных тестов кода mapreduce (два распространенных способа). 
//3. Загрузите jar-пакет на сервер для запуска. 
hadoop jar apache-hadoop-1.0-SNAPSHOT.jar com.wxl.hadoop.mapReduce.wordCount.WordCountDriver /mapreduce/input/word.txt /mapreduce/output
Способ первый
Язык кода:javascript
копировать
package com.wxl.hadoop.mapReduce.wordCount; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import java.io.IOException; 
import java.util.Date; 
public class WordCountDriver { 
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
///Локальное тестирование, формальную среду необходимо закомментировать// 
Date date = new Date();//Убедитесь, что выходной каталог не повторяется 
args = new String[]{"D:\\ideawork\\bigdata\\apache-hadoop\\src\\main\\resources\\mapreduce\\input\\word.txt", 
"D:\\ideawork\\bigdata\\apache-hadoop\\src\\main\\resources\\mapreduce\\output\\" + date.getTime()}; 
 
// 1 Получите информацию о конфигурации и получите job объект 
Configuration conf = new Configuration(); 
Job job = Job.getInstance(conf); 
// 2 Связанная версия Driver процедурный jar 
job.setJarByClass(WordCountDriver.class); 
// 3 ассоциация Mapper и Reducer из jar 
job.setMapperClass(WordCountMapper.class); 
job.setReducerClass(WordCountReducer.class); 
// 4 настраивать Mapper выходиз kv тип 
job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(IntWritable.class); 
// 5 настраиватьфинальныйвыход kv тип 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(IntWritable.class); 
// 6 настраиватьвходитьивыходпуть 
FileInputFormat.setInputPaths(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 
// 7 представлять на рассмотрение job 
boolean result = job.waitForCompletion(true); 
System.exit(result ? 0 : 1); 
} 
} 
//Этап карты 
class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 
Text k = new Текст(); //Разделить слова 
IntWritable v = new IntWritable(1);//Счет 
@Override 
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
// 1 Получить ряд 
String line = value.toString(); 
// 2 Вырезано пространством 
String[] words = line.split(" "); 
// 3 выход 
for (String word : words) { 
//Исключаем нулевые значения 
if (word.trim() == "" || word.length() == 0) { 
continue; 
} 
System.out.println("mapвыход>>>" + word); 
// настройкивыходизkey - это сокращение слов 
k.set(word); 
// Считать по словам 
context.write(k, v); 
} 
} 
} 
//Reducer 
class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 
int sum; 
IntWritable v = new IntWritable(); 
@Override 
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
// 1 Собрать и найти 
sum = 0; 
for (IntWritable count : values) { 
sum += count.get(); 
} 
// 2 выход 
v.set(sum); 
// придетсяприезжатьфинальныйизрезультат 
context.write(key, v); 
} 
}
Способ 2
Язык кода:javascript
копировать
package com.wxl.hadoop.mapReduce.wordCount; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
import java.io.IOException; 
import java.util.Date; 
public class WordCountMapReduce extends Configured implements Tool { 
public static void main(String[] args) throws Exception { 
///Локальное тестирование, формальную среду необходимо закомментировать// 
Date date = new Date();//Убедитесь, что выходной каталог не повторяется 
args = new String[]{"D:\\ideawork\\bigdata\\apache-hadoop\\src\\main\\resources\\mapreduce\\input\\word.txt", 
"D:\\ideawork\\bigdata\\apache-hadoop\\src\\main\\resources\\mapreduce\\output\\" + date.getTime()}; 
 
// run job 
int status = ToolRunner.run(new WordCountMapReduce(), args); 
// exit program 
System.exit(status); 
} 
// Driver 
public int run(String[] args) throws Exception { 
// 1 Получите информацию о конфигурации и получите job объект 
Configuration conf = super.getConf(); 
//настраиватьjobимя 
Job job = Job.getInstance(conf, this.getClass().getSimpleName()); 
// 2 Связанная версия Driver процедурный jar 
job.setJarByClass(this.getClass()); 
// 3 ассоциация Mapper и Reducer из jar 
job.setMapperClass(WordCountMapper.class); 
job.setReducerClass(WordCountReducer.class); 
// 4 настраивать Mapper выходиз kv тип 
job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(IntWritable.class); 
// 5 настраиватьфинальныйвыход kv тип 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(IntWritable.class); 
// 6 настраиватьвходитьивыходпуть 
FileInputFormat.setInputPaths(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 
// submit job 
boolean status = job.waitForCompletion(true); 
return status ? 0 : 1; 
} 
//Этап карты 
public static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 
Text k = new Текст(); //Разделить слова 
IntWritable v = new IntWritable(1);//Счет 
@Override 
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
// 1 Получить ряд 
String line = value.toString(); 
// 2 Вырезано пространством 
String[] words = line.split(" "); 
// 3 выход 
for (String word : words) { 
//Исключаем нулевые значения 
if (word.trim() == "" || word.length() == 0) { 
continue; 
} 
System.out.println("mapвыход>>>" + word); 
// настройкивыходизkey - это сокращение слов 
k.set(word); 
// Считать по словам 
context.write(k, v); 
} 
} 
} 
//Reducer 
public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 
int sum; 
IntWritable v = new IntWritable(); 
@Override 
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
// 1 Собрать и найти 
sum = 0; 
for (IntWritable count : values) { 
sum += count.get(); 
} 
// 2 выход 
v.set(sum); 
// придетсяприезжатьфинальныйизрезультат 
context.write(key, v); 
} 
} 
}

Подробнее о больших данных Hadoopрядиз Учебные статьи,Видеть:Атака на серию больших данных,Эта серия постоянно обновляется.

Подвести итог

преимущество
Легко программировать

MapReduce предоставляет пользователям простой интерфейс программирования, а уровень инфраструктуры автоматически выполняет сложные базовые детали обработки, такие как хранение распределения данных, передача данных и отказоустойчивая обработка. Пользователям нужно использовать интерфейс только для реализации собственной логики обработки данных. Другими словами, написание распределенной программы — это то же самое, что написание простой последовательной программы. Именно благодаря этой особенности программирование MapReduce стало очень популярным.

Хорошая масштабируемость

Когда ваши вычислительные ресурсы не могут быть удовлетворены, вы можете расширить его вычислительные возможности, просто добавив машины.

Высокая отказоустойчивость

Первоначальное намерение MapReduce заключалось в том, чтобы обеспечить возможность развертывания программ на дешевых ПК, что требует от него высокой отказоустойчивости. Например, если одна из машин зависает, она может передать для выполнения вышеуказанную вычислительную задачу другому узлу, чтобы задача не вышла из строя. Более того, этот процесс не требует ручного участия и полностью выполняется Hadoop.

Большой объем данных

Он подходит для автономной обработки больших объемов данных уровня PB или выше. Он может реализовать одновременную работу тысяч кластеров серверов и предоставить возможности обработки данных.

недостаток
Плохо справляется с расчетами в реальном времени.

MapReduce не может возвращать результаты в течение миллисекунд или секунд, как MySQL.

Плохо разбираюсь в потоковых вычислениях

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

Плохо справляется с вычислениями DAG (ориентированный ациклический граф).

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

Справочная статья: https://www.jianshu.com/p/a61fd904e2c5. cnblogs.com/liugp/p/16101242.html cnblogs.com/ttzzyy/p/12323259.html blog.csdn.net/qq_38414334/article/details/12047614

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода