Sistem terdistribusi mengelilingi kita di mana -mana hari ini. Contoh mereka yang paling menonjol adalah internet yang menampung World Wide Web. Lingkungan komputasi dalam sistem komputasi perusahaan juga sering didistribusikan, menghubungkan berbagai layanan dari sumber daya manusia, departemen keuangan, ke sistem manajemen aset. Banyak aplikasi bahkan di -host di cloud. Akhirnya, rekayasa skala besar dan komputasi ilmiah saat ini sangat bergantung pada kelompok untuk memparalelkan beban kerja mereka. Topik -topik ini dibahas dalam kuliah komputasi terdistribusi saya. Dalam repositori ini, Anda dapat menemukan contoh -contoh praktis yang saya gunakan dalam kursus saya.
Soket
dalam c
di Java
HTML, CSS, dan JavaScript
Java Servlets
contoh yang dapat digunakan
HTTP Proxy Servlet
Halaman javaserver
contoh yang dapat digunakan
JSP yang berdiri sendiri
Java RMI
Xml
Contoh untuk dokumen XML dan standar terkait
Contoh untuk pemrosesan XML dengan java
Layanan Web
JSON RPC
Antarmuka lulus pesan
Hadoop
Masing-masing tautan di atas membawa Anda ke sub-direktori yang berisi satu set contoh. Setiap sub-direktori memiliki file README.md sendiri dengan deskripsi terperinci.
Karena saya juga menggunakan kode yang sama di slide saya, ada beberapa komentar khusus seperti //(*@serverBox{2)}@*) untuk memformat dalam kode saya ... Anda dapat dengan aman mengabaikannya ^_ ^
Konsep kursus ini adalah bahwa kami ingin memahami bagaimana Web dan mendistribusikan lingkungan aplikasi perusahaan bekerja. Kami ingin melakukannya dengan mulai mengeksplorasi cara berkomunikasi melalui jaringan pada tingkat abstraksi terendah (biasanya) yang tersedia untuk pemrogram, API soket. Dari sana, kami bekerja dengan cara-demi-langkah tingkat abstraksi yang lebih tinggi, yaitu, API yang lebih sederhana dan lebih kuat menumpuk di atas satu sama lain (dan akhirnya di-ground di soket). Dengan cara ini, kami akan mendapatkan pemahaman yang kuat bagaimana aplikasi terdistribusi dan kerja web. Kami akan dapat melihat situs web dan segera memiliki pemahaman kasar tentang cara kerjanya, hingga ke mur dan baut. Untuk setiap tingkat abstraksi yang kami jelajahi, oleh karena itu kami selalu mempelajari teknologi contoh.
Seperti yang dikatakan, kita mulai di bagian paling bawah: komunikasi dalam sistem terdistribusi hari ini biasanya didasarkan pada UDP atau TCP. Kedua protokol diakses melalui Socket API, yang kami berikan contoh di C dan Java. Sebagai bagian dari contoh -contoh ini, kami juga menunjukkan bagaimana teks dapat dikodekan dalam Java dan bagaimana membangun server yang dapat memproses banyak permintaan secara paralel. Soket dengan demikian merupakan dasar dari aplikasi terdistribusi, level terendah yang mungkin harus dikerjakan oleh seorang programmer.
Kami sekarang dapat memahami proses komunikasi dasar yang terjadi di hampir semua jaringan komputer saat ini dan Internet. Kami akan menggunakan pemahaman ini untuk menyelidiki bagaimana suatu organisasi atau perusahaan dapat menampilkan dirinya ke dunia luar melalui situs web. Kami ingin memahami teknologi yang diperlukan untuk membangun situs web yang secara dinamis dapat berinteraksi dengan pengguna.
World Wide Web didasarkan pada tiga pilar: http, html/css/javascript, dan url. HTTP, Hyper Text Transfer Protocol, adalah protokol berbasis teks untuk meminta sumber daya yang biasanya ditransmisikan melalui koneksi TCP. Sebenarnya, kami sudah memberikan contoh implementasi dari sisi server (server web) dan klien (browser web) dari komunikasi HTTP menggunakan soket (dan bahkan server web paralel kecil. Kami kemudian memberikan beberapa contoh dasar untuk HTML, CSS, dan JavaScript.
Menerapkan HTTP berdasarkan soket cukup kompleks. Soket memungkinkan kami mengakses TCP. Apa yang ingin kami miliki adalah API yang sama elegannya untuk mengakses HTTP (tingkat abstraksi berikutnya yang lebih tinggi). Salah satu teknologi tersebut adalah Java Servlets. Servlets digunakan untuk mengimplementasikan sisi server dari percakapan HTTP. Servlet adalah sub-kelas dari kelas Java khusus yang mengimplementasikan metode penangan untuk interaksi HTTP yang berbeda ("Metode HTTP"). Metode -metode ini disebut oleh wadah servlet, implementasi server yang sebenarnya. Karena itu kami dapat berkonsentrasi penuh pada logika aplikasi dan tidak perlu khawatir tentang interaksi protokol itu sendiri. Kami memberikan berbagai contoh untuk servlet Java, keduanya contoh yang dapat digunakan maupun servlet proxy HTTP yang berdiri sendiri. Jadi dengan Java Servlets, kami dapat membangun komponen server yang secara dinamis dapat berinteraksi dengan klien HTTP (seperti browser web). Ini berarti bahwa kita dapat secara dinamis menghasilkan konten halaman web ketika browser memintanya. Namun, membangun situs web dinamis lengkap karena java servlets sekali lagi cukup rumit, karena servlets adalah kelas Java sementara halaman web adalah html, yang kemudian akan kami tulis dalam bentuk konstanta string untuk ditulis ke output servlet.
Tingkat abstraksi yang lebih tinggi berikutnya adalah halaman JavaServer (JSP), yang memungkinkan kami untuk menulis halaman HTML (atau format teks lainnya) dan memasukkan kode sumber Java di dalamnya. Halaman -halaman tersebut kemudian disajikan lagi oleh wadah servlet. Setiap kali halaman dikirim ke klien, kode Java yang disertakan pertama kali dieksekusi di sisi server (dan dapat menghasilkan output tambahan). Setelah diperiksa lebih dekat, kita dapat menemukan bahwa JSP sebenarnya adalah servlet "khusus": Ketika JSP diakses untuk pertama kalinya, wadah servlet secara dinamis membuat kode sumber dari servlet Java yang sesuai. Servlet ini dikompilasi, dimuat, dan kemudian dieksekusi untuk membuat konten dinamis dari halaman yang akan dikirim ke klien. Segala sesuatu yang "teks" dalam JSP menjadi string di dalam servlet yang ditulis dengan respons HTTP servlet. Segala sesuatu yang merupakan "kode" dalam JSP disalin langsung ke metode pawang servlet. JSP adalah cara yang lebih alami untuk secara dinamis menghasilkan output teks (HTML) dan menyajikannya kepada klien. Pada saat ini, kami memiliki pemahaman yang kuat bagaimana konten dinamis di web dapat dihasilkan, bagaimana pengguna dapat berinteraksi dengan aplikasi web melalui formulir web dengan menggunakan browsernya, dan bagaimana kami dapat mewujudkan sesi.
Sementara teknologi ini memungkinkan kami untuk membangun pandangan "di luar" yang dinamis dari sebuah perusahaan, cara perusahaan menyajikan dirinya di web, kami sekarang menjelajahi pandangan "dalam" dari lingkungan komputasi perusahaan yang didistribusikan. Di sini tujuannya adalah untuk membangun lingkungan di mana aplikasi dari berbagai departemen (departemen keuangan, sumber daya manusia, manajemen aset, ...) dapat dihubungkan satu sama lain dengan cara yang aman dan dapat diperluas di masa depan.
Langkah pertama pada jalan menuju komputasi perusahaan ini adalah panggilan prosedur jarak jauh (RPC), yang kami jelajahi pada contoh Doa Metode Java Remote (RMI). Contoh kami menunjukkan bagaimana objek dari satu aplikasi yang dihosting di komputer dapat diakses dari program lain yang berjalan di komputer lain. Ini membawa kita sudah hampir mewujudkan aplikasi terdistribusi yang saling berhubungan di jaringan. Namun, Java RMI masih merupakan teknologi khusus Java dan protokolnya biner. Kami ingin mengimplementasikan aplikasi terdistribusi kami dengan cara platform-independen, dengan menggunakan protokol yang sangat jelas, khusus, dan mudah dipahami.
Pengejaran kami terhadap teknologi semacam itu memaksa kami untuk terlebih dahulu mengambil pembelajaran tentang bahasa markup yang dapat diperluas (XML. XML adalah format pendokteran diri untuk menyimpan struktur data yang kompleks dalam teks. Ini mirip dengan HTML, tetapi tanpa proses yang telah ditentukan.
Kami kemudian membahas layanan web. Layanan Web adalah dasar dasar dari banyak sistem komputasi perusahaan terdistribusi dan arsitektur berorientasi layanan. Mereka dipanggil menggunakan protokol SOAP berbasis XML biasanya di atas HTTP. Antarmuka dan fungsionalitas yang disediakan dijelaskan melalui bahasa Web Service Description Language (WSDL), standar XML lainnya. Berdasarkan apa yang sudah kami ketahui, kami sekarang dapat mengirim data XML ke Java Servlet melalui HTTP-Post, parse data ini dengan teknologi pemrosesan Java XML ini, gunakan teknologi yang sama untuk menghasilkan dokumen XML output, dan kirimkan kembali sebagai respons dari servlet Java. Sebenarnya, kita bahkan bisa menggunakan halaman Javaserver untuk tujuan ini. Namun, ada lagi cara yang lebih sederhana: kita dapat membangun layanan sebagai objek Java sederhana dan menerbitkannya ke server Apache Axis2/Java. Server akan membuatnya dapat diakses melalui SOAP dan secara otomatis menghasilkan deskripsi WSDL. Ini kemudian dapat digunakan untuk menghasilkan objek proxy untuk sisi klien menggunakan, misalnya, Maven. Kami menyelidiki teknologi ini pada beberapa contoh.
JSON RPC adalah pendekatan panggilan prosedur jarak jauh lainnya (RPC) (ditentukan di sini) di mana struktur data yang dipertukarkan dikodekan dalam notasi objek JavaScript (JSON). Data dipertukarkan melalui HTTP atau TCP. JSON RCPS mirip dengan layanan web, tetapi dirancang untuk menjadi lebih ringan. Kami kembali membahas beberapa contoh.
Sebagai kasus penggunaan penting terakhir untuk komputasi terdistribusi, kami mempertimbangkan bagaimana perhitungan terdistribusi skala besar dapat direalisasikan. Perhitungan semacam itu diperlukan dalam banyak skenario, mulai dari simulasi dalam rekayasa hingga penambangan dan pemrosesan data di perusahaan.
Kami sekarang fokus pada bagaimana kekuatan komputasi kluster besar dapat digunakan untuk perhitungan ilmiah dan teknik skala besar. Perhitungan atau simulasi besar seperti itu sering dibagi menjadi beberapa sub-masalah yang lebih kecil. Masalah yang lebih kecil ini kemudian diselesaikan secara kooperatif dengan beberapa utas atau proses secara paralel. Ini sering melibatkan pertukaran pesan pada interval waktu reguler antara proses yang bekerja pada sub-masalah terkait erat. Jelas, layanan web, servlet Java, atau bahkan hanya Java dan protokol HTTP, akan menjadi teknologi yang salah untuk itu: untuk perhitungan skala besar, kami ingin menjadi seefisien mungkin dengan overhead sesedikit mungkin. Ini terutama menyangkut komunikasi, yang sangat mahal dan faktor pembatas untuk speedup yang dapat kita capai dengan distribusi. Kami ingin bertukar tipe data primitif secara efisien dan kami ingin menggunakan paradigma komunikasi yang tidak didukung oleh HTTP/TCP, seperti siaran, multicasts, dan komunikasi asinkron. Untuk ini, implementasi antarmuka lewat pesan (MPI) akan menjadi metode pilihan. Kami mengeksplorasi teknologi ini berdasarkan beberapa contoh dalam bahasa pemrograman C.
Dalam langkah terakhir kami membahas teknologi yang menggabungkan kemampuan untuk membuat perhitungan terdistribusi skala besar (dari dunia MPI) dengan dukungan alat yang kaya dari ekosistem Java: MapReduce dengan Apache Hadoop. MPI is the technology of choice if communication is expensive and the bottleneck of our application, frequent communication is required between processes solving related sub-problems, the available hardware is homogenous, processes need to be organized in groups or topological structures to make efficient use of collective communication to achieve high performance, the size of data that needs to be transmitted is smaller in comparison to runtime of computations, and when we do not need to worry much about exchanging data with a heterogeneous lingkungan aplikasi terdistribusi. 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 Berpotensi sangat besar (menggerogoti keuntungan komunikasi gaya MPI), atau dari mana data berasal dan hasilnya harus didorong kembali ke aplikasi lain di lingkungan, katakanlah kepada tumpukan layanan HTTP/Java/Web. Contoh Hadoop kami fokus pada pola MapReduce (yang sedikit mirip dengan pencar/berkumpul/mengurangi di MPI, hanya untuk skenario yang dijelaskan di atas).
Secara keseluruhan, kursus ini akan memberi Anda pemahaman kasar tentang teknologi dominan di berbagai bidang komputasi terdistribusi, dari situs web dinamis hingga sistem aplikasi terdistribusi-internal perusahaan, hingga teknik terdistribusi dan perhitungan ilmiah. Setiap bidang dieksplorasi dengan contoh langsung dan Anda bisa menguji dan bermain dengan beberapa contoh teknologi.
Untuk setiap contoh, saya secara eksplisit mencantumkan perangkat lunak yang diperlukan dan membahas bagaimana hal itu dapat diperoleh dan diinstal. Di sini saya memberikan gambaran umum tentang komponen perangkat lunak ini.
Sebagian besar contoh yang saya berikan ditulis dalam bahasa pemrograman Java dan dapat berjalan di bawah sistem yang sewenang -wenang, mengingat bahwa Java diinstal. Untuk mengkompilasi mereka, Anda perlu diinstal Java JDK. Contoh saya membutuhkan Java 7 atau lebih baru.
Di bawah Windows, Anda perlu mengunduh dan menginstal Java dari situs web Oracle.
Di bawah Linux, Anda akan melakukan sudo apt-get install openjdk-7-jdk (di mana Anda dapat mengganti 7 dengan versi selanjutnya, seperti 8 , jika Anda suka)
Beberapa contoh Java saya dibangun dengan Maven. Semua contoh ini memiliki file pom.xml di folder root mereka. Untuk membangunnya, dengan demikian Anda perlu menginstal Maven.
Di bawah Windows, Anda perlu mengunduh dan menginstal Maven dari situs web Apache.
Di bawah Linux, Anda akan melakukan sudo apt-get install maven .
Jika Anda menggunakan Eclipse (lihat di bawah), Anda tidak perlu menginstal Maven karena sudah diintegrasikan ke dalam gerhana.
Saya merekomendasikan Eclipse sebagai lingkungan pengembang untuk semua contoh Java dalam repositori ini. Setiap contoh Java sebenarnya sudah datang dengan file Eclipse .project dan dengan Eclipse .settings . Eclipse mengintegrasikan Maven dan Git. Ini berarti Anda dapat mengkloning repositori ini dari dalam Eclipse dan secara langsung mengimpor proyek JAVE selama proses ini. Jika Anda kemudian mengklik kanan proyek Maven dan memilih Maven -> Update Project... , Eclipse juga akan mengunduh dan menggunakan semua pustaka dan dependensi yang diperlukan sebagaimana ditentukan oleh Maven pom.xml untuk Anda.
Anda dapat mengunduh Eclipse dari situs web Eclipse. Saya merekomendasikan untuk menggunakan setidaknya Eclipse Mars.1 untuk dukungan Maven dan Git yang sangat baik.
Untuk menjalankan beberapa contoh halaman java servlets dan javaserver, Anda perlu mengunduh server glassfish dari situs web unduhan yang sesuai. Saya sarankan menggunakan setidaknya GlassFish 4.1.2.
Untuk menjalankan contoh layanan web, Anda perlu mengunduh Apache Axis2/Java dari halaman unduhan yang sesuai. Saya merekomendasikan menggunakan setidaknya AXIS2 1.7.3.
Untuk menyusun contoh -contoh yang ditulis dalam bahasa pemrograman C (seperti contoh soket berbasis C ), Anda akan memerlukan kompiler C seperti GCC. Di bawah Linux, biasanya harus diinstal dan sebaliknya dapat diinstal melalui sudo apt-get install gcc . Di bawah Windows, Anda harus menginstal MINGW, biasanya melalui penginstal web.
Beberapa contoh C datang untuk Windows atau Linux. GCC memungkinkan Anda untuk mengkompilasi silang, yaitu, jika Anda menggunakan Linux, Anda dapat mengkompilasi program C untuk Windows. Untuk tujuan ini, Anda pertama-tama akan menginstal sudo apt-get install gcc-mingw-w64-i686 dan kemudian dapat menggunakan perintah gcc-mingw-w64-i686 dengan cara yang sama Anda akan menggunakan gcc di bawah MINGW.
Untuk membangun dan menyusun contoh kami untuk menggunakan antarmuka lewat pesan (MPI), kami memerlukan implementasi MPI. Kami memilih MPICH.
Di bawah Linux, Anda dapat menginstal file yang diperlukan melalui sudo apt-get install mpich libmpich-dev .
ssh dan rsync ) Untuk menguji contoh Hadoop kami, kami sekarang perlu mengatur kluster Hadoop tunggal. Karena itu kami mengikuti panduan yang diberikan di http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singleCluster.html. Kita perlu menginstal pra-persyaratan seperti ssh dan rsync . Dalam contoh readme Hadoop, kami menyediakan panduan instalasi untuk Hadoop 2.7.2 Linux / Ubuntu. Ini bermuara pada mengunduh dan menginstal Hadoop dari salah satu cermin yang disediakan di http://www.apache.org/dyn/closer.cgi/hadoop/common/, ditambah mengikuti pedoman tutorial tertaut.
Pekerjaan ini memiliki tujuan pendidikan murni. Selain semua yang disebutkan di bawah ini, untuk apa pun dalam repositori ini, saya memaksakan satu kondisi lisensi tambahan: Kode tidak boleh digunakan untuk apa pun yang mungkin melanggar hukum Jerman, Cina, atau Amerika Serikat. Ini juga berlaku untuk file atau sumber daya lain yang disediakan di sini.
Contoh -contoh dalam repositori ini dilisensikan di bawah GNU General Public License Versi 3, 29 Juni 2007, dengan pengecualian berikut:
Segala sesuatu di direktori /javaserverpages /standaloneJspswithjetty dan /javaserver /proxy dilisensikan di bawah lisensi Apache v2.0 dan sebagian berasal dari proyek tertanam-jetty-jsp dengan hak cipta (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
Beberapa contoh Hadoop mengambil beberapa inspirasi dari Maven-Hadoop-Java-Wordcount-Template oleh H3ML3T, yang tidak ada informasi lisensi yang disediakan. Contohnya, sepenuhnya berbeda dalam beberapa cara, misalnya dalam cara kita membangun stoples gemuk. Bagaimanapun, proyek asli ini dijelaskan dengan baik dalam entri blog ini.
Selain itu, kata Hadoop kami didasarkan pada contoh penghitungan kata terkenal untuk peta Hadoop mengurangi fungsionalitas. Ini didasarkan pada versi dengan disediakan Luca Menichetti [email protected] di bawah GNU Umum Lisensi Publik Versi 2.