2015-07-08 21 views
8

Tôi đang học tia lửa bằng cách sử dụng cuốn sách 'Học Spark'. Đã qua thuật ngữ này (Trang 54) We can disable map-side aggregation in combineByKey() if we know that our data won’t benefit from it Tôi đang bối rối về sự tập hợp phía bản đồ ở đây là gì ?. Điều duy nhất đến với tâm trí của tôi là Mapper & Giảm trong Hadoop MapReduce ... nhưng tin rằng không có cách nào liên quan đến Spark.tập hợp 'bản đồ' bên trong Spark

+1

Chúng ta hãy nói rằng việc chuyển đổi reduceByKey dựa trên kết hợpByKey và trong đó bạn thực sự không cần tập hợp phía bản đồ. Do đó việc vô hiệu hóa tập hợp phía bản đồ là hợp lý vì chúng tôi thực sự chỉ cần thực hiện một phép biến đổi giảm ở đây. – eliasah

+0

@eliasah Khi ông nói 'bản đồ bên', có nghĩa là nó liên quan đến phương thức map() trong RDD. Khi ông nói 'tổng hợp' có nghĩa là ông đang đề cập đến việc đi qua từng phần tử trong RDD để thực hiện một số chuyển đổi trên các yếu tố đó không? – Raj

Trả lời

5

Ý tưởng đằng sau việc sử dụng tập hợp phía bản đồ là khá giống với bộ kết hợp Hadoop. Nếu một người lập bản đồ duy nhất có thể mang lại nhiều giá trị cho cùng một khóa, bạn có thể giảm xáo trộn bằng cách giảm các giá trị cục bộ.

Một ví dụ về hoạt động mà có thể được hưởng lợi từ bản đồ phía tập hợp được tạo ra tập các giá trị cho mỗi chủ chốt, đặc biệt là khi bạn phân vùng một RDD trước khi kết hợp:

Đầu tiên cho phép tạo ra một số dữ liệu giả:

val pairs = sc.parallelize(
    ("foo", 1) :: ("foo", 1) :: ("foo", 2) :: 
    ("bar", 3) :: ("bar", 4) :: ("bar", 5) :: Nil 
) 

Bây giờ chúng ta có thể phân vùng sử dụng HashPartitioner:

import org.apache.spark.HashPartitioner 
val partitionedPairs = pairs.partitionBy(new HashPartitioner(2)).persist() 

Và cuối cùng kết hợp:

import collection.mutable.{Set => MSet} 
val combined = partitionedPairs.combineByKey(
    (v: Int) => MSet[Int](v), 
    (set: MSet[Int], v: Int) => set += v, 
    (set1: MSet[Int], set2: MSet[Int]) => set1 ++= set2 
) 

Kể từ khi pairs RDD đã được phân đoạn, bộ giá trị cho mỗi khóa sẽ được tạo cục bộ trên một nút công nhân, giảm lưu lượng mạng đáng kể.

2

Bạn nói đúng, thuật ngữ giảm từ phía bản đồ đến từ vùng Map/Reduce và ý tưởng hơi phức tạp ở phía Apache Spark. Nếu có thể chúng ta có thể kết hợp nhiều phần tử trong một phân vùng trước khi xáo trộn các phần tử (và các phần tử kết hợp chiếm ít không gian hơn) - thì thực hiện giảm phân vùng trước khi xáo trộn dữ liệu sẽ hữu ích.

Một trường hợp giảm phía bản đồ là bị vô hiệu hóa trong Spark là groupByKey ngay cả khi chúng ta có thể kết hợp một số phần tử trong cùng một phân đoạn, chúng sẽ chiếm khoảng không gian tương tự. giảm mạng/serialization làm việc.

Hy vọng rằng sẽ giúp và vui mừng bạn đang đọc Spark Learning :)

2

Ví dụ, bạn không thể sử dụng bản đồ bên kết hợp (kết hợp), nếu bạn giá trị nhóm bởi chính (hoạt động groupByKey không sử dụng bộ kết hợp). Lý do là tất cả các giá trị cho mỗi khóa phải có mặt sau khi thao tác groupByKey kết thúc. Do đó, không thể giảm giá trị cục bộ (combiner).

Các vấn đề liên quan