분산 시스템은 오늘날 어디에서나 우리를 둘러싸고 있습니다. 가장 두드러진 예는 월드 와이드 웹을 호스팅하는 인터넷입니다. 엔터프라이즈 컴퓨팅 시스템의 컴퓨팅 환경은 종종 인적 자원, 금융 부서, 자산 관리 시스템과 다른 서비스를 서로 연결하여 배포됩니다. 많은 응용 프로그램이 클라우드에서 호스팅됩니다. 마지막으로, 오늘날 대규모 엔지니어링 및 과학 컴퓨팅은 워크로드를 병렬화하기 위해 클러스터에 크게 의존합니다. 이 주제는 배포 된 컴퓨팅 강의에서 논의됩니다. 이 저장소에서는 코스에서 사용하는 실제 예제를 찾을 수 있습니다.
소켓
c
자바에서
HTML, CSS 및 JavaScript
자바 서블릿
배포 가능한 예
HTTP 프록시 서블릿
Javaserver 페이지
배포 가능한 예
독립형 JSP
Java RMI
XML
XML 문서 및 관련 표준의 예
Java를 사용한 XML 처리의 예
웹 서비스
JSON RPC
메시지 전달 인터페이스
Hadoop
위의 각 링크는 예제 세트를 포함하는 하위 디렉토리로 연결됩니다. 각 하위 디렉토리에는 자세한 설명이있는 자체 README.md 파일이 있습니다.
내 슬라이드에서 동일한 코드를 사용하므로 내 코드에서 형식화하기위한 //(*@serverBox{2)}@*) 와 같은 특별한 주석이 있습니다 ... 안전하게 무시할 수 있습니다 ^_ ^.
이 과정의 개념은 웹 및 배포 된 엔터프라이즈 응용 프로그램 환경의 작동 방식을 이해하고 싶다는 것입니다. 우리는 프로그래머 인 소켓 API가 사용할 수있는 가장 낮은 추상화 (일반적으로)에서 네트워크를 통해 통신하는 방법을 탐색하여 그렇게하고 싶습니다. 거기서부터 우리는 단계별로 높은 수준의 추상화, 즉 서로 위에 더 단순하고 강력한 API 스태킹 (그리고 궁극적으로 소켓에 접지 된)을 향상시킵니다. 이런 식으로, 우리는 분산 응용 프로그램과 웹 작업 방법을 확실하게 이해할 것입니다. 우리는 웹 사이트를 볼 수 있고 웹 사이트가 어떻게 작동하는지, 견과류와 볼트까지의 대략적인 이해를 가질 것입니다. 우리가 탐구하는 각 추상화 수준에 대해, 우리는 항상 예제 기술을 배웁니다.
말했듯이, 우리는 바닥에서 시작합니다. 오늘날 분산 시스템의 통신은 일반적으로 UDP 또는 TCP를 기반으로합니다. 두 프로토콜 모두 소켓 API를 통해 액세스되며 C와 Java의 예제를 제공합니다. 이 예제의 일부로 텍스트를 Java에서 인코딩하는 방법과 여러 요청을 병렬로 처리 할 수있는 서버를 구성하는 방법도 보여줍니다. 따라서 소켓은 분산 응용 프로그램의 기초이며 프로그래머가 작동해야 할 가장 낮은 수준입니다.
이제 거의 모든 현재 컴퓨터 네트워크와 인터넷에서 진행되는 기본 커뮤니케이션 프로세스를 이해할 수 있습니다. 우리는이 이해를 사용하여 조직이나 기업이 웹 사이트를 통해 외부 세계에 어떻게 제시 할 수 있는지 조사 할 것입니다. 우리는 사용자와 동적으로 상호 작용할 수있는 웹 사이트를 구성하는 데 필요한 기술을 이해하고 싶습니다.
월드 와이드 웹은 HTTP, HTML/CSS/JavaScript 및 URL의 세 가지 기둥을 기반으로합니다. 하이퍼 텍스트 전송 프로토콜 인 HTTP는 일반적으로 TCP 연결을 통해 전송되는 리소스를 쿼리하는 텍스트 기반 프로토콜입니다. 실제로, 우리는 이미 소켓 (및 작은 병렬 웹 서버를 사용하여 HTTP 통신의 클라이언트 측면의 서버) 및 클라이언트 (웹 브라우저)의 예제 구현을 제공합니다.
소켓을 기반으로 HTTP를 구현하는 것은 매우 복잡합니다. 소켓을 통해 TCP에 액세스 할 수 있습니다. 우리가 갖고 싶은 것은 HTTP에 액세스하는 비슷한 우아한 API (다음으로 더 높은 수준의 추상화)입니다. 그러한 기술 중 하나는 자바 서블릿입니다. 서블릿은 HTTP 대화의 서버 측을 구현하는 데 사용됩니다. 서블릿은 다양한 HTTP 상호 작용 ( "HTTP 방법")에 대한 핸들러 방법을 구현하는 특수 Java 클래스의 하위 클래스입니다. 이 방법은 서틀 컨테이너, 실제 구현으로 호출됩니다. 따라서 응용 프로그램 논리에 완전히 집중할 수 있으며 프로토콜 상호 작용 자체에 대해 걱정할 필요가 없습니다. 우리는 배포 가능한 예제와 독립형 HTTP 프록시 서블릿을 모두 제공합니다. 따라서 Java Servlet을 사용하면 HTTP 클라이언트 (예 : 웹 브라우저)와 동적으로 상호 작용할 수있는 서버 구성 요소를 구축 할 수 있습니다. 이는 브라우저가 요청할 때 웹 페이지의 내용을 동적으로 생성 할 수 있음을 의미합니다. 그러나 Java Servlets로서 완전한 동적 웹 사이트를 구축하는 것은 Servlet이 Java 클래스이고 웹 페이지는 HTML이기 때문에 다시 번거롭습니다. 그런 다음 서블릿의 출력에 쓰기 위해 문자열 상수 형식으로 작성합니다.
다음으로 더 높은 추상화 수준은 Javaserver 페이지 (JSPS)이며 HTML 페이지 (또는 기타 텍스트 형식)를 작성하고 Java 소스 코드를 포함시킬 수 있습니다. 그런 다음 페이지는 서블릿 컨테이너로 다시 제공됩니다. 페이지가 클라이언트로 전송 될 때마다 포함 된 Java 코드가 서버 측에서 먼저 실행되며 추가 출력을 생성 할 수 있습니다). 면밀히 검사하면 JSP가 실제로 "특별한"서블릿임을 알 수 있습니다. 처음으로 JSP에 액세스 할 때 서블릿 컨테이너는 해당 Java 서블릿의 소스 코드를 동적으로 생성합니다. 이 서블릿은 컴파일,로드 된 다음 실행되어 클라이언트에게 전송 될 페이지의 동적 컨텐츠를 생성합니다. JSP의 "텍스트"인 모든 것은 서블릿의 HTTP 응답에 기록 된 서블릿 내부의 문자열이됩니다. JSP의 "코드"인 모든 것은 서블릿의 핸들러 방법으로 직접 복사됩니다. JSP는 텍스트 (HTML) 출력을 동적으로 생성하여 클라이언트에게 제공하는보다 자연스러운 방법입니다. 지금까지 우리는 웹에서 동적 컨텐츠를 생성 할 수있는 방법, 사용자가 브라우저를 사용하여 웹 양식을 통해 웹 응용 프로그램과 상호 작용하는 방법 및 세션을 실현하는 방법을 이해하고 있습니다.
이러한 기술을 통해 회사의 역동적 인 "외부"관점, 회사가 웹에서 제시하는 방식을 구축 할 수 있지만 이제는 분산 된 엔터프라이즈 컴퓨팅 환경의 "내부"관점을 탐색합니다. 여기서 목표는 다른 부서 (재무 부서, 인적 자원, 자산 관리 등)의 응용 프로그램을 향후 안전하고 확장 가능한 방식으로 서로 연결할 수있는 환경을 구축하는 것입니다.
엔터프라이즈 컴퓨팅으로가는이 길의 첫 번째 단계는 원격 프로 시저 통화 (RPC)이며, 이는 Java 원격 메소드 호출 (RMI)의 예에서 탐색합니다. 우리의 예는 컴퓨터에서 호스팅 된 한 응용 프로그램의 객체가 다른 컴퓨터에서 실행되는 다른 프로그램에서 어떻게 액세스 할 수 있는지 보여줍니다. 이를 통해 이미 네트워크에서 상호 연결된 분산 응용 프로그램을 실현하는 데 가깝습니다. 그러나 Java RMI는 여전히 Java 특정 기술이며 프로토콜은 이진입니다. 우리는 매우 명확하고 잘 지정되고 이해하기 쉬운 프로토콜을 사용하여 플랫폼 독립적 인 방식으로 분산 응용 프로그램을 구현하고자합니다.
그러한 기술을 추구하는 우리는 확장 가능한 마크 업 언어에 대해 먼저 학습 할 수 있도록 강요해야합니다 (XML. XML은 복잡한 데이터 구조를 텍스트에 저장하기위한 자체 문서형 형식입니다. HTML과 유사하지만 사전 정의 된 시맨틱 또는 프리젠 테이션이 없으면 각 응용 프로그램에 대해 지정 될 수 있습니다. 우리는 XML 문서에 대한 시험과 관련된 과정을위한 시험을 살펴볼 수 있습니다.
그런 다음 웹 서비스에 대해 논의합니다. 웹 서비스는 많은 분산 엔터프라이즈 컴퓨팅 시스템 및 서비스 지향 아키텍처의 기본 기초입니다. 그들은 일반적으로 HTTP를 통해 XML 기반 비누 프로토콜을 사용하여 호출됩니다. 그들의 인터페이스와 제공된 기능은 다른 XML 표준 인 WSDL (Web Service Description Language)을 통해 설명됩니다. 우리가 이미 알고있는 것에 기초하여, 이제 우리는 http-post를 통해 XML 데이터를 Java Servlet에 보낼 수 있고, 이러한 Java XML 프로세싱 기술 로이 데이터를 구문 분석하고, 동일한 기술을 사용하여 출력 XML 문서를 생성하고 Java 서틀의 응답으로 다시 보냅니다. 실제로, 우리는이 목적으로 Javaserver 페이지를 사용할 수도 있습니다. 그러나 더 간단한 방법이 있습니다. 간단한 Java 객체로서 서비스를 구축하여 Apache Axis2/Java 서버에 게시 할 수 있습니다. 서버는 SOAP를 통해 액세스 할 수있게하고 자동으로 WSDL 설명을 생성합니다. 그런 다음 Maven을 사용하여 클라이언트 측의 프록시 객체를 생성하는 데 사용할 수 있습니다. 우리는 몇 가지 예 에서이 기술을 조사합니다.
JSON RPC는 교환 된 데이터 구조가 JavaScript 객체 표기법 (JSON)에서 인코딩되는 또 다른 원격 프로 시저 호출 (여기서 지정)입니다. 데이터는 HTTP 또는 TCP를 통해 교환됩니다. JSON RCP는 웹 서비스와 유사하지만보다 가중성이 높도록 설계되었습니다. 우리는 다시 몇 가지 예를 논의합니다.
분산 컴퓨팅을위한 마지막으로 중요한 사용 사례로서, 우리는 대규모 분산 계산을 실현할 수있는 방법을 고려합니다. 이러한 계산은 엔지니어링 시뮬레이션에서부터 데이터 마이닝 및 기업의 처리에 이르기까지 다양한 시나리오에서 필요합니다.
우리는 이제 대규모 클러스터의 컴퓨팅 능력을 대규모 과학 및 엔지니어링 계산에 사용하는 방법에 중점을 둡니다. 이러한 큰 계산 또는 시뮬레이션은 종종 몇 가지 작은 하위 문제로 나뉩니다. 이러한 작은 문제는 여러 스레드 또는 프로세스에 의해 협력 적으로 해결됩니다. 여기에는 종종 밀접하게 관련된 하위 프로젝트에서 작업하는 프로세스간에 정기 시간 간격으로 메시지 교환이 포함됩니다. 분명히, 웹 서비스, Java Servlet 또는 Java 및 HTTP 프로토콜은 이에 대한 잘못된 기술이 될 것입니다. 대규모 계산의 경우 가능한 한 거의 오버 헤드로 가능한 한 효율적으로 확보하고 싶습니다. 이것은 특히 매우 비싸고 분포로 달성 할 수있는 속도의 제한 요소 인 커뮤니케이션에 관한 것입니다. 우리는 원시 데이터 유형을 효율적으로 교환하고 싶고 방송, 멀티 캐스트 및 비동기 통신과 같이 HTTP/TCP가 지원하지 않는 통신 패러다임을 사용하려고합니다. 이를 위해 MPI (Message Passing Interface)의 구현이 선택된 방법이 될 것입니다. 우리는 C 프로그래밍 언어의 몇 가지 예를 바탕 으로이 기술을 탐색합니다.
마지막 단계에서 우리는 대규모 분산 계산 (MPI World의)을 생성 할 수있는 기능을 결합한 기술에 대해 논의합니다. MPI는 의사 소통이 비싸고 응용 프로그램의 병목 현상이 필요하다면, 관련 하위 프로젝트를 해결하는 프로세스간에 빈번한 의사 소통이 필요하며, 사용 가능한 하드웨어는 균질하며, 프로세스는 그룹으로 구성되어야하며, 고성능을 달성하기 위해 고성능 통신을 효율적으로 사용하여 전송해야 할 데이터의 규모는 작용 시간을 더 작게 만들어야하며, 우리가 구성 할 필요가 없으며, 우리가 우리가 걱정할 필요가 없으며, 우리가 걱정할 필요가 없습니다. 이질적인 분산 응용 프로그램 환경. 반면에, Hadoop은 통신이 병목 현상이 아닌 사용 사례를 다루고 있습니다. 계산은 통신 (기계 학습 생각)보다 훨씬 오래 걸리기 때문에 (환경이 이질적 일 때, 프로세스를 특별한 방식으로 구성 할 필요가없고, 하위 프로 블렘으로의 작업 부서를 동등한 작품으로 삽입 할 수 있는데, 여기서는 데이터 특성을 가질 수 있으며,이 데이터는 배치 특성을 가질 수 있습니다. 잠재적으로 거대 (MPI 스타일 커뮤니케이션의 장점을 없애는) 또는 데이터가 나오는 곳과 결과는 환경의 다른 응용 프로그램으로 다시 푸시되어야합니다. 우리의 Hadoop 예제는 MapReduce 패턴에 중점을 둡니다 (위에서 설명한 시나리오에 대해서만 MPI의 산란/수집/감소와 비슷합니다).
대체로이 과정은 회사 내부 분산 애플리케이션 시스템에 대한 동적 웹 사이트에서 분산 엔지니어링 및 과학적 컴퓨팅에 이르기까지 다양한 분산 컴퓨팅 분야의 지배적 인 기술에 대한 대략적인 이해를 제공합니다. 각 필드는 실습 예제로 탐색되며 여러 예제 기술로 테스트하고 재생할 수 있습니다.
각 예제에 대해 필요한 소프트웨어를 명시 적으로 나열하고 그 소프트웨어를 얻고 설치할 수있는 방법에 대해 논의합니다. 여기에서는 이러한 소프트웨어 구성 요소에 대한 개요를 제공합니다.
내가 제공하는 대부분의 예제는 Java 프로그래밍 언어로 작성되었으며 Java가 설치되어 있기 때문에 임의의 시스템에서 실행할 수 있습니다. 그것들을 컴파일하려면 Java JDK가 설치해야합니다. 내 예제에는 Java 7 이상이 필요합니다.
Windows에서는 Oracle 웹 사이트에서 Java를 다운로드하여 설치해야합니다.
Linux에서는 sudo apt-get install openjdk-7-jdk 설치합니다 (원하는 경우 8 과 같은 이후 버전으로 7 교체 할 수 있음).
내 Java 예제 중 일부는 Maven과 함께 만들어졌습니다. 이 모든 예제에는 루트 폴더에 pom.xml 파일이 있습니다. 이를 구축하려면 Maven을 설치해야합니다.
Windows에서는 Apache 웹 사이트에서 Maven을 다운로드하여 설치해야합니다.
Linux에서는 sudo apt-get install maven 사용할 수 있습니다.
Eclipse (아래 참조)를 사용하는 경우 이미 Eclipse에 통합되어 있기 때문에 Maven을 설치할 필요가 없습니다.
이 저장소의 모든 Java 예제에 대한 Eclipse를 개발자 환경으로 권장합니다. 각 Java 예제에는 실제로 Eclipse .project 파일과 Eclipse .settings 가 포함되어 있습니다. Eclipse는 Maven과 Git을 모두 통합합니다. 즉,이 리포지토리를 일식 내에서 복제 하고이 프로세스 동안 Jave 프로젝트를 직접 가져올 수 있습니다. 그런 다음 Maven 프로젝트를 마우스 오른쪽 단추로 클릭하고 Maven > Update Project... 선택하면 Eclipse는 Maven pom.xml 에서 지정한 모든 필요한 라이브러리 및 종속성을 다운로드하여 사용합니다.
Eclipse 웹 사이트에서 Eclipse를 다운로드 할 수 있습니다. 우수한 Maven 및 Git 지원을 위해 최소한 Eclipse Mars.1을 사용하는 것이 좋습니다.
Java Servlets 및 Javaserver 페이지 예제를 실행하려면 해당 다운로드 웹 사이트에서 Glassfish 서버를 다운로드해야합니다. 적어도 유리 피쉬 4.1.2를 사용하는 것이 좋습니다.
웹 서비스 예제를 실행하려면 해당 다운로드 페이지에서 Apache Axis2/Java를 다운로드해야합니다. 적어도 Axis2 1.7.3을 사용하는 것이 좋습니다.
C 프로그래밍 언어 (예 : C 기반 소켓 예제)로 작성된 예제를 컴파일하려면 GCC와 같은 C 컴파일러가 필요합니다. Linux에서는 일반적으로 이미 설치되어야하며 sudo apt-get install gcc 통해 설치할 수 있습니다. Windows에서는 일반적으로 웹 설치 프로그램을 통해 Mingw를 설치해야합니다.
C 예제 중 일부는 Windows 또는 Linux 용으로 제공됩니다. GCC를 사용하면 Linux를 사용하는 경우 Windows 용 C 프로그램을 컴파일 할 수 있습니다. 이를 위해 먼저 sudo apt-get install gcc-mingw-w64-i686 다음 Mingw에서 gcc 사용하는 것과 같은 방식으로 gcc-mingw-w64-i686 명령을 사용할 수 있습니다.
메시지 전달 인터페이스 (MPI)를 사용하기위한 예제를 빌드하고 컴파일하려면 MPI 구현이 필요합니다. 우리는 mpich를 선택합니다.
Linux에서는 sudo apt-get install mpich libmpich-dev 통해 필요한 파일을 설치할 수 있습니다.
ssh 및 rsync ) Hadoop 예제를 테스트하려면 이제 단일 노드 Hadoop 클러스터를 설정해야합니다. 따라서 우리는 http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html에 제공된 안내서를 따릅니다. ssh 및 rsync 와 같은 사전 반품을 설치해야합니다. Hadoop 예제 Readme에서는 Hadoop 2.7.2 Linux / Ubuntu의 설치 안내서를 제공합니다. http://www.apache.org/dyn/closer.cgi/hadoop/common/에 제공된 거울 중 하나에서 Hadoop을 다운로드하고 설치하고 링크 된 자습서의 지침에 따라 요약됩니다.
이 작업은 순전히 교육 목적이 있습니다. 아래에 언급 된 모든 것 외에도이 저장소의 어떤 것에 대해서는 하나의 추가 라이센스 조건을 부과합니다.이 코드는 독일, 중국 또는 미국의 법률을 위반할 수있는 것에 대해 절대로 사용해서는 안됩니다. 이것은 또한 여기에 제공된 다른 파일 또는 리소스에도 적용됩니다.
이 저장소의 예제는 2007 년 6 월 29 일 GNU 일반 공개 라이센스 버전 3에 따라 라이센스가 부여되며 다음과 같은 예외가 있습니다.
디렉토리 /javaserverpages /standalonejspswithjetty 및 /javaservlets /proxy의 모든 내용은 Apache 라이센스 v2.0에 따라 라이센스가 부여되며 부분적으로 프로젝트 임베디드 -Jetty-JSP에서 저작권 (c) 1995-2013 Mort Bay Consulting Pty.
Hadoop 예 중 일부는 라이센스 정보가 제공되지 않는 H3ML3T의 Maven-Hadoop-Java-Wordcount-Template에서 영감을 얻습니다. 예는 예를 들어 뚱뚱한 항아리를 만드는 방식과 같이 여러 가지면에서 완전히 다릅니다. 어쨌든,이 원래 프로젝트는이 블로그 항목에 잘 설명되어 있습니다.
또한 Hadoop Word는 Hadoop의지도 감소 기능에 대한 잘 알려진 단어 계산 예제를 기반으로합니다. GNU 일반 공개 라이센스 버전 2에 따라 Luca Menichetti [email protected]의 버전을 기반으로합니다.