分布式程式設計的難點在於:
1.伺服器之間的通訊,主節點如何了解從節點的執行進度,並在從節點之間進行負載均衡和任務排程;
2.如何讓多個伺服器上的程序訪問同一資源的不同部分進行執行
第一部分涉及到網路程式設計的底層細節
第二個問題讓我聯想到hdfs的一些功能。
首先分布式程序還是解決的是單機單程序無法處理的大資料量大計算量的問題,希望能加通過乙份**(最多主+從兩份)來並行執行乙個大任務。
這就面臨兩個問題,首先將程式分布到多台伺服器,其次將輸入資料分配給多台伺服器。
第乙個問題相對比較簡單,畢竟程式一般不會太長,即便是超級jar包的spark程式,也不過百兆。
但資料裡不同,如今企業級別的資料動輒gb、tb,如果在分布式程式執行之前首先要進行大容量資料的轉移,顯然是不可取的。
這時候我們就需要乙個**共享資料來源,所有伺服器都可以對這個資料來源進行並行訪問(塊block),這就已經非常接近hdfs的功能。
因為在hdfs中,集群中的多台伺服器共享同乙個hdfs,每台機器訪問hdfs就像訪問本地資料一樣(還是稍微慢一點);
計算任務執行完之後,每台伺服器還可以將自己的計算結果寫回hdfs,每台伺服器的結果被儲存成了結果目錄中的小檔案。
# task_master.py
import random, time, queue
from multiprocessing.managers import basemanager
# 傳送任務的佇列:
task_queue = queue.queue()
# 接收結果的佇列:
result_queue = queue.queue()
# 從basemanager繼承的queuemanager:
class queuemanager(basemanager):
pass
# 把兩個queue都註冊到網路上, callable引數關聯了queue物件:
queuemanager.register('get_task_queue', callable=lambda: task_queue)
queuemanager.register('get_result_queue', callable=lambda: result_queue)
# 繫結埠5000, 設定驗證碼'abc':
manager = queuemanager(address=('', 5000), authkey=b'abc')
# 啟動queue:
manager.start()
# 獲得通過網路訪問的queue物件:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放幾個任務進去:
for i in range(10):
n = random.randint(0, 10000)
print('put task %d...' % n)
task.put(n)
# 從result佇列讀取結果:
print('try get results...')
for i in range(10):
r = result.get(timeout=10)
print('result: %s' % r)
# 關閉:
manager.shutdown()
print('master exit.')
# task_worker.py
import time, sys, queue
from multiprocessing.managers import basemanager
# 建立類似的queuemanager:
class queuemanager(basemanager):
pass
# 由於這個queuemanager只從網路上獲取queue,所以註冊時只提供名字:
queuemanager.register('get_task_queue')
queuemanager.register('get_result_queue')
# 連線到伺服器,也就是執行task_master.py的機器:
server_addr = '127.0.0.1'
print('connect to server %s...' % server_addr)
# 埠和驗證碼注意保持與task_master.py設定的完全一致:
m = queuemanager(address=(server_addr, 5000), authkey=b'abc')
# 從網路連線:
m.connect()
# 獲取queue的物件:
task = m.get_task_queue()
resueuthfrlqbjlt = m.get_result_queue()
# 從task佇列取任務,並把結果寫入result佇列:
for i in range(10):
try:
n = task.get(timeout=1)
print('run task %d * %d...' % (n, n))
r = '%d * %euthfrlqbjd = %d' % (n, n, n*n)
time.sleep(1)
result.put(r)
except queue.empty:
print('task queue is empty.')
# 處理結束:
print('worker exit.')
本文標題: python分布式程式設計實現過程解析
本文位址: /jiaoben/python/285136.html
python分布式架構 分布式架構
1.分布式架構 採用centos mongodb windows2012 python redis進行分布式架構搭建,mongodb的框架最核心的設計就是 mongodb和mapreduce。mongodb為海量的資料提供了儲存,則mapreduce為海量的資料提供了計算,windows2012作為...
socket c s分布式程式設計
socket socket 介面介於應用程式與硬體之間。對 socket 的理解可以簡化為 它是封裝了資料流 stream 的從機器到機器的一條軟接線,通過這條軟接線,並借助於線兩端的收發程式,網路上的機器間實現了資訊的交流與互通。分離在軟線兩端的應用程式 伺服器端程式和客戶端程式 可以通過呼叫 s...
分布式事務 分布式事務的實現
如果在多個服務中需要對不同的資料庫進行操作。因為不同服務操作的資料庫都不同,所以保證在同乙個事務中完成操作顯然是不科學的。那實現分布式事務的思想 1 方法入口,建立一條日誌記錄,狀態定義為初始狀態,即儲存本條日誌記錄 可以儲存在資料庫中,也可以寫出到本地磁碟檔案 2 可以在非同步執行緒或在定時任務中...