Partitioner và Combiner

Một phần của tài liệu XỬ lý dữ LIỆU PHÂN tán với MAPREDUCE và xây DỰNG ỨNG DỤNG MINH họa (Trang 25 - 87)

2 Cơ bản về MapReduce

2.4 Partitioner và Combiner

Phần trên chúng ta đã làm đơn giản cái nhìn về MapReduce, ngoài hai thành phần Mapper và Reducer, thƣờng thì lập trình viên phải chỉ thêm 2 thành phần phụ nữa:

Thành phần Partitioner có nhiệm vụ chia không gian khóa (key) trung gian sau bƣớc Map và gán các cặp key-value trung gian tới các Reduce. Hay nói một cách khác, partitioner chỉ định tác vụ (task) mà cặp key-value trung gian phải đƣợc chuyển đến đó. Trong mỗi Reducer, các khóa đƣợc xử lý theo thứ tự đã đƣợc sắp xếp. Partitioner đơn giản nhất bao gồm việc tính toán giá trị băm của key và sau đó thực hiện phép chia lấy phần dƣ của giá trị này với số lƣợng reducer. Do đó các partitioner có thể gán một key và danh sách value của nó tới một reducer có số hiệu là giá trị băm vừa tính đƣợc. Thông thƣờng hàm băm phải đƣợc tính toán sao cho số lƣợng key gởi đến mỗi reducer xấp xỉ bằng nhau. Tuy nhiên partitioner không chú ý đến giá trị value trong cặp key-value, do đó có thể xảy ra tình trạng phân bố dữ liệu không đồng đều trên các reducer.

Thành phần Combiner trong MapReduce đóng vai trò nhƣ một thành phần tối ƣu giúp giảm tải việc chuyển dữ liệu giữa từ các Mapper đến các Reducer. Có thể xem combiner nhƣ là một reducer nhỏ (mini-reducer) đặt tại đầu ra của mapper, trƣớc pha trộn và sắp xếp (shuffle and sort phase) gởi các cặp key-value tới các reducer. Mỗi combiner hoạt động cô lập và do đó nó không truy xuất đến các cặp key-value của các mapper khác. Đầu vào của combiner là các cặp key-value từ đầu ra của mapper và nó xử lý tất cả các cặp key-value có key giống nhau để chuyển thành cặp key-value (cùng định dạng nhƣ ở đầu vào của combiner có key không thay đổi nhƣng value đã bị biến đổi) ở đầu ra. Tuy nhiên, Reducer và Combiner không thể hoán đổi vai trò cho nhau.

25

Hình 6. Mô hình MapReduce đầy đủ các thành phần 2.5 The execution framework (Bộ khung thực thi)

Một trong những ý tƣởng quan trọng nhất trong MapReduce là tách biệt việc xử lý phân tán cái gì (what) ra khỏi việc xử lý phân tán nhƣ thế nào (how). Một chƣơng trình MapReduce (Mapreduce Job), bao gồm đoạn mã cho Mapper, Reducer và có thể thêm Partioner và Combiner đƣợc đóng gói lại với nhau với các tham số cấu hình (ví dụ vị trí các tập tin đầu vào và nơi lƣu trữ đầu ra). Nhà phát triển đƣa chƣơng trình lên cho node quản lý tác vụ trong cluster (trong Hadoop gọi là JobTracker) và execution framework xử lý tất cả những thứ khác: xử lý trong suốt các vấn đề của việc thực thi mã lệnh phân tán. Các chức năng chính của Execution framework bao gồm:

Scheduling (lập lịch). Mỗi chƣơng trình MapReduce đƣợc chia nhỏ thành các đơn vị nhỏ gọi là tasks. Ví dụ, một map task có thể chịu trách nhiệm xử lý một khối các

26 cặp key-value nào đó (trong Hadoop gọi là input split), tƣơng tự, một reduce task có thể xử lý một phần của không gian khóa.

