Home > Programming > Kiến thức cơ bản để viết ứng dụng MapReduce

Kiến thức cơ bản để viết ứng dụng MapReduce

Để viết 1 ứng dụng MapReduce chạy trên Hadoop, điều quan trọng nhất là chuẩn bị 2 hàm số Map và Reduce, tuy nhiên cũng còn nhiều thành phần khác cần phải biết. Để dễ hiểu, có thể tóm tắt đường đi của dữ liệu trong ứng dụng MapReduce như hình sau:

Và quá trình thực thi ứng dụng như sau:

Chúng ta sẽ lần lượt tìm hiểu từng thành phần một.

Input Files : thường lưu trên HDFS, kiểu tập tin không cố định và dung lượng thường rất lớn, có thể đến vài GB.

InputFormat: định nghĩa InputSplits để cắt nhỏ file input chia cho các nhiệm vụ và RecordReader để đọc những mảnh nhỏ đó (split) vào map. Tất cả các hàm InputFormat đều kế thừa tính năng và đặc tính của lớp trừu tượng FileInputFormat. Khi một nhiệm vụ Hadoop được khởi động, thư mục chứa file input sẽ được nhập vào đối tượng FileInputFormat. FileInputFormat sẽ đọc tất cả các file có trong thu mục đó, và sau đó nó sẽ phân các file này thành nhiều InputSplit. Có thể dùng đối tượng JobCof để thiết lập định dạng file input (bằng lệnh JobCof.setInputFormat). Các định dạng bao gồm:

Trong đó, TextInputFormat là dạng mặc định còn KeyValueInputFormat là mặc định OutputFormat, có thể dùng cho kết quả trung gian.

InputSplit: định nghĩa dữ liệu nhập vào nhiệm vụ Map. InputSplit phân 1 file thành các split 64MB, nhưng cũng có thể thiết lập bằng tham số mapred.min.split.size

RecordReader: định nghĩa cách chuyển đổi split thành cặp key-value và truyền vào Mapper. TextInputFormat cung cấp LineRecordReader.

Mỗi Mapper sinh ra một Java process, có tham số OutputCollector để thu thập kết quả trung gian và Reporter để báo cáo trạng thái hiện tại.

Patitioner qui định kết quả trung gian key-value nào được truyền cho Reducer nào. Quá trình truyền này gọi là Shuffle. Khi 1 hàm Reduce nhận được các cặp key-value từ nhiều hàm Map truyền tới (các cặp key-value có cùng key được truyền về cùng 1 hàm reduce), đồng thời sẽ sắp xếp để các cặp có cùng key nằm cạnh nhau. Đây là quá trình Sort. Sort và Shuffle được tiến hành song song.

Mỗi Reducer dùng đối tượng OutputFormat (được thừa kế từ FileOutputFormat) để viết vào thư mục (chung cho tất cả các Reducer của ứng dụng đó) trong HDFS một file có tên là part-nnnnn, trong đó nnnnn là số partition id của Reducer. Dùng lệnh FileOutputFormat.setOutputPath() để chỉ định thư mục xuất ra và JobConf.setOutputFormat() để chỉ định đối tượng OutputFormat. Các loại OutputFormat gồm:

Tương tự lúc nhập, OutputFormat cũng có RecordWriter để hướng dẫn viết vào file output như thế nào.

Như đã nói ở phần trước Combiner cũng rất quan trọng trong việc giảm tải lượng dữ liệu truyền từ Map về Reduce. Combiner nằm trước Partitioner:

Có thể dùng JobCof.setCombinerClass() để chỉ định lớp Combiner này.

Với kiến thức cơ bản trên đây, bạn hãy đối chiếu và phân tích ví dụ wordcount để hiểu rõ hơn.

Categories: Programming Tags: ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: