Lập trình Spark nâng cao

Spark chứa hai loại biến chia sẻ khác nhau - một là broadcast variables và thứ hai là accumulators.

  • Broadcast variables - được sử dụng để phân phối hiệu quả, giá trị lớn.

  • Accumulators - được sử dụng để tổng hợp thông tin của bộ sưu tập cụ thể.

Các biến truyền phát

Các biến quảng bá cho phép lập trình viên giữ một biến chỉ đọc được lưu vào bộ nhớ đệm trên mỗi máy thay vì gửi một bản sao của nó với các tác vụ. Ví dụ, chúng có thể được sử dụng để cung cấp cho mọi nút, một bản sao của tập dữ liệu đầu vào lớn, một cách hiệu quả. Spark cũng cố gắng phân phối các biến quảng bá bằng cách sử dụng các thuật toán quảng bá hiệu quả để giảm chi phí truyền thông.

Các hành động Spark được thực hiện thông qua một tập hợp các giai đoạn, được phân tách bằng các hoạt động “xáo trộn” phân tán. Spark tự động truyền phát dữ liệu chung cần thiết cho các tác vụ trong từng giai đoạn.

Dữ liệu được truyền theo cách này được lưu trong bộ nhớ cache ở dạng tuần tự hóa và được giải mã hóa trước khi chạy mỗi tác vụ. Điều này có nghĩa là việc tạo các biến quảng bá một cách rõ ràng, chỉ hữu ích khi các tác vụ qua nhiều giai đoạn cần cùng một dữ liệu hoặc khi bộ nhớ đệm dữ liệu ở dạng deserialized là quan trọng.

Các biến quảng bá được tạo từ một biến v bằng cách gọi SparkContext.broadcast(v). Biến quảng bá là một trình bao bọc xung quanhvvà giá trị của nó có thể được truy cập bằng cách gọi valuephương pháp. Đoạn mã dưới đây cho thấy điều này -

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))

Output -

broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

Sau khi biến quảng bá được tạo, nó sẽ được sử dụng thay vì giá trị v trong bất kỳ chức năng nào chạy trên cụm, để vkhông được chuyển đến các nút nhiều hơn một lần. Ngoài ra, đối tượngv không được sửa đổi sau khi phát sóng của nó, để đảm bảo rằng tất cả các nút đều nhận được cùng một giá trị của biến quảng bá.

Bộ tích lũy

Bộ tích lũy là các biến chỉ được “thêm vào” thông qua một hoạt động kết hợp và do đó, có thể được hỗ trợ song song một cách hiệu quả. Chúng có thể được sử dụng để triển khai bộ đếm (như trong MapReduce) hoặc tính tổng. Spark nguyên bản hỗ trợ tích lũy kiểu số và lập trình viên có thể thêm hỗ trợ cho các kiểu mới. Nếu bộ tích lũy được tạo bằng tên, chúng sẽ được hiển thị trongSpark’s UI. Điều này có thể hữu ích để hiểu tiến trình của các giai đoạn đang chạy (LƯU Ý - điều này chưa được hỗ trợ trong Python).

Bộ tích lũy được tạo từ giá trị ban đầu v bằng cách gọi SparkContext.accumulator(v). Các tác vụ đang chạy trên cụm sau đó có thể thêm vào nó bằng cách sử dụngaddhoặc toán tử + = (trong Scala và Python). Tuy nhiên, họ không thể đọc được giá trị của nó. Chỉ chương trình trình điều khiển mới có thể đọc giá trị của bộ tích lũy, sử dụngvalue phương pháp.

Đoạn mã dưới đây cho thấy một bộ tích lũy đang được sử dụng để cộng các phần tử của một mảng -

scala> val accum = sc.accumulator(0) 
 
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)

Nếu bạn muốn xem đầu ra của đoạn mã trên, hãy sử dụng lệnh sau:

scala> accum.value

Đầu ra

res2: Int = 10

Hoạt động RDD dạng số

Spark cho phép bạn thực hiện các thao tác khác nhau trên dữ liệu số, sử dụng một trong các phương thức API được xác định trước. Các hoạt động số của Spark được thực hiện với một thuật toán phát trực tuyến cho phép xây dựng mô hình, từng phần tử một.

Các hoạt động này được tính toán và trả về dưới dạng StatusCounter phản đối bằng cách gọi status() phương pháp.

Sau đây là danh sách các phương thức số có sẵn trong StatusCounter.

S. không Phương pháp & Ý nghĩa
1

count()

Số phần tử trong RDD.

2

Mean()

Trung bình của các phần tử trong RDD.

3

Sum()

Tổng giá trị của các phần tử trong RDD.

4

Max()

Giá trị lớn nhất trong số tất cả các phần tử trong RDD.

5

Min()

Giá trị tối thiểu trong số tất cả các phần tử trong RDD.

6

Variance()

Phương sai của các phần tử.

7

Stdev()

Độ lệch chuẩn.

Nếu bạn chỉ muốn sử dụng một trong các phương thức này, bạn có thể gọi phương thức tương ứng trực tiếp trên RDD.