Data/code co-location (di chuyển dữ liệu và mã lệnh). Ý tƣởng của MapReduce là di chuyển mã lệnh, không phải di chuyển dữ liệu. Tuy nhiên, trong một số trƣờng hợp – để cho việc tính toán có thể thực hiện chúng ta phải đƣa dữ liệu đến mã lệnh. Trong MapReduce, việc này phụ thuộc phần lớn vào hệ thống file phân tán. Để có đƣợc việc cục bộ dữ liệu, scheduler phải khởi động task tại node có chứa khối dữ liệu cần thiết cho task đó. Nếu không thể đƣợc (do đang chạy quá nhiều task), một task mới sẽ đƣợc khởi tạo ở node khác và dữ liệu đƣợc truyền qua mạng đến node đó để xử lý.

Synchronization (đồng bộ hóa). Việc đồng bộ hóa chỉ đến các cách thức để các tiến trình đang xử lý đồng thời có thể hợp lại (“join up”), ví dụ chia sẻ kết quả trung gian hoặc trao đổi thông tin trạng thái. Trong MapReduce, việc đồng bộ hóa xảy ra giữa pha map và reduce. Các cặp key-value trung gian phải đƣợc gộp theo khóa, điều này đạt đƣợc bằng một phép toán sắp xếp phân tán lớn trên tất cả các node đã chạy map tasks và tất cả các node sẽ chạy reduce tasks. Dữ liệu trung gian đƣợc copy qua mạng, vì thế tiến trình này thƣờng đƣợc gọi là “shuffle and sort”. Một chƣơng trình MapReduce với m mapper và r reducer có thể có tới m x r phép toán copy vì mỗi mapper có thể có đầu ra đến tất cả các reducer.

Error and fault handling (xử lý lỗi). MapReduce framework phải hoàn thành tất cả các tasks trong môi trƣờng xảy ra lỗi thƣờng xuyên. Vì MapReduce đƣợc thiết kế dành cho các cụm máy giá rẻ (low-end) nên việc thực thi có thể sẽ dễ xảy ra lỗi, đặc biệt trong các cụm lớn, lỗi đĩa cứng và RAM sẽ xảy ra thƣờng xuyên. MapReduce frame work phải xử lý đƣợc các việc này.

2.6 Distributed File System (Hệ thống file phân tán)

Chúng ta đã tập trung nhiều vào việc xử lý dữ liệu lớn. Nhƣng một điều không kém phần quan trọng đó là: nếu không có dữ liệu thì chúng ta không có gì để xử lý cả. Trong tính toán hiệu năng cao (HPC – High-Performance Computing) và các kiến trúc cụm truyền thống, việc lƣu trữ đƣợc xem là một thành phần tách biệt với việc tính toán. Có nhiều cách cài đặt khác nhau, trong đó có Network-Attach Storage (NAS) và Storage Area Network (SAN) là đƣợc sử dụng thƣờng xuyên. Tuy nhiên với cách cài đặt nào đi nữa thì chu trình xử lý vẫn không thay đổi: các node tính toán lấy đầu vào từ nơi lƣu trữ, nạp dữ liệu vào bộ nhớ, xử lý dữ liệu và ghi kết quả ngƣợc trở lại.

Khi kích thƣớc dữ liệu càng tăng lên thì khả năng xử lý cũng phải tăng lên. Nhƣng khi khả năng xử lý tăng thì sự liên kết giữa node lƣu trữ và node xử lý lại trở thành một trở ngại. Lúc này để có hiệu năng cao thì cần phải có đƣờng truyền mạng tốc độ cao (vd: 10 gigabit Ethernet, InfiniBand) . Đây không phải là giải pháp hiệu quả về

27 kinh tế. Một cách khác đó là bỏ qua sự tách biệt giữa lƣu trữ và tính toán. Đây chính là ý tƣởng của hệ thống file phân tán bên dƣới MapReduce. Google File System (GFS) là cài đặt hệ thống file phân tán riêng của Google và Hadoop Distributed File System (HDFS) là một cài đặt mã nguồn mở của GFS.

