Пора сделать что-то осмысленное с C #, Azure и Apache Hadoop. В этой статье мы рассмотрим, как создать Mapper и Reducer в C #, чтобы проанализировать популярность пространств имен в сообщениях переполнения стека. Прежде чем мы начнем, давайте кратко рассмотрим концепции Hadoop и Map Reduce.
Краткое введение в карту уменьшить
Map / Reduce — это модель программирования для обработки безумно больших наборов данных, изначально реализованная Google . Функции Map и Reduce довольно просты для понимания.
- Карта (список) -> Список ключей, значения
- Функция Map обработает набор данных и разделит его на несколько пар ключ / значение
- Агрегат, Группа
- Каркас Map / Reduce может выполнять такие операции, как группировка, сортировка и т. Д. На выходе функции Map. Группировка будет выполняться на основе ключей, а значения для данного ключа передаются в метод Reduce.
- Уменьшить (Ключ, Список значений для ключа) -> Другой список ключей, Значение
- Метод Reduce обычно может выполнять агрегатную функцию (сумма, среднее или даже другие сложные функции) для всех значений для данного ключа.
Интересным аспектом является то, что вы можете использовать инфраструктуру Map / Reduce, такую как Apache Hadoop, для иерархического распараллеливания операций Map / Reduce на наборе больших данных. Инфраструктура M / R будет нести ответственность за несколько операций, включая развертывание методов Map и Reduce на нескольких узлах, агрегирование выходных данных от методов map, передачу их в метод Reduce, заботясь о отказоустойчивости в случае, если узел идет вниз и т. д.
Ayende @ Rahien предлагает отличное визуальное объяснение, если вы новичок в этой концепции.
Apache Hadoop и Hadoop Streaming
Apache Hadoop — очень зрелая среда распределенных вычислений, которая обеспечивает функциональность Map / Reduce .
Потоковая передача Hadoop — это утилита, которая поставляется вместе с Apache Hadoop, и эта утилита позволяет создавать и запускать сопоставления / сокращения заданий с любым исполняемым файлом. Исполняемые файлы Map и Reduce будут считывать / записывать данные с / на консоль, если вы используете потоковую передачу Hadoop, а Hadoop будет выполнять необходимую передачу данных на ваш картограф / редуктор.
В головном узле Hadoop вы можете запустить следующую команду, чтобы инициировать задание карты / сокращения. Не беспокойтесь, так как позже вы увидите, что панель инструментов Hadoop, которую мы используем в Azure, предоставит нам достойный пользовательский интерфейс для создания команды Map / Reduce, в то время как мы создаем новое Map Reduce Job.
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper <yourmapperexecutable>\ -reducer <yourreducerexecutable>
В настоящее время версия Hadoop для предварительного просмотра для разработчиков доступна в Windows Azure, поэтому вы можете перейти на https://www.hadooponazure.com/ и войти в систему, чтобы создать свои собственные кластеры Hadoop и выполнить задания Map / Reduce. После регистрации вы можете использовать интерактивную консоль Javascript для взаимодействия с кластером Hadoop.
Настройка вашего кластера Hadoop в Azure
Вы можете легко настроить кластер Hadoop в Azure, войдя на страницу https://www.hadooponazure.com/ . Запросите кластер и дайте ему имя. Я запрашиваю кластер с именем Stackanalyzer, чтобы я мог получить доступ к тому же @ stackanalyzer.cloudapp.net для удаленного входа и т. Д.
Вам нужно подождать несколько минут, пока ваш кластер не будет подготовлен. После завершения настройки кластера вы можете получить доступ к панели мониторинга кластера. Вы можете получить доступ к кластеру через интерактивную консоль Javascript / Hive, через удаленный рабочий стол и т. Д. В этом примере мы будем использовать консоль Javascript для загрузки наших картографических файлов, редукторов и файлов данных в кластер.
Получение данных Stackoverflow для анализа
Теперь давайте проанализируем некоторые реальные данные. Вы можете перейти в обозреватель данных Stack Exchange , составить запрос и загрузить некоторые данные. Вы можете выполнить следующий запрос с http://data.stackexchange.com/stackoverflow/query/new, чтобы получить данные некоторых сообщений. Вы можете выполнить любой запрос или использовать данные постов из всего дампа данных Stackoverflow, это только пример.
select top 10000 Posts.id, Posts.body from posts where posts.ViewCount>10000
Загрузите данные в виде файла CSV и сохраните их под именем «data.csv» — и держите их под рукой, чтобы позже мы загрузили их в кластер.
Создание наших приложений Mapper и Reducer в C #
Теперь давайте создадим наши приложения Mapper и Reducer в C #. Запустите Visual Studio и создайте два консольных приложения C #. Убедитесь, что при компиляции этих приложений вы компилируете их в режиме выпуска, чтобы мы могли развернуть их в кластере Hadoop. Код в нашей программе отображения выглядит следующим образом. Как только мы запускаем задание, Hadoop Streamer поочередно передает строки нашего CSV-файла данных Stackoverflow нашему Mapper. Итак, давайте воспользуемся регулярным выражением, чтобы найти все объявления пространства имен C #, начиная с System, и вывести найденные совпадения.
//Simple mapper that extracts namespace declarations using System.IO; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace StackOverflowAnalyzer.Mapper { class Program { static void Main(string[] args) { string line; Regex reg=new Regex(@"(using)\s[A-za-z0-9_\.]*\;"); while ((line = Console.ReadLine()) != null) { var matches = reg.Matches(line); foreach (Match match in matches) { Console.WriteLine("{0}", match.Value); } } } } }
Таким образом, если вы введете строку с кодом, имеющим несколько объявлений пространства имен, приведенный выше код будет выводить объявления пространства имен в коде C # построчно. Это будет вход в наш Редуктор после группировки + сортировки по структуре M / R. Вот код для нашего приложения Редуктор. Таким образом, в редукторе мы, в основном, подсчитываем вхождение каждого пространства имен и записываем его обратно в консоль со счетчиком в качестве значения и строкой объявления пространства имен в качестве ключа.
using System.IO; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StackOverflowAnalyzer.Reducer { class Program { static void Main(string[] args) { string ns, prevns = null; int nscount = 0; while ((ns = Console.ReadLine()) != null) { if (prevns != ns) { if (prevns != null) { Console.WriteLine("{0} {1}", prevns, nscount); } prevns = ns; nscount = 1; } else { nscount += 1; } } Console.WriteLine("{0} {1}", prevns, nscount); } } }
Опять же, обратите внимание, что вам нужно скомпилировать как маппер, так и редуктор в режиме Release.
Развертывание файлов Mapper, Reducer и Data в кластере Azure Hadoop.
Перейдите на панель мониторинга кластера Azure Hadoop и выберите консоль Javascript.
- Консоль Javascript предоставляет некоторые служебные методы, такие как fs.put () для загрузки файлов в HDFS. Введите help () для просмотра нескольких служебных команд.
- Вы можете запускать команды Apache Pig из Javascript. Вы можете считать, что Pig — это почти распределенный LINQ, и вам понравятся команды Pig, поскольку они схожи с концепциями Linq. В этом примере мы не используем Pig.
- Вы можете выполнять команды файловой системы Hadoop из консоли Javascript, используя префикс # — пример #ls для вывода списка файлов или #cat <filepath> для просмотра содержимого файла (освежите свои навыки работы с Unix / Linux )
Давайте загрузим в кластер маппер, редуктор и наш файл данных csv. В консоли Javascript введите fs.put (), просмотрите исполняемый файл Mapper, и я загружаю его в папку назначения /so/bin/mapper.exe.
Точно так же вы можете
- Загрузите исполняемый файл Reducer в папку /so/bin/reducer.exe
- Загрузите наш файл данных Stackoverflow CSV в каталог /so/data/data.csv
Иногда я обнаружил, что веб-загрузчик не будет работать для больших наборов данных — в этом случае вы можете удаленно войти в свой узел с панели инструментов и использовать командную оболочку Hadoop для копирования файлов в HDFS из вашего локальная файловая система. Если вы загрузили CSV по локальному пути вашего узла имени кластера d: \ data.csv, вы можете выполнить команду Hadoop FSShell, например, чтобы скопировать файл в нужное место.
hadoop fs -put d:\data.csv /so/data/data.csv
Вы можете проверить, что ваши файлы в порядке с консоли Javascript, введя команды #ls / so / bin и #ls / so / data . Теперь у вас есть вкусности в кластере, давайте выполним эту работу сейчас.
Создание и выполнение задания
Вы можете создать задание для выполнения либо из панели инструментов, либо непосредственно из командной оболочки Hadoop. Для простоты давайте создадим новую работу с помощью панели инструментов. Вам нужен файл hadoop-streaming.jar для создания нового потокового задания, поэтому вы можете загрузить его из списка файлов примеров C # Streaming в разделе Samples на панели инструментов Hadoop Azure. Загрузите и держите файл hadoop-streaming.jar под рукой. Кроме того, просто запишите свой IP / URL Hadoop Node, для этого вы можете проверить содержимое файла core-site.xml, введя следующую команду в консоли Javascript
#cat file:///apps/dist/conf/core-site.xml
Итак, давайте продолжим и создадим задание из панели мониторинга Hadoop for Azure. В новой панели управления заданиями укажите значения для файлов, параметров ввода, вывода, сопоставления и редуктора. Кроме того, выберите hadoop-streaming.jar в качестве файла JAR. Пожалуйста, убедитесь, что вы используете свой фактический IP / URL, который вы получили на предыдущем этапе, вместо моего
Hadoop jar hadoop-streaming.jar -files "hdfs://10.26.72.64:9000/so/bin/mapper.exe,hdfs://10.26.72.64:9000/so/bin/reducer.exe" -input "/so/data/data.txt" -output "/so/data/output" -mapper "mapper.exe" -reducer "reducer.exe"
На случай, если вы столкнетесь с ошибками, убедитесь, что вы правильно указали все пути к файлам, и между URL в параметре files нет места. Если все идет хорошо, вы получите следующий экран результатов.
Теперь из консоли Javascript проверьте вывод задания ниже.
js> #cat /so/data/output/part-00000
Вы можете узнать, сколько раз эти пространства имен использовались в наборе сообщений, которые мы исследовали. Такие задачи можно запускать во всем наборе данных, будь то Stackoverflow или некоторые другие наборы данных, для распараллеливания анализа или расчетов с помощью Azure и Hadoop.
using ; 1 using B; 1 using BerkeleyDB; 1 using Castle.Core.Interceptor; 1 using Castle.DynamicProxy; 1 using ClassLibrary1; 1 using ClassLibrary2; 1 using Dates; 1 using EnvDTE; 2 using G.S.OurAutomation.Constants; 1 using G.S.OurAutomation.Framework; 2 using HookLib; 1 using Ionic.Zip; 1 using Linq; 1 using MakeAggregateGoFaster; 1 using Microsoft.Build.BuildEngine; 1 using Microsoft.Build.Framework; 2 using Microsoft.Build.Utilities; 2 using Microsoft.Office.Interop.Word; 1 using Microsoft.SharePoint.Administration; 1 using Microsoft.SqlServer.Management.Smo; 1 using Microsoft.SqlServer.Server; 1 using Microsoft.TeamFoundation.Build.Client; 1 using Microsoft.TeamFoundation.Build; 1 using Microsoft.TeamFoundation.Client; 1 using Microsoft.TeamFoundation.WorkItemTracking.Client; 1 using Microsoft.Web.Administration; 1 using Microsoft.Web.Management.Server; 1 using Microsoft.Xna.Framework.Graphics; 1 using Microsoft.Xna.Framework; 1 using Mono.Cecil.Cil; 1 using Mono.Cecil.Rocks; 1 using Mono.Cecil; 1 using NHibernate.SqlCommand; 1 using NHibernate; 1 using NUnit.Framework; 1 using Newtonsoft.Json; 1 using Spring.Context.Support; 1 using Spring.Context; 1 using StructureMap; 1 using System.Collections.Generic; 31 using System.Collections.ObjectModel; 2 using System.Collections; 3 using System.ComponentModel.DataAnnotations; 1 using System.ComponentModel.Design; 1 using System.ComponentModel; 7 using System.Configuration; 1 using System.Data.Entity; 1 using System.Data.Linq.Mapping; 1 using System.Data.SqlClient; 3 using System.Data.SqlTypes; 1 using System.Data; 4 using System.Diagnostics.Contracts; 3 using System.Diagnostics; 15 using System.Drawing.Design; 1 using System.Drawing; 3 using System.Dynamic; 3 using System.IO.Compression; 1 using System.IO.IsolatedStorage; 1 using System.IO; 11 using System.Linq.Expressions; 4 using System.Linq; 21 using System.Management; 1 using System.Net; 1 using System.Reflection.Emit; 6 using System.Reflection; 9 using System.Resources; 1 using System.Runtime.Caching; 1 using System.Runtime.CompilerServices; 3 using System.Runtime.ConstrainedExecution; 3 using System.Runtime.InteropServices.ComTypes; 3 using System.Runtime.InteropServices; 14 using System.Runtime.Remoting.Messaging; 1 using System.Runtime.Serialization; 1 using System.Security.Cryptography; 1 using System.Security.Principal; 1 using System.Security; 2 using System.ServiceModel; 1 using System.Text.RegularExpressions; 2 using System.Text; 17 using System.Threading.Tasks; 2 using System.Threading; 8 using System.Web.Caching; 1 using System.Web.Configuration; 1 using System.Web.DynamicData; 1 using System.Web.Mvc; 4 using System.Web.Routing; 1 using System.Web; 4 using System.Windows.Controls.Primitives; 1 using System.Windows.Controls; 4 using System.Windows.Forms.VisualStyles; 1 using System.Windows.Forms; 9 using System.Windows.Input; 3 using System.Windows.Media; 2 using System.Windows.Shapes; 1 using System.Windows.Threading; 1 using System.Windows; 4 using System.Xml.Serialization; 4 using System.Xml; 2 using System; 112 using WeifenLuo.WinFormsUI.Docking; 1 using base64; 1 using confusion; 1 using directives; 1 using mysql; 1 using pkg_ctx; 1 using threads; 1
Вывод
В этом посте мы рассмотрели, как настроить кластер Hadoop в Azure, и, что более важно, как развернуть вашу карту C #. Здесь есть огромный потенциал, и вы можете начать писать свои C # Map / Reduce задания для решения проблем больших данных вашей организации . Наслаждайтесь и счастливого кодирования.
Обновлено: только что извлечены 500 лучших ссылок MSDN из сообщений Stackoverflow, подробности здесь .