Một kết nối TCP tới Server Application để nhận task gửi từ Server Application tới và gủi kết quả về cho Server Application xử lý. Khi Server Task chạy, nó ln lắng nghe kết nối từ Server Application một cổng, mặc
định là 11112
Một kết nối TCP tới Node để gửi task và file input tới Node, nhận kết
quả trả về từ Node, Server Task lắng nghe kết nối từ Node trên một cổng, mặc
định là 11113
Một kết nối TCP tới Server Task khác để chia sẻ task và file input, Server Task lắng nghe kêt nối từ những Server Task khác trên cổng mặc định
là 11111
Server Task có 2 tiến trình chính là: “Controller” và “Server”, tiến trình
“controller” sẽ khởi chạy server như một tiến trình độc lập va theo dõi trạng thái hoạt động của nó, trạng thái của server được ghi nhận trong một mã trạng thái, dựa vào mã này tiến trình controller sẽ quyết định viết bắt đầu hay dừng tiến trình server. Tiến trình controller cung cấp những thơng số cần thiết để
tiến trình server có thể thực thi.
Server Task Server
Application Node Applet
Server Task
TCP/IP Port: 11112 TCP/IP Port: 11113
TCP/IP Port: 11111
23
+ Các cấu hình ( nằm trong một file file cấu hình) + Biến môi trường
+ Java Class path
3.2.2: Server Application 3.2.2.1: Nhiệm vụ
Server Application là một chương trình java chạy trên một máy tính nào đó, có
thể cùng hoặc khác Server Task, Server Application có thể kết nối tới một hay
nhiều Server Task. Server Application có nhiệm vụ tạo ra Task và những file input, gửi các task và các file input tới Server Task, nhận kết quả trả về từ Server Task và xử lý những kết quả đó.
3.2.2.2: Chức năng
Server Application cung cấp 2 chức năng: Recovery and Failover
Khi kết nối giữa Server Application và Server Task bị ngắt do một lý do nào đó, Server Application sẽ tự động cố gắng kết nối tới Server Task trong một khoảng thời gian được ấn định.
Validator
Những kết quả từ máy tính Node gửi lên có thể khơng chính xác, do việc tính tốn sai ở máy tính Node.Validator là một chức năng kiểm tra kết quả gửi về từ Node có chính xác hay khơng, để thực hiện chức năng này Server Application yêu cầu Server Task gửi một task tới hai Node để thực thi và nhận
kết quả gủi trả về từ các Node đó. Server Application sẽ tiến hành so sách các
kết quả này, nếu hai kết quả bằng nhau thì kết quả đó được coi là đúng, nếu sai
Server Application sẽ yêu cầu Server Task gửi lại task đó tới Node để tính tốn
lại.
3.2.2.3: Cấu hình
Server Application có 2 modun chính, một modun dùng tạo kết nối với Server Task, nhận và gủi dữ liệu tới Server Task thông qua một kết nối TCP,
modun này được JPPF Frame Work cung cấp sẵn. Modun thứ 2 là những lớp java thực hiện việc tính tốn bài tốn, modun này do người phát triển ứng dụng
24
tính tốn viết và cấu hình dựa trên hệ thống JPPF API, những dữ liệu đầu vào phục vụ cho việc tính tốn cũng được những người phát triển tạo ra.
Khi Server Application chạy, nó thực hiện việc biên dịch những lớp java mơ tả việc tính tốn thành những file .class, những file .class và những file dữ liệu đầu vào được gửi tới Server Task, tại đây chúng được phân phối tới các
Node.
Trong quá trình chạy, Server Application đồng thời gửi Task tới Server Task, và nhận kết quả trả về của những Task đã hoàn thành, xử lý các kết này.
3.2.3: Node Applet 3.2.3.1: Nhiệm vụ
Node Applet là một java applet, chạy trên những máy tính tham gia vào hệ thống
tính tốn, có nhiệm vụ nhận task và file input gủi về từ Server Task, thực thi chúng và gủi trả kết quả về cho Server Task.
3.2.3.2: Chức năng
Recovery and Failover
Tương tự như Server Application, khi kết nối giữa Node và Server Task bị ngắt do một lý do nào đó, Node sẽ tự động thử kết nối tới Server Task sau một khoảng thời gian được ấn định.
Task Checkpoint
Trong q trình thực thi một Task, Node Applet có thể gặp một số vấn đề nào đó cần phải dừng việc thực thi một Task. Để có thể khơi phục lại q trình tính tốn của một Task. Node Applet cung cấp chức nằng Task Chekpoint, chức năng này lưu lại trang thái hoàn thành của một Task, một Task có thể bị dừng thực thi do người dùng dừng việc chạy ứng dụng, hoặc cũng có thể do một sự cố đột ngột nào đó, để tăng hiệu năng thực thi của một Task và tránh trường
hợp phải thực hiện lại Task nhiều lần do sự cố. Chức năng Task Chekpoint sẽ tự
động lưu trạng thái hoàn thành của một task sau một khoảng thời gian nhất định.
25
Khi một người dùng Facebook chạy ứng dụng tính tốn phân tán trên Facebook, và chọn một Project để tham gia và lưới tính tốn, Node Applet sẽ được chạy, Node
Applet lấy địa chỉ của Server Project từ một file cấu hình. Sau đó nó thực hiện tạo
kết nối TCP tới Server Task. Khi kết nối TCP tạo xong, Server Task gửi Task và những file input cần thiết về máy tính Node. Node Applet chạy những task mà Server Task gửi về để bắt đầu thực hiện việc tính tốn.
Khi q trình tính tốn hồn thành, Node Applet gửi kết quả về cho Server Task thông qua kết nối TCP tạo ra lúc trước, và sau đó kết nối này sẽ bị ngắt, Node Applet sau đó sẽ tạo một kết nối TCP khác tới Server Task để tiếp tục nhận Task
khác về thực thi.
Quá trình như vậy sẽ liên tục được thực hiện cho đến khi người dùng ngừng
chạy ứng dụng hoặc ứng dụng tính tốn đã thực hiện xong.
Máy Node thực hiện việc tính tốn bằng một chương trình applet, nên người
dùng khơng cần phải tải về và cài đặt các chương trình tính tốn trên máy tính của mình. Người dùng có thể truy cập vào trang web của ứng dụng để thực hiện việc tính tốn.
3.3: Ứng dụng tính tốn 3.3.1: Định nghĩa
Là những ứng dụng java được chạy trên hệ thống tính tốn phân tán, thực hiện việc tính tốn một bài tốn nào đó. Những bài tốn này thường là những bài tốn có khối lượng tính tốn lớn, nếu thực thi trên một máy tính thì thời gian tính tốn sẽ rất lâu, hoặc cần có những máy tính có khả năng tính tốn cao, các máy tính loại này thường rất đắt.Vì vậy muốn tăng tốc độ tính tốn cần có một lượng lớn máy tham gia vào việc tính tốn, để làm được điều này, một ứng dụng tính tốn cần được chia
thành nhiều phần, mỗi phần được gọi là một Task, Task được gửi tới nhiều máy tính khác nhau để tính tốn.
Nhứng ứng dụng tính tốn được viết dựa vào một API được cung cấp bởi hệ
thống JPPF.
3.3.2: JPPF API
JPPF API cung cấp những thư viện cho người lập trình phát triển những ứng
26
nối, thực hiện việc phân phối Task, và các chức năng quản lý. Người phát triển ứng dụng khi muốn triển khai ứng dụng tính tốn của mình trên hệ thống JPPF, họ sẽ
định nghĩa những Task được kế thừa từ lớp JPPFTask, những Task được thừa kế từ
lớp này sẽ có thể được triển khai trên hệ thống JPPF.
JPPF API cung cấp những lớp giúp việc tạo kết nối giữa ứng dụng và Server
Task, bao gồm một số tính năng sau.
+ Quản lý một hoặc nhiều kết nối tới Server Task
+ Gửi Task tới Server Task và nhận kết quả từ Server Task + Xử lý những thông báo về việc thực thi Task
3.4: Task
3.4.1: Định nghĩa Task
Task là một đơn vị tính tốn nhỏ của một ứng dụng tính tốn, được thực thi trên
máy tính Node. Một ứng dụng tính tốn lớn muốn tăng hiệu suất tính tốn cần được chia nhỏ làm nhiều task, để có thể phân phối tới nhiều máy tính Node thực thi, làm tăng hiệu năng tính tốn của ứng dụng.
Một Task được những người triển khai ứng dụng tính tốn định nghĩa, chúng được quản lý bởi server application. Để thực thi một task, máy tính Node cần tải về
những java class, java class này chính là những chương trình thực thi một phần nhỏ của một ứng dụng tính tốn.
Chu trình thực thi một Task trên là quá trình tạo kết nối, nhận những file .class và những file dữ liệu đầu vào, thực hiện tính tốn trên những dữ liệu đó, tao ra kết
quả và gửi trả về cho Server Task, đóng kết nối TCP. Sau đó lại tạo một kết nối TCP khác để nhận một Task khác.
Một Task do người phát triển viết muốn thực thi được trên hệ thống JPPF, nó cần
được viết dựa vào API mà JPPF cũng cấp. JPPFTask là một lớp cơ sở cho tất cả task,
những Task do người phát triển viết phải kế thừa lớp này.
3.4.2: Input Data File
Input data file là những dữ liệu cần thiết để thực thi một task, những file này
được Server Application gửi lên Server Task, Server Task lưu chúng trong cở sở dữ
27
file đầu vào, Server Task sẽ gửi file input cùng với các file .class của Task về máy , các file này sẽ được lưu trong thư mục %temp% của máy , khi một ngừng việc thực thi task cho một project, những file này sẽ tự động được xóa bỏ.
3.4.3: Result
Result là những kết quả tính tốn của một task, khi một task được thực thi xong, result được gửi trả về cho Server Application thông qua Server Task, các kết quả này
được Server Application xử lý, những kết quả được chấp nhận sẽ được lưu vào cơ sở
dữ liệu trên ở
Result cũng được định nghĩa bởi người phát triển ứng dụng tính tốn. Sử dụng một số phương thức tạo Result và lấy Result do JPPF API cung cấp, người phát triển có thể định nghĩa Result cho bài tốn của mình.
Có 2 phương thức đơn giản để ứng dụng lưu giữ và nhận về một result là:
public void setResult(Object result) public void getResult()
ví dụ việc tạo result.
public class MyTask extends JPPFTask {
public void run() {
// ... some code here ... setResult("This is the result"); }
}
Result sẽ được nhận về bằng phương thức getResult().
String result = (String) myTask.getResult();
Ngồi ra cịn có các cách khác để lưu trữ và nhận về một result: + Lưu trữ hoặc nhận về từ một cơ sở dữ liệu
+ Sử dụng files
+ Sử dụng một ứng dụng khác …..
28
Chương IV: Cài đặt hệ thống 4.1 Server Task 4.1 Server Task
Server Task có nhiệm vụ nhận task từ server application và phân phối task tới
những node tham gia vào lưới tính tốn. Khi khởi chạy server task tạo ra 3 server socket lắng nghe kết nối từ server application, node và serve task khác.
Những lớp chính trong Server Task 4.1.1 JPPFDriver
JPPFDriver là lớp chính trong Server Task, nó chuẩn bị và khởi chạy
những mơdun của Server Task. Nó chạy một server cho Server Task kết nối
đến, một server cho Node kết nối đến và một class server để xử lý những
yêu cầu từ những class loader từ xa.
Những thuộc tính chính:
taskQueue: Thuộc tính này có kiểu là đối tượng JPPFQueue, là một hàng đợt
lưu trức task để thực thi.
applicationServers: là mơt đối tượng có kiểu JPPFAppli cationServer. Lớp
đối tượng này lắng nghe những kết nối tới từ Server Application, mỗi khi có
một kết nối tới server một thread được tạo để lắng nghe những yêu cầu của Server Application, và đặt những yêu cầu này vào hàng đợi thực thi
nodeNioServer: là một đối tượng có kiểu NodeNioServer. Lớp đối tường
NodeNioServer thực hiện tạo kết nối với Node, gửi yêu cầu thực thi task tới Node.
classServer: là một đối tường có kiểu ClassNioServer. lớp đối tượng này xử
29
Những phương thức chính:
run(): Phương thức được gọi bởi hàm main() sẽ khởi chạy Server Task,
phương thức run() sẽ khởi tạo những đối tượng ClassNioServer, NodeNioServer và JPPFApplicationServers, và chạy chúng. Nó cũng khởi
tạo đối tượng JPPFBroadcaster để quảng bá thông tin của Server Task nếu
được cấu hình. Nếu thuộc tính "jppf.management.enabled" trong file cấu hình được gán bằng true, nó sẽ khởi tạo đối tượng JMXServerImpl để thực
thi việc thực thi task.
shutdown(): Shutdown Server cùng nhưng thành phần của nó.
createConnectionInformation(): Lấy thống tin về host và cổng dùng cho
những kết nối tới Server Task từ file cấu hình.
NodeNioServer ClassNioServer JPPFApplicationServer JPPFDriver - void run() - void shutdown() - void createConnectionInformation() - void main() - JPPFApplicationServer[] applicationServers - NodeNioServer nodeNioServer - ClassNioServer classServer
30
4.1.2 JPPFNode
Lớp JPPFNode là đối tượng thực thi task, lớp đối tượng này được gọi bởi Node thông qua Classloader, Một Node khi chạy dùng phương thức Classloader để load lớp JPPFNode về thực thi.
Những thuộc tính chính:
executionManager: Thuộc tính này có kiểu là một đối tượng
NodeExecutionManager dùng để thực thi task.
nodeIO: Thuộc tính này có kiểu là một đối tượng NodeIO dùng để đọc
những task bundle do server gửi về.
exitAction: Thuộc tính này có kiểu là đối tường Runable, nếu exitAction
khác null, node sẽ được dừng.
Những phương thức chính:
init(): Phương thức này khởi tạo node, tạo những socket kết nối tới Server
Task
run(): Khởi chạy JPPFNode, gọi phương thức init() để tạo node, khi quá
trình tạo node hồn thành nó sẽ gọi phương thức perform() để thực thi task.
perform(): Đây là phương thức thực thi task, phương thức này sẽ gọi đối
tượng NodeIO để đọc những task do server gửi về, sau đó gọi đối tượng
JPPFNode - void run() - void perform() - void processResults() - void init() - NodeExecutionManager executionManager - NodeIO nodeIO - Runnable exitAction
31
executeManage để thực thi task và gọi phương thức processResults thực thi
gửi trả kết quả về server.
stopNode(): Phương thức dừng node và giải phóng tài nguyên nó sử dụng.
4.1.3 Server Task Configuration
Thơng tin cấu hình server được lưu trong một file cấu hình.
Cấu hình thơng tin mạng
Cấu hình cổng lắng nghe kết nối từ Server Application, Node và Class loader.
# class loader port class.server.port = 11111
# communication with the applications
app.server.port = 11112
# communication with the nodes node.server.port = 11113
Server Task có thể gửi quảng bá những thơng tin của nó trên mạng (địa chỉ host và số cổng) thông qua cơ chế UDP multicast. Nhờ cơ chế này Node và Server Application có thể tự tìm được những Server Task đang hoạt động trên mạng. Để Server Task tự động quảng bá thơng tin của nó trên mạng ta cần gán thuộc tính jppf.discovery.enabled bằng true.
# Enable or disable automatic discovery of JPPF drivers
jppf.discovery.enabled = true
# UDP multicast group to which drivers broadcast their connection parameters
jppf.discovery.group = 230.0.0.1
# UDP multicast port to which drivers broadcast their connection parameters
jppf.discovery.port = 11111
# How long a driver should wait between 2 broadcasts, in milliseconds jppf.discovery.broadcast.interval = 1000
32
Server Task có thể kết nối tới Server Task khác tạo thành một mạng kiểu mạng ngang hàng. Có 4 loại kết nối giữa 2 server A và server B
+ A và B khơng có kết nối
+ A kết nối tới B ( A hoạt động như một Node kết nối tới B) + B kết nối tới A ( B hoạt động như một Node kết nối tới A) + A và B được kết nối với nhau.
Có hai cách để định nghĩa một kết nối từ một server tới một server khác trong mạng.
Tự động tìm kiếm server khác trong mạng để kết nối
# Enable or disable auto-discovery of other peer servers (defaults to false)
jppf.peer.dicovery.enabled = true
Với cách này, các Server Task sẽ tự động tìm kiếm những Server Task khác đang hoạt động trong mạng để thực hiện kết nối.
Cấu hình bằng tay.
# define a space-separated list of peers to connect to jppf.peers = server_1 server_2
# connection to server_1 jppf.peer.server_1.server.host = host_1 class.peer.server_1.server.port = 11111 node.peer.server_1.server.port = 11113 # connection to server_2 jppf.peer.server_2.server.host = host_2 class.peer.server_2.server.port = 11111 node.peer.server_2.server.port = 11113
33
Với cách cấu hình bằng tay ta có thể chỉ định Server Task nào kết nối với những Server Task nào.
Giá trị “jppf.peer.server_1.server.host” cần phải trùng với giá trị “class.server.host” trong file cấu hình của server_1 và giá trị “node.peer.server_1.port” cần phải trùng với giá trị “node.server.port” trong file cấu hình của server_1
Cấu hình thuộc tính cân bằng tải
jppf.load.balancing.algorithm = <algorithm_name>
JPPF cung cấp bốn thuật toán cân bằng tải:
+ manual: mỗi một bunle chứa cố định số task, tức là một node được chia cho số lượng task là như nhau.