Ý tƣởng chính là chia dữ liệu thành các khối và sao lƣu thành các khối đó trên đĩa của các node trong cluster (mặc định là 3). Các khối dữ liệu thƣờng có kích thƣớc mặc định là 64MB. Hệ thống file phân tán sử dụng kiến trúc master-slave, master duy trì không gian tên file (metadata, cấu trúc thƣ mục, ánh xạ file đến block, vị trí các block, quyền truy cập) và slave quản lý các khối dữ liệu cụ thể. Trong GFS, master đƣợc gọi là GFS Master và slave đƣợc gọi là GFS ChunkServer. Trong Hadoop, master đƣợc gọi là NameNode và slave đƣợc gọi là DataNode. Cả 2 hệ thống này hoạt động hầu nhƣ giống nhau, tuy nhiên, trong HDFS thì không có ghi thêm vào file và hiệu suất của HDFS cũng hơi chậm hơn so với GFS.

Kiến trúc của HDFS:

Hình 7. Kiến trúc của HDFS Nhiệm vụ của NameNode:

Namespace management (Quản lý không gian tên). NameNode chịu trách nhiệm duy trì không gian tên file, bao gồm metadata, cấu trúc thƣ mục, ánh xạ file đến block, vị trí của các block và quyền truy cập. Các dữ liệu này đƣợc nạp vào bộ nhớ để truy cập cho nhanh.

28

Coordinating file operations (Định vị các phép toán trên file). Namenode điều khiển các ứng dụng khách (clients) đến datanode để đọc và cấp phát các block thích hợp để ghi. Tất cả việc trao đổi diễn ra trực tiếp giữa client và datanode. Khi một file bị xóa, HDFS không lập tức thu lại không gian lƣu trữ, thay vào đó, các block sẽ đƣợc thu gom từ từ (lazily garbage collected).

Maintain overall health of the file system. (Duy trì sự hoạt động của hệ thống file). Định kì, namenode sẽ gửi các thông điệp báo hiệu (heartbeat messages) đến datanode để bảo đảm sự toàn vẹn của hệ thống. Nếu namenode thấy một block nào có số bản sao thập hơn yêu cầu, nó sẽ điều khiển để tạo ra các bản sao mới. Cuối cùng, namenode chịu trách nhiệm cân bằng hệ thống file. Trong các phép toán thông thƣờng, một datanode có thể sẽ chứa nhiều blocks hơn những cái khác, namenode sẽ cân bằng bằng cách chuyển các blocks từ các datanode có nhiều blocks đến các datanode có ít blocks hơn.

Thiết kế có một master của GFS và HDFS là một điểm yếu dễ thấy. Vì nếu master bị lỗi thì toàn bộ hệ thống và tất các MapReduce jobs sẽ bị dừng. Yếu điểm này đƣợc giảm bớt đi một phần nhờ vào bản chất của các phép toán của hệ thống file: không có dữ liệu đi qua NameNode và toàn bộ sự giao tiếp của clients và DataNode chỉ chứa metadata. Vì thế, NameNode cũng ko hẳn là một yếu điểm, trong hầu hết trƣờng hợp đều tránh đƣợc lỗi do tràn dữ liệu. Trong thực tế, điểm chết (Single Point Of Failure - SPOF) này ko phải là một hạn chế lớn – với việc theo dõi NameNode thƣờng xuyên thì thời gian bị lỗi sẽ không quá lâu trong các triển khai thƣơng mại. Hơn nữa, Hadoop cũng đƣợc thiết kế thêm một NameNode dự phòng (Secondary NameNode) để có thể chuyển đổi nhanh chóng khi NameNode bị lỗi.

Nhiệm vụ của DataNode:

DataNode có nhiệm vụ đọc và ghi các block của HDFS vào hệ thống file cục bộ. Khi muốn đọc hay ghi một file HDFS, file này sẽ đƣợc chia nhỏ thành các block và namenode sẽ cho client biết DataNode nào đang chứa block nào. Client truy cập trực tiếp đến DataNode để lấy block dữ liệu cần xử lý. Ngoài ra, các DataNode cũng giao tiếp với nhau để sao lƣu dữ liệu.

29

Hình 8. Vai trò của NameNode và DataNode trong HDFS

