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.

  • 🔘 Những điều cơ bản khi tham gia: Tập dữ liệu nhỏ hơn trong hai tập dữ liệu được phân phối đến mọi nút dữ liệu và được sử dụng làm phía tra cứu.
  • ☑️ Kết nối phía bản đồ: Yêu cầu mỗi đầu vào phải được phân vùng, chia đều và sắp xếp theo khóa kết nối trước khi hàm map được thực thi.
  • Nối phía giảm: Không cần phân vùng, vì mọi bộ dữ liệu có chung khóa liên kết đều được đưa vào cùng một reducer.
  • 🧪 Ví dụ thực tế: Các tệp DeptName.txt và DeptStrength.txt được sao chép vào HDFS và được kết nối dựa trên Dept_ID bằng một tập tin jar đóng gói.
  • 🛠️ Các loại quầy: Mỗi công việc đều đi kèm với năm nhóm bộ đếm tích hợp sẵn, và các bộ đếm do người dùng định nghĩa được khai báo là một Java liệt kê.
  • ⚠️ Sử dụng ngược lại: Việc tăng bộ đếm cho mỗi bản ghi bị thiếu hoặc không hợp lệ sẽ biến các vấn đề về chất lượng dữ liệu thành một con số trong báo cáo công việc.

Hướng dẫn sử dụng lệnh join và counter trong Hadoop MapReduce kèm ví dụ minh họa.

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.

  1. 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.
  2. 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.

Sơ đồ quy trình so sánh phép nối phía map với phép nối phía reduce trong Hadoop.
Các loại kết nối trong Hadoop MapReduce

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.

Tệp đầu vào đầu tiên liệt kê ID phòng ban cùng với tên phòng ban.

Tệp 1
Tệp đầu vào thứ hai liệt kê ID phòng ban cùng với giá trị nhân sự của phòng ban.

Tệp 2

Đầ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.

Cửa sổ terminal sau khi chuyển sang tài khoản hduser bằng lệnh su.

Bước 1) Sao chép tệp zip vào vị trí bạn chọn

Tệp lưu trữ MapReduceJoin đã tải xuống được đặt trong thư mục làm việc đã 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ữ.

Liệt kê các tập tin trong bảng điều khiển, ví dụ:tracted from MapReduceJoin.tar.gz

Bước 3) Chuyển đến thư mục MapReduceJoin/

cd MapReduceJoin/

Dấu nhắc lệnh shell sau khi chuyển đến thư mục 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.

Các thông báo khởi động từ các tập lệnh daemon HDFS và YARN

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 /

Cả hai tệp văn bản đầu vào đều được sao chép vào thư mục gốc của HDFS.

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.

Khởi chạy tệp jar MapReduceJoin đã đóng gói trên dòng lệnh.

Đầu ra bảng điều khiển tractheo dõi tiến trình của công việc kết hợp MapReduce.

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

Các bản ghi của phòng ban đã được in từ HDFS bằng lệnh cat.

Kết quả cũng có thể được nhìn thấy thông qua giao diện web như-

Trang đích giao diện web Hadoop được sử dụng để truy cập trình duyệt hệ thống tập tin.

Bây giờ hãy chọn 'Duyệt hệ thống tệp' và điều hướng đến /output_mapreducejoin.

Duyệt qua chế độ xem hệ thống tệp HDFS đến thư mục output_mapreducejoin

Mở phần r-00000

Chọn tệp đầu ra part-r-00000 trong chế độ xem trình duyệt

Kết quả được hiển thị

Các hàng hiển thị tên phòng ban đã tham gia và số lượng nhân viên của phòng ban đó trong trình duyệt.

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.

  1. 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.
  2. 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, OutputCollectorReporter 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.

Câu Hỏi Thường Gặp

Chọn biến thể mapper khi một phía đủ nhỏ để lưu trữ trong bộ nhớ trên mọi nút, vì nó bỏ qua hoàn toàn bước xáo trộn. Chọn biến thể reducer khi cả hai phía đều lớn hoặc chưa được sắp xếp, và chấp nhận chi phí mạng phát sinh thêm.

Các mô hình học hỏi từ lịch sử công việc trước đó để dự đoán thời gian chạy, đề xuất kích thước phân chia và số lượng reducer, đồng thời phát hiện sự sai lệch từ các giá trị bộ đếm. Chúng cũng gắn cờ các công việc có bộ đếm bản ghi bị tràn hoặc tác vụ thất bại vượt ra ngoài phạm vi bình thường của quy trình đó.

Copilot tạo ra các khung sườn mapper và reducer hợp lý, nhưng nó tự ý kết hợp gói mapred cũ với gói mapreduce mới hơn trong cùng một lớp, điều này sẽ không biên dịch được. Hãy sửa các câu lệnh import và chữ ký phương thức trước khi tin tưởng vào logic của nó.

Đó là cơ chế vận chuyển tập tin nhỏ hơn đến mọi nút trước khi các tác vụ bắt đầu. Mỗi mapper sau đó tải bản sao đó vào một hash map và tìm kiếm các kết quả khớp cục bộ, điều này cho phép thực hiện phép nối (join) phía mapper.

Chúng được in trong bản tóm tắt trên bảng điều khiển khi công việc hoàn tất, hiển thị trong lịch sử công việc và các trang web quản lý tài nguyên, và có thể đọc được bằng lập trình từ đối tượng công việc, do đó trình điều khiển có thể kiểm tra chúng và báo lỗi nếu quá trình chạy không thành công.

Một đối tượng Context duy nhất. Nó đảm nhiệm công việc mà OutputCollector và Reporter từng phân chia, do đó đầu ra được ghi và bộ đếm được tăng lên thông qua cùng một handle được truyền vào phương thức map.

Đối với hầu hết các công việc báo cáo, câu trả lời là không. Tham gia HiveQL Việc biên dịch thành cùng một mẫu xáo trộn và hợp nhất chỉ trong vài dòng. Những công việc viết tay sẽ đáng giá hơn khi logic hợp nhất không phù hợp với mệnh đề SQL.

Hadoop từ chối ghi vào thư mục đầu ra đã tồn tại, điều này giúp bảo vệ kết quả cuối cùng khỏi bị ghi đè. Trước tiên, hãy xóa thư mục đó một cách đệ quy, hoặc truyền một đường dẫn đầu ra khác trong lần chạy tiếp theo.

Tóm tắt bài viết này với: