Hadoop MapReduce Tham gia & truy cập bằng ví dụ
⚡ Tóm tắt thông minh
Các phép nối MapReduce kết hợp hai tập dữ liệu lớn dựa trên một khóa chung, được thực hiện bên trong bộ xử lý ánh xạ (mapper) hoặc bộ xử lý giảm (reducer), trong khi các bộ đếm MapReduce thu thập số liệu thống kê về công việc để có thể đo lường các bản ghi lỗi thay vì chỉ phỏng đoán.
Join trong MapReduce là gì?
Thao tác MapReduce Join được sử dụng để kết hợp hai tập dữ liệu lớn. Tuy nhiên, quá trình này đòi hỏi phải viết rất nhiều mã để thực hiện thao tác kết hợp thực tế. Việc kết hợp hai tập dữ liệu bắt đầu bằng việc so sánh kích thước của mỗi tập dữ liệu. Nếu một tập dữ liệu nhỏ hơn so với tập dữ liệu kia, thì tập dữ liệu nhỏ hơn sẽ được phân phối đến mọi nút dữ liệu trong cụm.
Khi tham gia vào Bản đồGiảm Khi được phân tán, Mapper hoặc Reducer sẽ sử dụng tập dữ liệu nhỏ hơn để thực hiện tra cứu các bản ghi phù hợp từ tập dữ liệu lớn, sau đó kết hợp các bản ghi đó để tạo thành các bản ghi đầu ra.
Các loại tham gia
Tùy thuộc vào vị trí thực hiện phép nối, các phép nối trong Hadoop được phân loại thành hai loại.
- Tham gia bên cạnh bản đồ — Khi phép nối được thực hiện bởi mapper, nó được gọi là phép nối phía map. Trong loại này, phép nối được thực hiện trước khi dữ liệu thực sự được hàm map sử dụng. Bắt buộc đầu vào cho mỗi map phải ở dạng phân vùng và được sắp xếp theo thứ tự. Ngoài ra, phải có số lượng phân vùng bằng nhau và chúng phải được sắp xếp theo khóa nối.
- Nối giảm phía — Khi phép nối được thực hiện bởi reducer, nó được gọi là phép nối phía reducer. Trong phép nối này, không cần thiết phải có tập dữ liệu ở dạng cấu trúc (hoặc được phân vùng). Ở đây, quá trình xử lý phía map sẽ phát ra khóa nối và các bộ dữ liệu tương ứng của cả hai bảng. Kết quả của quá trình xử lý này là tất cả các bộ dữ liệu có cùng khóa nối sẽ được đưa vào cùng một reducer, sau đó reducer sẽ nối các bản ghi có cùng khóa nối.
Luồng quy trình tổng thể của các phép nối trong Hadoop được mô tả trong sơ đồ bên dưới.

