Bagaimana cara membagi kerja ke jaringan komputer?

11

Bayangkan skenario sebagai berikut: Katakanlah Anda memiliki komputer pusat yang menghasilkan banyak data. Data ini harus melalui beberapa pemrosesan, yang sayangnya membutuhkan waktu lebih lama daripada untuk menghasilkan. Agar pemrosesan dapat mengejar waktu nyata, kami pasang lebih banyak komputer budak.

Lebih jauh, kita harus memperhitungkan kemungkinan budak keluar dari pekerjaan di tengah jaringan serta menambah budak. Komputer pusat harus memastikan bahwa semua pekerjaan selesai untuk kepuasannya, dan bahwa pekerjaan-pekerjaan yang dijatuhkan oleh seorang budak dialihkan ke pekerjaan lain.

Pertanyaan utamanya adalah: Pendekatan apa yang harus saya gunakan untuk mencapai ini?

Tapi mungkin yang berikut ini akan membantu saya sampai pada jawaban: Apakah ada nama atau pola desain untuk apa yang saya coba lakukan?

Domain pengetahuan apa yang saya perlukan untuk mencapai tujuan agar komputer-komputer ini saling berbicara? (mis. apakah basis data, yang saya ketahui, cukup atau akankah ini melibatkan soket, yang belum saya ketahui?)

Apakah ada contoh sistem seperti itu? Pertanyaan utamanya agak umum sehingga akan lebih baik jika memiliki titik awal / titik referensi.

Catatan Saya mengasumsikan kendala c ++ dan windows sehingga solusi yang menunjuk ke arah itu akan dihargai.

Morpork
sumber
1
Cari sistem antrian atau alur kerja, contoh: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue dan sebagainya. Sistem antrian dapat menangani distribusi, memeriksa dan menetapkan ulang.
Luc Franken
2
Istilah yang Anda cari adalah paralelisasi . Sebelum Anda menuju jalan ini, pastikan masalah Anda benar-benar dapat diselesaikan secara paralel (misalnya, hasil untuk item n tidak tergantung pada hasil untuk item n-1 ).
Blrfl
Lihatlah boinc
@ Blrfl Saya pikir paralelisasi biasanya tidak terkait dengan ini, paralelisasi biasanya dikaitkan dengan eksekusi multi-threaded atau multi-proses pada satu mesin menggunakan beberapa core / prosesor atau eksekusi bersamaan pada mesin yang sama. Komputasi terdistribusi adalah apa yang dia maksudkan dan dalam deskripsinya itu tidak memiliki jaminan konkurensi, hanya jaminan asinkron (yang dapat dikatakan eksekusi non-deterministik yang mungkin bersamaan, sinkron, atau tertunda dalam antrian)
Jimmy Hoffa
3
Saya terkejut tidak ada yang menyebutkan hadoop.
Kevin

Jawaban:

12

Apakah ada contoh sistem seperti itu?

Iya. Pola ini dikenal sebagai komputasi terdistribusi (atau pemrograman terdistribusi atau kata keren apa pun yang ingin Anda masukkan setelah didistribusikan). Saran saya adalah jangan membangun rumah ini sebelum melihat solusi lain. Anda dapat melihat pertanyaan stack overflow ini untuk berbagai opsi. Dan kemudian mengambil keputusan yang diperhitungkan.

Manoj R
sumber
3
Jangan lupa kata favorit baru untuk ini: cloud ! atau komputasi awan . Jika Anda melakukannya dengan komputer Anda sendiri, orang menyebutnya awan pribadi atau awan mini . Menandai omong kosong, ini telah dikenal seperti yang Anda katakan sebagai komputasi terdistribusi selama bertahun-tahun, hanya melemparkan di luar sana untuk OP untuk mengetahui di mana dia membaca tentang hal-hal cloud yang dibicarakannya persis seperti ini.
Jimmy Hoffa
3
@JimmyHoffa: kata "cloud" sama seringnya digunakan untuk menunjukkan bahwa data Anda serta perangkat lunak yang Anda gunakan untuk bekerja dengannya ada di internet di suatu tempat alih-alih mesin lokal Anda. Namun di lain waktu, itu berarti bahwa Anda menggunakan mesin virtual yang berjalan pada sebuah cluster daripada satu host VM monolitik tunggal; keuntungan yang jelas adalah kegagalan zero-down yang transparan.
Pelaku
2
@Dammers benar, tetapi tidak kurang dari jenis sistem yang dijelaskan oleh OP adalah salah satu dari banyak memanfaatkan moniker pemasaran Cloud, bersama dengan ketika Anda menunjukkan hampir semua hal lain. Itulah yang membuatnya menjadi kata kunci, itu diciptakan tanpa definisi sehingga orang menerapkannya pada banyak hal yang berbeda sehingga secara efektif berarti segalanya dan tidak ada. Hore untuk kata kunci.
Jimmy Hoffa
1
@JimmyHoffa: Itu juga yang membuat menyebutkan kata "cloud" di sini sama sekali tidak konstruktif.
Pelaku
3
Ini bisa menjadi kata yang bagus untuk digunakan melawan manajemen. "Apa solusi Anda untuk masalah pemrosesan data ini?" "Yah, kita bisa mendistribusikannya ke jaringan komputer dan menghitungnya secara paralel." TATAPAN KOSONG. "Kita bisa membangun Cloud mini." "OKE CARRY ON"
Morpork
4

