Статьи

HDInsight, написание карты Hadoop, сокращение рабочих мест в C # и обратный запрос результатов с использованием LINQ


Azure HD Insight Services — это 100% -ная реализация Apache Hadoop поверх облачной экосистемы Microsoft Azure. 

В этом посте мы рассмотрим

  1. HDInsight / Hadoop в Azure в целом и шаги для начала с того же
  2. Написание карты Сокращение заданий для Hadoop с использованием C #, в частности, для хранения результатов в HDFS.
  3. Перенос данных результатов из HDFS в Hive
  4. Чтение данных обратно из улья с использованием C # и LINQ

Предисловие

Если вы новичок в концепциях Hadoop и Big Data, я предлагаю вам быстро проверить

Есть несколько способов начать работу с HDInsight.

Шаг 1: Настройка вашего экземпляра локально в вашей Windows

Для разработки я настоятельно рекомендую вам установить версию для разработчиков HDInsight локально — вы можете найти ее прямо в установщике веб-платформы .

После локальной установки HDInsight убедитесь, что запущены все службы Hadoop.

образ

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

Вот панель управления HDInsight, работающая локально.

образ

И теперь вы настроены.

Шаг 2: Установите пакет Map Reduce через Nuget

Давайте рассмотрим, как написать несколько заданий Map Reduce в C #. Мы напишем быструю работу по подсчету пространств имен из исходных файлов C # Ранее, в нескольких постах, связанных с Hadoop в Azure — Анализ некоторых «больших данных» с использованием C # и извлечение 500 лучших ссылок MSDN из переполнения стека — я показал, как использовать C # Map Сократите количество рабочих мест с помощью потоковой передачи Hadoop, чтобы провести значимую аналитику. В этом посте мы переписываем маппер и редуктор, используя новый доступный .NET SDK, и применим его к нескольким файлам кода (вы можете применить это к любому набору данных).

Новый .NET SDK для Hadoop позволяет очень легко работать с Hadoop из .NET — с большим количеством типов для поддержки Map Reduce Jobs, для создания запросов LINQ to Hive и т. Д. Кроме того, SDK предоставляет более простой способ создания и отправки ваших собственных Сопоставьте задачи непосредственно в C # либо с локальным экземпляром разработчика, либо с кластером Azure Hadoop. 

Для начала создайте консольный проект и установите пакет Microsoft.Hadoop.Mapreduce через Nuget.

Install-Package Microsoft.Hadoop.Mapreduce

Это добавит необходимые зависимости.

Шаг 3: Написание вашего картографа и редуктора

Картограф будет читать входные данные из файловой системы HDFS, а модуль записи будет передавать выходные данные в HDFS. HDFS — это распределенная файловая система Hadoop, которая гарантирует высокую доступность. Извлекает архитектуру руководства Apache HDFS для деталей .

С помощью Hadoop SDK вы можете наследовать свой Mapper от класса MapperBase , а Reducer от класса ReducerCombinerBase . Это эквивалентно независимым файлам Mapper и Reducer, которые я продемонстрировал ранее при использовании потоковой передачи Hadoop, просто у нас есть лучший способ сделать то же самое. В методе Map мы просто извлекаем объявления пространства имен, используя reg ex для их генерации (см. Подробности потоковой передачи hadoop в моей предыдущей статье)

    //Mapper
    public class NamespaceMapper : MapperBase
    {
        //Override the map method.
        public override void Map(string inputLine, MapperContext context)
        {
            //Extract the namespace declarations in the Csharp files
            var reg = new Regex(@"(using)\s[A-za-z0-9_\.]*\;");
            var matches = reg.Matches(inputLine);

            foreach (Match match in matches)
            {
                //Just emit the namespaces.
                context.EmitKeyValue(match.Value,"1");
            }
        }
    }

    //Reducer
    public class NamespaceReducer : ReducerCombinerBase
    {
        //Accepts each key and count the occurrances
        public override void Reduce(string key, IEnumerable<string> values, 
            ReducerCombinerContext context)
        {
            //Write back  
            context.EmitKeyValue(key,values.Count().ToString());
        }
    }

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

