Распределенные системы окружают нас сегодня везде. Их наиболее выдающимся примером является Интернет, разбирающийся в World Wide Web. Вычислительная среда в корпоративных вычислительных системах также часто распределяется, связывая различные услуги от человеческих ресурсов, финансовых отделов и систем управления активами. Многие приложения даже размещены в облаке. Наконец, крупномасштабные инженерные и научные вычисления сегодня в значительной степени зависят от кластеров, чтобы параллелизировать свою рабочую нагрузку. Эти темы обсуждаются в моей распределенной вычислительной лекции. В этом репозитории вы можете найти практические примеры, которые я использую в своем курсе.
Гнезда
в C.
на Java
HTML, CSS и JavaScript
Java Servlets
развертываемые примеры
HTTP -прокси сервт
Javaserver страниц
развертываемые примеры
автономные JSPS
Java RMI
XML
Примеры для документов XML и связанных с ними стандартов
Примеры обработки XML с Java
Веб -сервисы
JSON RPC
Передача интерфейса сообщения
Hadoop
Каждая из вышеперечисленных ссылок приводит вас к подчинке, содержащему набор примеров. Каждый подканальный директор имеет собственный файл README.md с подробными описаниями.
Поскольку я также использую тот же код на своих слайдах, есть некоторые специальные комментарии, такие как //(*@serverBox{2)}@*) для форматирования в моих кодах ... Вы можете безопасно их игнорировать ^_ ^
Концепция этого курса заключается в том, что мы хотим понять, как работают сеть и распределенные корпоративные прикладные среды. Мы хотим сделать это, начав изучать, как общаться по сети на самом низком уровне абстракции (обычно), доступного программистам, API сокета. Оттуда мы продвигаемся по шагам более высоких уровней абстракции, т. Е. Проще говоря, и более мощные укладки API друг на друга (и в конечном итоге заземленные в розетках). Таким образом, мы получим четкое понимание того, как распределенные приложения и веб -работа. Мы сможем посмотреть на веб -сайт и сразу же иметь грубое понимание того, как он может работать, вплоть до гайков и болтов. Для каждого уровня абстракции, который мы исследуем, мы всегда изучаем примеры технологий.
Как сказано, мы начинаем с самого дна: сегодня в распределенных системах общение обычно основано на UDP или TCP. Оба протокола доступны через API сокета, для которых мы приводим примеры как в C, так и в Java. Как часть этих примеров, мы также показываем, как текст может быть закодирован на Java и как строить серверы, которые могут обрабатывать несколько запросов параллельно. Таким образом, розетки являются самой основой распределенных приложений, самым низким уровнем, с которым программист может работать.
Теперь мы можем понять основные процессы связи, происходящие практически в любой текущей компьютерной сети и в Интернете. Мы будем использовать это, чтобы понять, как организация или предприятие могут представить себя внешнему миру через веб -сайт. Мы хотим понять технологии, необходимые для построения веб -сайта, который может динамически взаимодействовать с пользователем.
Всемирная паутина основана на трех столпах: HTTP, HTML/CSS/JavaScript и URL. HTTP, протокол передачи гипер текста, является текстовым протоколом для запроса ресурсов, который обычно передается по соединениям TCP. На самом деле, мы уже предоставляем примеры реализации как сервера (веб -сервер), так и клиентского (веб -браузер) клиентской стороной связи HTTP с использованием сокетов (и даже небольшого параллельного веб -сервера. Затем мы предоставляем несколько рудиментарных примеров для HTML, CSS и JavaScript.
Реализация HTTP на основе сокетов довольно сложная. Главы позволяют нам получить доступ к TCP. Мы хотели бы иметь аналогичный элегантный API для доступа к HTTP (следующий более высокий уровень абстракции). Одной из таких технологий являются сервлеты Java. Сервлеты используются для реализации серверной стороны беседы HTTP. Сервлет-это подкласс специального класса Java, который реализует методы обработчика для различных HTTP-взаимодействий («методы HTTP»). Эти методы вызываются контейнером сервлета, фактической реализацией сервера. Поэтому мы можем полностью сосредоточиться на логике приложения и не должны беспокоиться о самом протоколевом взаимодействии. Мы предоставляем широкий спектр примеров для сервлетов Java, как развертываемых примеров, так и автономного сервера HTTP. Таким образом, с Java Servlets мы можем создавать компоненты сервера, которые могут динамически взаимодействовать с клиентом HTTP (например, веб -браузер). Это означает, что мы можем динамически генерировать содержимое веб -страницы, когда браузер запрашивает их. Тем не менее, создание полных динамических веб -сайтов в качестве сервлетов Java снова довольно громоздко, так как сервлеты являются классами Java, а веб -страницы - HTML, которые затем мы будем писать в форме строковых констант, которые будут записаны на вывод сервлета.
Следующим более высоким уровнем абстракции являются страницы Javaserver (JSP), которые позволяют нам писать HTML -страницы (или другие текстовые форматы) и включать в него исходный код Java. Затем страницы снова обслуживаются контейнером сервлета. Всякий раз, когда страница отправляется клиенту, включенный код Java впервые выполняется на стороне сервера (и может генерировать дополнительный вывод). При ближайшем рассмотрении мы можем обнаружить, что JSP на самом деле являются «специальными» сервлетами: когда доступ к JSP доступен в первый раз, контейнер сервлета динамически создает исходный код соответствующего сервлета Java. Этот сервлет скомпилируется, загружается, а затем выполняется для создания динамического содержания страницы для отправки клиенту. Все, что было «текстом» в JSP, становится строкой внутри сервлета, которая записана в HTTP -ответ сервлета. Все, что было «кодом» в JSP, копируется непосредственно в методы сервлета. JSP являются более естественным способом динамического генерации вывода текста (HTML) и подавать его клиенту. К настоящему времени у нас есть четкое понимание того, как можно генерировать динамическое содержание в Интернете, как пользователь может взаимодействовать с веб -приложением через веб -формы, используя ее браузер и как мы можем реализовать сеансы.
Хотя эти технологии позволяют нам создавать динамичный «внешний» представление о компании, способ представлена компания в Интернете, теперь мы исследуем представление «внутренняя» распределенная корпоративная вычислительная среда. Здесь цель состоит в том, чтобы построить среду, в которой заявки из разных департаментов (финансовый отдел, человеческие ресурсы, управление активами, ...) могут быть связаны друг с другом в будущем безопасном, расширяемом способе.
Первым шагом на этой дороге к предприятию вычисления являются удаленные вызовы процедуры (RPCS), которые мы исследуем на примере вызова удаленного метода Java (RMI). Наши примеры показывают, как объект одного приложения, размещенного на компьютере, можно получить от другой программы, работающей на другом компьютере. Это приближает нас к тому, чтобы реализовать распределенные приложения, взаимосвязанные в сети. Тем не менее, Java RMI по-прежнему является технологией, специфичной для Java, и ее протокол является бинарным. Мы хотели бы внедрить наши распределенные приложения независимым от платформы, используя очень четкие, хорошо упомянутые и простые для понимания протоколы.
Наше стремление к такой технологии заставляет нас сначала взять на себя обстоятельство изучения об расширяемом языке разметки (XML. XML является самодокументированием форматом для хранения сложных структур данных в тексте. Это похоже на HTML, но без каких-либо предварительно определенных семантических или представления. Они могут быть указаны для каждого приложения. Мы оба ищут примеры для примеров и самим в связи с ним.
Затем мы обсудим веб -службы. Веб-сервисы являются основной основой многих распределенных корпоративных вычислительных систем и сервисных архитектур. Они вызываются с использованием протокола мыла на основе XML, как правило, на HTTP. Их интерфейс и предоставленная функциональность описана через язык описания веб -службы (WSDL), еще один стандарт XML. Основываясь на том, что мы уже знаем, теперь мы могли бы отправить данные XML в сервис Java через http-post, разобрать эти данные с этими технологиями обработки Java XML, используйте те же технологии для генерации выходного XML-документа и отправить этот ответ в качестве ответа сервиса Java. На самом деле, мы могли бы даже использовать страницы Javaserver для этой цели. Тем не менее, снова есть более простой способ: мы можем создавать услуги как простые объекты Java и публиковать их на сервере Apache Axis2/Java. Сервер сделает их доступными через SOAP и автоматически генерирует описания WSDL. Затем их можно использовать для генерации прокси -объектов для клиента, например, Maven. Мы исследуем эту технологию по нескольким примерам.
JSON RPC - это еще один подход к удаленной процедуре (RPC) (указанный здесь), где обмененные структуры данных кодируются в нотации объекта JavaScript (JSON). Данные обмениваются через HTTP или TCP. RCP JSON аналогичны веб-службам, но предназначены для того, чтобы быть более легкими. Мы снова обсудим несколько примеров.
Как последний важный вариант использования для распределенных вычислений, мы рассмотрим, как можно реализовать крупномасштабные распределенные вычисления. Такие вычисления необходимы во многих сценариях, начиная от моделирования в инженерии до интеллектуального анализа данных и обработки на предприятиях.
Теперь мы сосредоточимся на том, как можно использовать вычислительную силу массивных кластеров для крупномасштабных научных и инженерных вычислений. Такие большие вычисления или симуляции часто делятся на несколько меньших подпрограмм. Эти меньшие проблемы затем решаются совместно с помощью нескольких потоков или процессов параллельно. Это часто включает в себя обмен сообщениями через регулярные временные интервалы между процессами, работающими над тесно связанными подпроблемами. Очевидно, что веб-сервисы, сервлеты Java или даже Java и HTTP-протокол, будут неверными технологиями для этого: для крупномасштабных вычислений мы хотим получить как можно более эффективное с максимально возможными накладными расходами. Это особенно касается общения, которое очень дорого, и ограничивающий фактор для ускорения, который мы можем достичь с помощью распределения. Мы хотим эффективно обмениваться примитивными типами данных, и мы хотим использовать парадигмы связи, не поддерживаемые HTTP/TCP, такими как трансляции, многоадресные рассылки и асинхронная связь. Для этого реализацией интерфейса передачи сообщения (MPI) будет методом выбора. Мы исследуем эту технологию на основе нескольких примеров на языке программирования C.
На последнем этапе мы обсудим технологию, которая объединяет способность создавать крупномасштабные распределенные вычисления (из мира MPI) с богатой поддержкой инструментов экосистемы Java: MapReduce с Apache Hadoop. MPI-это технология выбора, если общение является дорогостоящей, а узкое место нашего приложения требуется частая связь между процессами, решающими связанные подпрограммы, доступное оборудование является гомогенным, процессы должны быть организованы в группах или топологических структурах, чтобы эффективно использовать коллективные коммуникации для достижения высоких показателей, размер данных, которые необходимо пройти, с тем, что мы не должны быть в целях, не связаны с тем, что мы многое переживаем. Гетерогенная распределенная среда приложения. Hadoop, on the other hand, covers use cases where communication is not the bottleneck, because computation takes much longer than communication (think Machine Learning), when the environment is heterogeneous, processes do not need to be organized in a special way and the division of tasks into sub-problems can be done efficiently by just slicing the input data into equal-sized pieces, where sub-problems have batch job character, where data is unstructured (eg, text) and Потенциально огромный (поедание преимуществ связи в стиле MPI), или откуда поступают данные и результаты должны быть направлены в другие приложения в окружающей среде, скажем, в стеки HTTP/Java Servlet/Web Services. Наши примеры Hadoop фокусируются на рисунке MapReduce (который немного похож на разброс/сбор/уменьшение в MPI, только для сценария, описанного выше).
В целом, этот курс даст вам приблизительное понимание доминирующих технологий в различных областях распределенных вычислений, от динамических веб-сайтов над распределенными системами приложений в компании, до распределенных инженерных и научных вычислений. Каждое поле исследуются с практическими примерами, и вы получаете тестирование и поиграть с несколькими примерами технологий.
Для каждого примера я явно перечисляю необходимое программное обеспечение и обсуждаю, как его можно получить и установить. Здесь я даю обзор этих программных компонентов.
Большинство примеров, которые я предоставляю, написаны на языке программирования Java и могут работать в рамках произвольных систем, учитывая, что Java установлен. Чтобы скомпилировать их, вам нужен установлен JAVA JDK. Мои примеры требуют Java 7 или более поздней версии.
Под Windows вам нужно загрузить и установить Java с веб -сайта Oracle.
Под Linux вы сделаете sudo apt-get install openjdk-7-jdk (где вы можете заменить 7 на любую более позднюю версию, такую как 8 , если хотите)
Некоторые из моих примеров Java построены с Maven. Все эти примеры имеют файл pom.xml в их корневой папке. Чтобы построить их, вам нужно установить Maven.
Под Windows вам нужно загрузить и установить Maven с сайта Apache.
Под Linux вы бы сделали sudo apt-get install maven .
Если вы используете Eclipse (см. Ниже), вам не нужно устанавливать Maven, поскольку он уже интегрирован в Eclipse.
Я рекомендую Eclipse в качестве среды разработчика для всех примеров Java в этом репозитории. Каждый пример Java на самом деле уже поставляется с файлом Eclipse .project и с Eclipse .settings . Eclipse интегрирует как Maven, так и Git. Это означает, что вы можете клонировать этот репозиторий из Eclipse и напрямую импортировать проекты Jave в течение этого процесса. Если вы затем щелкните правой кнопкой мыши проекты Maven и выберете Maven -> Update Project... , Eclipse также загрузит и использует все необходимые библиотеки и зависимости, как указано Maven pom.xml для вас.
Вы можете скачать Eclipse с веб -сайта Eclipse. Я рекомендую использовать хотя бы затмение Mars.1 для его превосходной поддержки Maven и GIT.
Для запуска некоторых примеров страниц Java Servlets и Javaserver вам необходимо загрузить сервер Glassfish с соответствующего веб -сайта. Я рекомендую использовать хотя бы стеклянную рыбу 4.1.2.
Для запуска примеров веб -службы вам нужно будет загрузить Apache Axis2/Java с соответствующей страницы загрузки. Я рекомендую использовать хотя бы axis2 1.7.3.
Чтобы скомпилировать примеры, написанные на языке программирования C (например, примеры сокетов на C ), вам понадобится компилятор C, такой как GCC. При Linux он обычно уже должен быть установлен и может быть установлен через sudo apt-get install gcc . Под Windows вам нужно будет установить Mingw, обычно через веб -установщик.
Несколько примеров C приходят для Windows или Linux. GCC позволяет вам перекрестно компилировать, т.е., если вы используете Linux, вы можете компилировать программы C для Windows. Для этого вы сначала установили бы sudo apt-get install gcc-mingw-w64-i686 а затем сможете использовать команду gcc-mingw-w64-i686 так же, как вы будете использовать gcc под Mingw.
Чтобы создать и составить наши примеры для использования интерфейса прохождения сообщения (MPI), нам нужна реализация MPI. Мы выбираем mpich.
Под Linux вы можете установить необходимые файлы через sudo apt-get install mpich libmpich-dev .
ssh и rsync ) Чтобы проверить наши примеры Hadoop, теперь нам нужно настроить одно узел Hadoop Cluster. Поэтому мы следуем руководству, данному по адресу http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. Нам нужно установить предварительные результаты, такие как ssh и rsync . В примере Hadoop Readme мы предоставляем руководство по установке для Hadoop 2.7.2 Linux / Ubuntu. Это сводится к загрузке и установке Hadoop из одного из зеркал, предоставленных по адресу http://www.apache.org/dyn/closer.cgi/hadoop/common/, плюс следуя руководящим принципам связанного урока.
Эта работа имеет чисто образовательные цели. Помимо всего, что упомянуто ниже, для чего -либо в этом хранилище я налагаю одно дополнительное условие лицензирования: кодекс никогда не должен использоваться для чего -либо, что может нарушать законы Германии, Китая или США. Это также содержится для любого другого файла или ресурса, предоставленного здесь.
Примеры в этом хранилище лицензированы в соответствии с общедоступной лицензией GNU, версии 3, 29 июня 2007 г., за следующие исключения:
Все в каталогах /javaserverpages /stantalonejspswithjetty и /javaservlets /proxy лицензируется в соответствии с лицензией Apache v2.0 и частично получено из проекта Encedded-Jet-JSP с Copyright (C) 1995-2013 Mort Bay Consulting Pty. Ltd.
Некоторые из примеров Hadoop черпают вдохновение от Maven-Hadoop-Java-WordCount-Template от H3ML3T, для которой не предоставляется информация о лицензировании. Примеры, например, совершенно по -разному, например, в том, как мы строим жирные банки. Во всяком случае, этот оригинальный проект хорошо описан в этой записи в блоге.
Кроме того, наше слово «Hadoop» основано на известном примере подсчета слов для карты Hadoop снизить функциональность. Он основан на версии, предоставленной Luca Menicetti [email protected] под общей публичной лицензией GNU версии 2.