Sau khi đã làm rõ hai biến thể, phần tiếp theo sẽ hướng dẫn cách thực hiện phép nối giảm chiều trên hai tập tin nhỏ của các phòng ban.
Cách kết hợp hai bộ dữ liệu: Ví dụ về MapReduce
Có hai tập dữ liệu trong hai tệp khác nhau (như hình bên dưới). Khóa Dept_ID là khóa chung trong cả hai tệp. Mục tiêu là sử dụng MapReduce Join để kết hợp các tệp này.
Đầu vào: Bộ dữ liệu đầu vào là một tệp văn bản, DeptName.txt và DeptStrength.txt
Tải xuống tập tin đầu vào từ đây
Đảm bảo bạn có Hadoop đã được cài đặt. Trước khi bắt đầu với quy trình thực tế của ví dụ MapReduce Join, hãy đổi người dùng thành 'hduser' (ID được sử dụng trong quá trình cấu hình Hadoop, bạn có thể chuyển sang ID người dùng được sử dụng trong quá trình cấu hình Hadoop của mình).
su - hduser_
Lời nhắc sẽ chuyển sang tài khoản Hadoop, như hình bên dưới.
Bước 1) Sao chép tệp zip vào vị trí bạn chọn
Bước 2) Giải nén tệp Zip
sudo tar -xvf MapReduceJoin.tar.gz
Người tình cũtracTên các tập tin được liệt kê sẽ cuộn qua khi tar giải nén tệp lưu trữ.
Bước 3) Chuyển đến thư mục MapReduceJoin/
cd MapReduceJoin/
Bước 4) Bắt đầu Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Cả hai đoạn mã đều in ra các tiến trình nền mà chúng khởi chạy.
Bước 5) DeptStrength.txt và DeptName.txt là các tệp đầu vào được sử dụng cho chương trình ví dụ MapReduce Join này.
Các tệp này cần được sao chép đến HDFS sử dụng lệnh sau:
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Bước 6) Chạy chương trình bằng lệnh bên dưới-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Lệnh được hiển thị trước, sau đó tiến trình của tác vụ sẽ được báo cáo trên bảng điều khiển.
Bước 7) Sau khi thực thi, tệp đầu ra (có tên 'part-00000') sẽ được lưu trữ trong thư mục /output_mapreducejoin trên HDFS.
Kết quả có thể được nhìn thấy bằng giao diện dòng lệnh
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
Kết quả cũng có thể được nhìn thấy thông qua giao diện web như-
Bây giờ hãy chọn 'Duyệt hệ thống tệp' và điều hướng đến /output_mapreducejoin.
Mở phần r-00000
Kết quả được hiển thị
LƯU Ý: Xin lưu ý rằng trước khi chạy chương trình này vào lần tiếp theo, bạn sẽ cần xóa thư mục đầu ra /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
Cách khác là sử dụng tên khác cho thư mục đầu ra.
Các phép nối cho bạn biết dữ liệu trông như thế nào. Các bộ đếm, sẽ được đề cập tiếp theo, cho bạn biết công việc tạo ra dữ liệu đó đã hoạt động ra sao.
Bộ đếm trong MapReduce là gì?
Bộ đếm trong MapReduce là một cơ chế được sử dụng để thu thập và đo lường thông tin thống kê về các tác vụ và sự kiện trong MapReduce. Bộ đếm giúp theo dõi... tracBộ đếm (k) ghi lại nhiều số liệu thống kê khác nhau về công việc trong MapReduce, chẳng hạn như số lượng thao tác đã thực hiện và tiến độ của thao tác. Chúng được sử dụng để chẩn đoán sự cố trong MapReduce.
Bộ đếm của Hadoop tương tự như việc đặt thông điệp tường trình vào mã cho bản đồ hoặc thu nhỏ. Thông tin này có thể hữu ích cho việc chẩn đoán sự cố trong quá trình xử lý công việc MapReduce.
Thông thường, các bộ đếm này trong Hadoop được định nghĩa trong một chương trình (map hoặc reduce) và được tăng lên trong quá trình thực thi khi một sự kiện hoặc điều kiện cụ thể (đặc trưng cho bộ đếm đó) xảy ra. Một ứng dụng rất tốt của các bộ đếm Hadoop là để track bản ghi hợp lệ và không hợp lệ từ một tập dữ liệu đầu vào.
Các loại bộ đếm MapReduce
Về cơ bản có 2 loại bộ đếm MapReduce.
- Các bộ đếm tích hợp sẵn của Hadoop: Có một số bộ đếm Hadoop tích hợp tồn tại cho mỗi công việc. Dưới đây là các nhóm truy cập tích hợp-
- Bộ đếm tác vụ MapReduce — Thu thập thông tin cụ thể liên quan đến tác vụ (ví dụ: số lượng bản ghi đầu vào) trong suốt thời gian thực thi.
- Bộ đếm hệ thống tập tin — Thu thập thông tin như số byte được đọc hoặc ghi bởi một tác vụ.
- Bộ đếm định dạng đầu vào tệp — Thu thập thông tin về số byte được đọc thông qua FileInputFormat.
- Bộ đếm định dạng đầu ra tệp — Thu thập thông tin về số byte được ghi thông qua FileOutputFormat.
- Bộ đếm việc làm — Các bộ đếm này ghi lại số liệu thống kê chung cho toàn bộ công việc, chẳng hạn như số lượng tác vụ được khởi chạy cho một công việc.
- Bộ đếm do người dùng định nghĩa: Ngoài các bộ đếm tích hợp sẵn, người dùng có thể tự định nghĩa các bộ đếm của riêng mình bằng cách sử dụng các chức năng tương tự được cung cấp bởi các ngôn ngữ lập trình. Ví dụ, trong Java, một 'enum' được sử dụng để định nghĩa các bộ đếm do người dùng xác định.
💡 Ghi chú phiên bản: Bộ đếm công việc được duy trì bởi JobTracker dưới MRv1. Trên YARN, vai trò đó thuộc về MapReduce ApplicationMaster, vì vậy tên bộ đếm vẫn giữ nguyên nhưng thành phần báo cáo chúng đã thay đổi.
Một tác vụ không thể khai báo số lượng bộ đếm không giới hạn. mapreduce.job.counters.max Theo mặc định, cài đặt này giới hạn tổng số lượng cho mỗi công việc ở mức 120, và một công việc khai báo nhiều hơn sẽ thất bại với lỗi. LimitExceededExceptionVì vậy, bộ đếm được thiết kế để hiển thị một số tín hiệu tổng hợp chứ không phải để đếm từng tín hiệu riêng lẻ.
Ví dụ về bộ đếm
Ví dụ về MapClass sử dụng Counters để đếm số lượng giá trị thiếu và không hợp lệ. Tệp dữ liệu đầu vào được sử dụng trong hướng dẫn này: Tập dữ liệu đầu vào của chúng ta là một tệp CSV, SalesJan2009.csv
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { static enum SalesCounters { MISSING, INVALID }; public void map ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if (country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } else if (sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else { output.collect(new Text(country), new Text(sales + ",1")); } } }
Đoạn mã trên thể hiện một ví dụ về cách triển khai bộ đếm trong Hadoop MapReduce.
Ở đây, Quầy bán hàng là một bộ đếm được định nghĩa bằng cách sử dụng 'liệt kê'. Nó được sử dụng để đếm các bản ghi đầu vào THIẾU và KHÔNG HỢP LỆ.'
Trong đoạn mã, nếu 'đất nướcNếu trường ' có độ dài bằng không thì giá trị của nó bị thiếu và do đó bộ đếm tương ứng SalesCounters.MISSING được tăng lên.'
Tiếp theo, nếu 'bán hàngNếu trường bắt đầu bằng dấu ngoặc kép “ thì bản ghi được coi là KHÔNG HỢP LỆ. Điều này được thể hiện bằng cách tăng bộ đếm SalesCounters.INVALID.
💡 Lưu ý về API: Đoạn mã trên sử dụng bản gốc. org.apache.hadoop.mapred API, nơi MapReduceBase, Các Mapper giao diện, OutputCollector và Reporter xuất hiện riêng biệt. Mã hiện tại được viết dựa trên org.apache.hadoop.mapreduce, trong đó một cá thể Context thay thế bộ thu thập và bộ báo cáo, và một bộ đếm được tăng lên bằng context.getCounter(SalesCounters.MISSING).increment(1)Khái niệm về quầy hàng hoàn toàn giống nhau ở cả hai trường hợp.