Hình 8 thể hiện vai trò của NameNode và DataNode. Trong hình này, ta có hai files: một tại /user/chuck/data1 và một tại /user/james/data2. File 1 có 3 block 1, 2, 3 và file 2 có 2 block 4 và 5. Nội dung của các file đƣợc lƣu trữ phân tán giữa các DataNode, mỗi block có 3 bản sao. Ví dụ, block 1 đƣợc sao lƣu trên 3 DataNode bên phải, điều này đảm bảo rằng nếu một DataNode bị lỗi thì vẫn có thể đọc đƣợc file trên các DataNode khác.

Các DataNode liên tục báo cáo lên NameNode. Sau khi khởi tạo, mỗi DataNode sẽ báo cáo lên NameNode các block nó đang lƣu trữ. Sau khi hoàn tất, DataNode sẽ tiếp tục liên lạc với NameNode để cung cấp thông tin về sự thay đổi dữ liệu cục bộ và nhận các chỉ thị để tạo, di chuyển hay xóa các block từ đĩa cục bộ.

Nhiệm vụ của Secondary NameNode:

Secondary NameNode (SNN) là một tiến trình nền (daemon) để hỗ trợ cho việc theo dõi trạng thái của HDFS cluster. Cũng nhƣ NameNode, mỗi cluster cũng có một SNN và thƣờng chạy trên một server riêng. Không có DataNode hoặc TaskTracker nào chạy trên server này. Điểm khác của SNN so với NameNode là nó không nhận và lƣu lại sự thay đổi thời gian thực của HDFS. Thay vào đó, nó liên hệ trực tiếp với NameNode để lƣu lại trạng thái của HDFS sau một khoảng thời gian do ngƣời dùng cấu hình.

30 Nhƣ đã nói ở trên, NameNode là một yếu điểm của Hadoop cluster và SNN giúp giảm thiểu thời gian lỗi và mất dữ liệu. Tuy nhiên, khi một NameNode gặp sự cố, thì cần có con ngƣời can thiệp và cấu hình lại cluster để SNN có thể trở thành NameNode.

31

Chƣơng 3: THIẾT KẾ THUẬT TOÁN CHO MAPREDUCE

3 Thiết kế thuật toán cho MapReduce

Phần lớn sức mạnh của MapReduce đến từ sự đơn giản: để chuẩn bị cho dữ liệu đầu vào, lập trình viên chỉ cần cài đặt mapper và reducer, hoặc thêm partioner và combiner. Tất cả phần thực thi đƣợc xử lý trong suốt bởi Execution framework – trên các clusters từ một đến hàng nghìn node, trên các tập dữ liệu từ gigabytes đến petabytes. Tuy nhiên, nó cũng có nghĩa là bất cứ thuật toán nào ngƣời lập trình muốn phát triển cũng phải đƣợc diễn tả theo một cách nghiêm ngặt theo các thành phần đã đƣợc định nghĩa sẵn. Điều đó có nghĩa không phải bất kỳ thuật toán nào cũng có thể chuyển sang mô hình lập trình này. Mục đích của chƣơng này là cung cấp, chủ yếu qua các ví dụ để thiết kế thuật toán cho MapReduce.

Đồng bộ hóa có lẽ là phần khó nhất của việc thiết kế thuật toán cho MapReduce (và các thuật toán song song hoặc phân tán nói chung). Trong các bài toán xử lý song song, các tiến trình trong các node khác nhau trong một cụm tại một thời điểm nào đó phải dồn lại với nhau, ví dụ: phân tán các kết quả từng phần từ các nodes tạo ra chúng đến các nodes sẽ sử dụng chúng. Với một MapReduce Job, chỉ có một lần đồng bộ hóa trên toàn cluster – giai đoạn sort và shuffle, lúc mà các cặp key-value trung gian đƣợc copy từ mapper đến reducer và gộp theo key. Ngoài lúc đó, mapper và reducer chạy độc lập và không có cơ chế liên lạc trực tiếp giữa chúng. Hơn nữa, ngƣời lập trình có rất ít sự điều khiển trên nhiều khía cạnh của sự thực thi, ví dụ:

