2015-06-07 20 views
21

Hiện đang có một ngày Spark. Spark đã sử dụng ngôn ngữ scala để tải và thực thi chương trình cũng như python và java. RDD được sử dụng để lưu trữ dữ liệu. Nhưng, tôi không thể hiểu được kiến ​​trúc của Spark, cách nó chạy trong nội bộ.Công việc nội bộ của Spark

Vui lòng cho tôi biết Kiến trúc Spark cũng như cách hoạt động của nội bộ?

Trả lời

67

Ngay cả khi tôi đã được tìm kiếm trong các trang web để tìm hiểu về bên trong của Spark, dưới đây là những gì tôi có thể học hỏi và suy nghĩ chia sẻ ở đây,

Spark xoay quanh các khái niệm về một tập dữ liệu phân tán đàn hồi (RDD), đó là bộ sưu tập các phần tử có khả năng chịu lỗi có thể hoạt động song song. RDD hỗ trợ hai loại hoạt động: biến đổi, tạo ra một tập dữ liệu mới từ một bộ dữ liệu hiện có và các hành động, trả về một giá trị cho chương trình trình điều khiển sau khi chạy một phép tính trên tập dữ liệu.

Spark dịch biến đổi RDD vào một cái gì đó gọi là DAG (Đạo mạch hở Graph) và bắt đầu thực hiện,

Ở cấp độ cao, khi bất kỳ hành động được gọi là trên RDD, Spark tạo DAG và chịu sự lên lịch DAG .

  • Trình lập lịch biểu DAG chia toán tử thành các giai đoạn nhiệm vụ. Một giai đoạn bao gồm các nhiệm vụ dựa trên các phân vùng của dữ liệu đầu vào. Các tuyến đường dẫn DAG lập trình cùng nhau. Ví dụ: Nhiều toán tử bản đồ có thể được lên lịch trong một giai đoạn. Kết quả cuối cùng của bộ lập lịch DAG là một tập hợp các giai đoạn.

  • Các giai đoạn được chuyển sang Task Scheduler. Trình lập lịch tác vụ khởi chạy tác vụ thông qua trình quản lý cụm. (Spark Standalone/Yarn/Mesos). Trình lên lịch tác vụ không biết về các phụ thuộc của các giai đoạn.

  • Công nhân thực hiện các tác vụ trên Slave.

Hãy đến cách Spark xây dựng DAG.

Ở mức cao, có hai phép biến đổi có thể được áp dụng cho RDD, cụ thể là chuyển đổi hẹp và chuyển đổi rộng. Biến đổi rộng về cơ bản dẫn đến ranh giới giai đoạn.

Chuyển đổi hẹp - không yêu cầu dữ liệu phải xáo trộn trên các phân vùng. ví dụ, Bản đồ, bộ lọc và vv ..

rộng chuyển đổi - đòi hỏi dữ liệu được xáo trộn ví dụ, reduceByKey và vv ..

Hãy lấy một ví dụ về đếm có bao nhiêu thông điệp đăng nhập xuất hiện ở mỗi mức độ nghiêm trọng,

Tiếp theo là file log mà bắt đầu với mức độ nghiêm trọng,

INFO I'm Info message 
WARN I'm a Warn message 
INFO I'm another Info message 

và tạo mã scala sau để giải nén như nhau,

val input = sc.textFile("log.txt") 
val splitedLines = input.map(line => line.split(" ")) 
         .map(words => (words(0), 1)) 
         .reduceByKey{(a,b) => a + b} 

Chuỗi lệnh này xác định rõ ràng một DAG của các đối tượng RDD (dòng RDD) sẽ được sử dụng sau khi một hành động được gọi.Mỗi RDD duy trì một con trỏ đến một hoặc nhiều phụ huynh cùng với siêu dữ liệu về loại mối quan hệ của nó với cha mẹ. Ví dụ, khi chúng ta gọi val b = a.map() trên RDD, RDD b giữ tham chiếu đến parent của nó a, đó là một dòng truyền thừa.

Để hiển thị dòng của RDD, Spark cung cấp phương pháp gỡ lỗi toDebugString(). Ví dụ thực hiện toDebugString() trên splitedLines RDD, sẽ ra sau đây,

(2) ShuffledRDD[6] at reduceByKey at <console>:25 [] 
    +-(2) MapPartitionsRDD[5] at map at <console>:24 [] 
    | MapPartitionsRDD[4] at map at <console>:23 [] 
    | log.txt MapPartitionsRDD[1] at textFile at <console>:21 [] 
    | log.txt HadoopRDD[0] at textFile at <console>:21 [] 

Dòng đầu tiên (từ dưới lên) cho thấy RDD đầu vào. Chúng tôi đã tạo RDD này bằng cách gọi sc.textFile(). Xem bên dưới sơ đồ chế độ xem đồ thị DAG được tạo từ RDD đã cho.

RDD DAG graph

Khi DAG là xây dựng, Spark lên lịch tạo ra một kế hoạch thực hiện vật lý. Như đã đề cập ở trên, bộ lập lịch DAG chia biểu đồ thành nhiều giai đoạn, các giai đoạn được tạo dựa trên các phép biến đổi. Các phép biến đổi hẹp sẽ được nhóm lại với nhau thành một giai đoạn duy nhất. Vì vậy, ví dụ của chúng tôi, Spark sẽ tạo ra hai giai đoạn thực hiện như sau,

Stages

Các DAG lên lịch trình các giai đoạn vào lịch công việc. Số lượng tác vụ được gửi phụ thuộc vào số lượng phân vùng có trong textFile. Ví dụ Fox xem xét chúng ta có 4 phân vùng trong ví dụ này, sau đó sẽ có 4 bộ nhiệm vụ được tạo và gửi song song được cung cấp nếu có đủ nô lệ/lõi. Sơ đồ dưới đây minh họa điều này trong chút chi tiết hơn,

Task execustion

Để biết thông tin chi tiết hơn tôi đề nghị bạn phải đi qua các đoạn video youtube sau đó những người sáng tạo Spark nhượng bộ chi tiết sâu về DAG và kế hoạch thực hiện và tuổi thọ.

  1. Advanced Apache Spark- Sameer Farooqui (Databricks)
  2. A Deeper Understanding of Spark Internals - Aaron Davidson (Databricks)
  3. Introduction to AmpLab Spark Internals
+0

Hi Santish Tôi có một câu hỏi nhanh chóng. Bạn đã nói rằng reduceByKey là một sự biến đổi rộng vì nó "yêu cầu dữ liệu phải xáo trộn". Bạn có thể vui lòng giải thích về những gì bạn có nghĩa là bởi shuffle? Điều đó chỉ có nghĩa là bạn chỉ cần thêm giá trị từ các bộ dữ liệu khác nhau để bạn "xáo trộn" dữ liệu xung quanh? – LP496

+0

Điều này sẽ cung cấp cho một mô tả đồ họa rất chi tiết về những gì đang xáo trộn - https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html – Sathish

+0

@Sathish Giải thích tốt – PVH

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