Sebagaimana dicatat oleh jawaban lain, bidang ini telah dikenal sebagai komputasi terdistribusi , komputasi grid , komputasi cluster, dan komputasi kinerja tinggi .

Izinkan saya menambahkan perbedaan bahwa, ketika suatu sistem dapat diubah ukurannya setelah mulai mencocokkan beban kerja, dikatakan " elastis ", dan ini berbeda dari komputasi grid tradisional. Itulah salah satu (non-pemasaran) alasan untuk istilah " komputasi awan ": pengguna tidak perlu merencanakan kapasitas, dan jumlah dan lokasi mesin yang melakukan perhitungan tetap tidak istimewa baginya sebagai awan.

Selain itu, persyaratan Anda bahwa master menjadwalkan ulang tugas yang gagal disebut properti " toleransi kesalahan " dari sistem itu. (Tautan wajib ke kartun ini )

Pendekatan apa yang harus Anda gunakan untuk membangun cloud pribadi Anda sendiri? Dalam pesanan atau preferensi saya:

  1. Jangan membangun cloud Anda sendiri , gunakan infrastruktur yang disediakan oleh orang lain. Amazon menyebut Cloud Pribadi Virtual ini , Rackspace hanya Cloud Pribadi ; Saya yakin Anda dapat menemukan penawaran dan membandingkan lainnya.

  2. Jangan membangun mesin komputasi terdistribusi Anda sendiri , gunakan mesin yang disediakan oleh orang lain. Jika Anda bersikeras menggunakan mesin Anda, gunakan setidaknya sebanyak mungkin perangkat lunak yang disediakan dan diuji oleh orang lain. Anda dapat menggunakan Hadoop dari C ++ melalui antarmuka Pipes atau dari yang dapat dieksekusi melalui Streaming API . Ada antarmuka Streaming serupa pada Spark .

  3. Jangan kode semua komponen dari awal , gunakan komponen dari komunitas. Jika, karena alasan tertentu, Anda telah membaca sejauh ini dan ingin meluncurkan komponen cloud Anda sendiri, jangan mulai dari pustaka standar C ++. Komponen utama yang Anda butuhkan adalah:

    • sistem antrian, sebagaimana tercantum dalam komentar , untuk mengirim tugas dari master ke node pemrosesan, dan untuk mengirim konfirmasi hasil dari pemrosesan node ke master
    • sistem file terdistribusi, sehingga pemrosesan node dapat mengakses data untuk beroperasi.

    Ada banyak alternatif untuk keduanya. Untuk antrian, RabbitMQ memiliki penginstal Windows, seperti halnya ZeroMQ . Untuk sistem file terdistribusi, saya benar-benar tidak memiliki cukup pengalaman di Windows: sepertinya Anda dapat mengatur saham SMB menjadi DFS , tapi saya tidak bisa memberikan petunjuk apa pun di sini. Anda bisa berpikir, seperti disebutkan dalam jawaban lain, untuk menggunakan database terdistribusi seperti MongoDB untuk data; itu berjalan di Windows .

Anda juga dapat berpikir tentang menggunakan MPI (biasanya implementasi OpenMPI , biasanya melalui Boost wrapper ), tetapi perhatikan bahwa program MPI tidak elastis atau toleran terhadap kesalahan per se; Anda harus mengurusnya sendiri (setidaknya mereka menyediakan beberapa mekanisme untuk mencapai hal ini ). Itu sebabnya saya akan merekomendasikan kepada Anda terlebih dahulu untuk mengevaluasi kerangka kerja untuk distribusi yang memang memiliki sifat seperti itu.

logc
sumber