Chỉ định Node cho một Mapper hoặc Reducer cụ thể.

Chỉ định thời gian bắt đầu và kết thúc của Mapper hoặc Reducer. Chỉ định Mapper sẽ xử lý cặp key-value cụ thể.

Chỉ định Reducer sẽ xử lý các cặp key-value trung gian.

Tuy nhiên, lập trình viên cũng có một số kĩ thuật để điều khiển việc thực thi và quản lý dòng dữ liệu trong MapReduce. Bao gồm:

Khả năng xây dựng các cấu trúc dữ liệu phức tạp dùng làm keys và values để lƣu trữ và giao tiếp các kết quả từng phần.

Khả năng thực thi các đoạn mã của ngƣời dùng lúc bắt đầu và kết thúc map và reduce task.

Khả năng bảo toàn trạng thái giữa các mapper và reducer qua nhiều khóa đầu vào hoặc trung gian.

32 Khả năng điều khiển thứ tự sắp xếp của các keys trung gian, do đó có thể biết đƣợc thứ tự các key mà reducer sẽ nhận.

Khả năng điều khiển phân mảnh không gian khóa, do đó có thể biết đƣợc thứ tự tập khóa mà một reducer nào đó sẽ nhận.

Một MapReduce Job không thể biểu diễn tất cả các thuật toán. Ngƣời lập trình thƣờng phải phân tích thuật toán phức tạp thành một chuỗi các jobs, yêu cầu chuỗi các dữ liệu liên tục, vì thế đầu ra của một job trở thành đầu vào của job kế tiếp. Nhiều thuật toán thƣờng có bản chất lặp đi lặp lại, đòi hỏi sự thực thi lặp đi lặp lại để đạt đƣợc một ngƣỡng hội tụ cần thiết.

Chƣơng này sẽ giải thích các kĩ thuật khác nhau để điều khiển sự thực thi lệnh và dòng dữ liệu có thể đƣợc áp dụng để thiết kế thuật toán trong MapReduce.

3.1 Local Aggregation

Trong việc xử lý dữ liệu lớn, một phần quan trọng nhất của sự đồng bộ hóa là việc trao đổi các kết quả trung gian từ các tiến trình tạo ra nó đến các tiến trình sẽ sử dụng nó. Trong môi trƣờng xử lý song song thì các kết quả trung gian này phải đƣợc truyền qua mạng. Hơn nữa, trong Hadoop các kết quả trung gian đƣợc ghi vào đĩa cục bộ trƣớc khi đƣợc gửi qua mạng. Vì độ trễ của mạng và đĩa cao hơn nhiều so với các phép toán khác nên việc giảm số lƣợng các kết quả trung gian sẽ làm tăng tính hiệu quả của thuật toán. Trong MapReduce, việc gộp cục bộ các kết quả trung gian là một trong các cách giúp cho thuật toán nhanh hơn. Thông qua việc sử dụng Combiner và khả năng bảo toàn trạng thái giữa các đầu vào, ta có thể giảm một lƣợng lớn các cặp key-value dùng cho pha shuffle and sort giữa các Mapper và Reducer.

33 Hình 10 mô tả việc tạo đối tƣợng và bản toàn trạng thái trong Hadoop, một đối tƣợng Mapper và Reducer đƣợc tạo ra tƣơng ứng với một task, hàm Configure đƣợc chạy lúc khởi tạo đối tƣợng, hàm map/reduce chạy tƣơng ứng với mỗi cặp key-value, hàm close đƣợc chạy khi hủy đối tƣợng. Trạng thái (state) của đối tƣợng đƣợc bảo toàn qua các lần gọi hàm map/reduce.

Combiner và In-Mapper combining 3.1.1

Để minh họa các kỹ thuật khác nhau của hàm gộp cục bộ. Ta sử dụng ví dụ là chƣơng trình Wordcount:

Một phần của tài liệu XỬ lý dữ LIỆU PHÂN tán với MAPREDUCE và xây DỰNG ỨNG DỤNG MINH họa (Trang 25 - 87)

Tải bản đầy đủ (PDF)

(87 trang)