Шаг 4: Написание вашего задания счетчика пространства имен

Вы можете просто указать свои типы Mapper и Reducer и наследовать от HadoopJob, чтобы создать класс задания. Вот так.

   //Our Namespace counter job
    public class NamespaceCounterJob : HadoopJob<NamespaceMapper, NamespaceReducer>
    {
        public override HadoopJobConfiguration Configure(ExecutorContext context)
        {
            var config = new HadoopJobConfiguration();
            config.InputPath = "input/CodeFiles";
            config.OutputFolder = "output/CodeFiles";
            return config;
        }
    }

Обратите внимание, что мы переопределяем метод Configure, чтобы указать параметры конфигурации. В этом случае мы указываем папки ввода и вывода для нашего преобразователя / преобразователя. Строки в файлах во входной папке будут переданы нашим экземплярам преобразователя, а объединенный вывод из экземпляров преобразователя будет помещен в выходную папку.

Шаг 5: Отправка работы

Наконец, нам нужно подключиться к кластеру и отправить задание, используя метод ExecuteJob. Здесь мы идем с основным водителем.

class Program
    {
        static void Main(string[] args)
        {
            var hadoop = Hadoop.Connect();
            var result=hadoop.MapReduceJob.ExecuteJob<NamespaceCounterJob>();
        }
    }

Мы вызываем метод ExecuteJob, используя только что созданный тип NamespaceCounterJob. В этом случае мы отправляем задание локально — если вы хотите отправить задание в кластер Azure HDInsight для фактического сценария выполнения, вы должны передать параметры соединения Azure. Подробности здесь

Шаг 6: Выполнение работы

Перед выполнением задания вы должны подготовить свой ввод — в этом случае вы должны скопировать файлы исходного кода в папку ввода, которую мы предоставили как часть конфигурации при создании нашего задания (см. NamespaceCounterJob). Для этого запустите консоль командной строки Hadoop с рабочего стола. Если ваш кластер работает в Azure, вы можете выполнить удаленный вход в головной узел кластера, выбрав «Удаленный вход» на панели мониторинга HDInsight.

  • Создайте папку с помощью / Hadoop фс -mkdir ввода CodeFiles команды
  • Скопируйте несколько файлов CSharp в вашу папку, используя hadoop fs –copyFromLocal your \ path \ *. Cs input / CodeFiles

Смотрите, я копирую все мои файлы CS в папке BasicsRevisited для ввода / CodeFiles.

образ

Теперь создайте свой проект в Visual Studio, откройте папку bin и запустите исполняемый файл. Это приведет к запуску MRRunner.exe, и ваша работа по уменьшению карты будет выполнена (имя моего исполняемого файла просто MapReduce.exe). Вы можете видеть, что обнаруженные зависимости файлов автоматически отправляются.

образ

После завершения задания Map Reduce вы обнаружите, что объединенный вывод будет помещен в папку output / CodeFiles. Вы можете выполнить команды –ls и –cat, чтобы вывести список файлов и просмотреть содержимое файла part-00000, в который будут помещены выходные данные (да, иногда немного знаний о Linux помогут Подмигивающая улыбка). Файл part-00000 содержит комбинированный вывод нашей задачи — посмотрите пространства имен вместе с их количеством из файлов, которые я отправил.

образ

Шаг 7: Загрузка данных из HDFS в Hive

В качестве следующего шага, давайте загрузим данные из HDFS в Hadoop Hive, чтобы мы могли делать то же самое. Мы создадим таблицу с использованием синтаксиса улья CREATE TABLE и загрузим данные. Вы можете запустить команду ‘hive’ из командной строки Hadoop, чтобы выполнить следующие операторы.

CREATE TABLE nstable (
  namespace STRING,
  count INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

LOAD DATA INPATH 'output/CodeFiles/part-00000' into table nstable;

И вот что вы можете увидеть.

образ

Теперь вы можете прочитать данные из улья.

И вот, пожалуйста. Теперь вы знаете все о написании собственных Hadoop Map Reduce Jobs в C #, загрузке данных в Hive и запросе то же самое в C # для визуализации ваших данных. Удачного кодирования.