Bản đồ thay thế python
Trong hướng dẫn này, tôi sẽ mô tả cách viết một chương trình MapReduce đơn giản cho Hadoop bằng ngôn ngữ lập trình Python Show
Mặc dù khung Hadoop được viết bằng Java, nhưng các chương trình dành cho Hadoop không cần phải được mã hóa bằng Java mà còn có thể được phát triển bằng các ngôn ngữ khác như Python hoặc C++ (ngôn ngữ sau kể từ phiên bản 0. 14. 1). Tuy nhiên, tài liệu của Hadoop và ví dụ Python nổi bật nhất trên trang web Hadoop có thể khiến bạn nghĩ rằng bạn phải dịch mã Python của mình bằng cách sử dụng Jython sang tệp jar Java. Rõ ràng, điều này không thuận tiện lắm và thậm chí có thể gây rắc rối nếu bạn phụ thuộc vào các tính năng Python không được cung cấp bởi Jython. Một vấn đề khác của cách tiếp cận Jython là chi phí viết chương trình Python của bạn theo cách mà nó có thể tương tác với Hadoop – chỉ cần xem ví dụ trong 2 và bạn sẽ hiểu ý tôi muốn nóiĐiều đó nói rằng, mặt đất hiện đã được chuẩn bị cho mục đích của hướng dẫn này. viết chương trình Hadoop MapReduce theo cách Pythonic hơn, tôi. e. theo một cách bạn nên làm quen với Chúng tôi muốn làm gìChúng tôi sẽ viết một chương trình MapReduce đơn giản (xem thêm bài viết MapReduce trên Wikipedia) cho Hadoop trong Python nhưng không sử dụng Jython để dịch mã của chúng tôi sang các tệp jar Java Chương trình của chúng tôi sẽ bắt chước Đếm từ, tôi. e. nó đọc các tệp văn bản và đếm tần suất các từ xuất hiện. Đầu vào là các tệp văn bản và đầu ra là các tệp văn bản, mỗi dòng chứa một từ và số lần xuất hiện của từ đó, được phân tách bằng một tab Ghi chú. Bạn cũng có thể sử dụng các ngôn ngữ lập trình khác ngoài Python như Perl hoặc Ruby với "kỹ thuật" được mô tả trong hướng dẫn này điều kiện tiên quyếtBạn nên thiết lập và chạy một cụm Hadoop vì chúng ta sẽ bị bẩn tay. Nếu bạn chưa có cụm, các hướng dẫn sau đây của tôi có thể giúp bạn xây dựng một cụm. Các hướng dẫn được thiết kế riêng cho Ubuntu Linux nhưng thông tin cũng áp dụng cho các biến thể Linux/Unix khác
"Mẹo" đằng sau mã Python sau đây là chúng tôi sẽ sử dụng API phát trực tuyến Hadoop (xem thêm mục nhập wiki tương ứng) để giúp chúng tôi truyền dữ liệu giữa mã Map và mã Giảm thông qua 3 (đầu vào tiêu chuẩn) và 4 (đầu ra tiêu chuẩn). Chúng tôi sẽ chỉ sử dụng 5 của Python để đọc dữ liệu đầu vào và in kết quả của riêng chúng tôi tới 6. Đó là tất cả những gì chúng ta cần làm vì Hadoop Streaming sẽ lo mọi thứ khácbản đồ bước. người lập bản đồ. pyLưu đoạn mã sau vào tệp 7. Nó sẽ đọc dữ liệu từ 3, chia nó thành các từ và xuất ra một danh sách các dòng ánh xạ các từ để đếm (trung gian) của chúng thành 4. Mặc dù vậy, tập lệnh Bản đồ sẽ không tính tổng (trung gian) các lần xuất hiện của một từ. Thay vào đó, nó sẽ xuất ra bộ dữ liệu 0 ngay lập tức – mặc dù một từ cụ thể có thể xuất hiện nhiều lần trong đầu vào. Trong trường hợp của chúng tôi, chúng tôi để bước Giảm tiếp theo thực hiện phép tính tổng cuối cùng. Tất nhiên, bạn có thể thay đổi hành vi này trong tập lệnh của riêng mình nếu muốn, nhưng chúng tôi sẽ giữ nguyên như vậy trong hướng dẫn này vì lý do mô phạm. . -)Đảm bảo rằng tệp có quyền thực thi ( 1 nên thực hiện thủ thuật này) nếu không bạn sẽ gặp sự cố 0Giảm bước. bộ giảm tốc. pyLưu đoạn mã sau vào tệp 2. Nó sẽ đọc kết quả của 3 từ 3 (vì vậy định dạng đầu ra của 3 và định dạng đầu vào dự kiến của 6 phải khớp nhau) và tính tổng số lần xuất hiện của mỗi từ thành một số đếm cuối cùng, sau đó xuất kết quả của nó cho 4Đảm bảo rằng tệp có quyền thực thi ( 8 nên thực hiện thủ thuật này) nếu không bạn sẽ gặp sự cố
Kiểm tra mã của bạn (dữ liệu mèo. bản đồ. loại. giảm)Tôi khuyên bạn nên kiểm tra cục bộ tập lệnh 3 và 6 trước khi sử dụng chúng trong công việc MapReduce. Nếu không, công việc của bạn có thể hoàn thành thành công nhưng sẽ không có dữ liệu kết quả công việc nào cả hoặc không phải là kết quả mà bạn mong đợi. Nếu điều đó xảy ra, rất có thể chính bạn (hoặc tôi) đã làm hỏng việcDưới đây là một số ý tưởng về cách kiểm tra chức năng của Tập lệnh Bản đồ và Giảm ________số 8 Chạy mã Python trên HadoopTải xuống dữ liệu đầu vào ví dụChúng tôi sẽ sử dụng ba sách điện tử từ Project Gutenberg cho ví dụ này
Tải xuống từng sách điện tử dưới dạng tệp văn bản ở mã hóa 21 và lưu trữ tệp trong thư mục tạm thời cục bộ do bạn chọn, ví dụ như 22 2Sao chép dữ liệu mẫu cục bộ sang HDFSTrước khi chúng tôi chạy công việc MapReduce thực tế, trước tiên chúng tôi phải sao chép các tệp từ hệ thống tệp cục bộ của mình sang HDFS của Hadoop 5Chạy công việc MapReduceBây giờ mọi thứ đã được chuẩn bị, cuối cùng chúng ta có thể chạy công việc Python MapReduce của mình trên cụm Hadoop. Như tôi đã nói ở trên, chúng tôi tận dụng API truyền phát Hadoop để giúp chúng tôi truyền dữ liệu giữa mã Map và mã Giảm thông qua 3 và 4 8Nếu bạn muốn sửa đổi một số cài đặt Hadoop một cách nhanh chóng như tăng số lượng tác vụ Giảm, bạn có thể sử dụng tùy chọn 25 0Lưu ý về ánh xạ. bản đồ. nhiệm vụ. Hadoop không tôn trọng mapred. bản đồ. nhiệm vụ ngoài việc coi đó là một gợi ý. Nhưng nó chấp nhận ánh xạ do người dùng chỉ định. giảm. nhiệm vụ và không thao tác đó. Bạn không thể buộc ánh xạ. bản đồ. nhiệm vụ nhưng có thể chỉ định ánh xạ. giảm. nhiệm vụ Công việc sẽ đọc tất cả các tệp trong thư mục HDFS 26, xử lý và lưu trữ kết quả trong thư mục HDFS 27. Nói chung, Hadoop sẽ tạo một tệp đầu ra cho mỗi bộ giảm tốc; Đầu ra ví dụ của lệnh trước đó trong bảng điều khiển 3Như bạn có thể thấy trong kết quả ở trên, Hadoop cũng cung cấp giao diện web cơ bản cho thống kê và thông tin. Khi cụm Hadoop đang chạy, hãy mở http. //máy chủ cục bộ. 50030/ trong trình duyệt và nhìn xung quanh. Đây là ảnh chụp màn hình giao diện web Hadoop cho công việc chúng tôi vừa thực hiện Hình 1. Ảnh chụp màn hình giao diện web JobTracker của Hadoop, hiển thị chi tiết về công việc MapReduce mà chúng tôi vừa chạy Kiểm tra xem kết quả có được lưu trữ thành công trong thư mục HDFS không 27 5Sau đó, bạn có thể kiểm tra nội dung của tệp bằng lệnh 29 7Lưu ý rằng trong đầu ra cụ thể này phía trên các dấu ngoặc kép ( 50) kèm theo các từ chưa được Hadoop chèn vào. Chúng là kết quả của cách mã Python của chúng tôi tách các từ và trong trường hợp này, nó khớp với phần đầu của một trích dẫn trong văn bản sách điện tử. Chỉ cần kiểm tra thêm tệp 51 để tự mình xemMã Mapper và Reducer được cải tiến. sử dụng trình lặp và trình tạo PythonCác ví dụ về Mapper và Reducer ở trên sẽ cung cấp cho bạn ý tưởng về cách tạo ứng dụng MapReduce đầu tiên của bạn. Trọng tâm là mã đơn giản và dễ hiểu, đặc biệt đối với người mới bắt đầu sử dụng ngôn ngữ lập trình Python. Tuy nhiên, trong một ứng dụng trong thế giới thực, bạn có thể muốn tối ưu hóa mã của mình bằng cách sử dụng trình tạo và trình lặp Python (phần giới thiệu thậm chí còn tốt hơn trong PDF) Nói chung, trình vòng lặp và trình tạo (các hàm tạo trình vòng lặp, chẳng hạn như với câu lệnh 52 của Python) có lợi thế là một phần tử của chuỗi không được tạo ra cho đến khi bạn thực sự cần nó. Điều này có thể giúp ích rất nhiều về chi phí tính toán hoặc mức tiêu thụ bộ nhớ tùy thuộc vào tác vụ hiện tạiGhi chú. Các tập lệnh Bản đồ và Giảm sau đây sẽ chỉ hoạt động "chính xác" khi được chạy trong ngữ cảnh Hadoop, tôi. e. với tư cách là Mapper và Reducer trong công việc MapReduce. Điều này có nghĩa là chạy lệnh kiểm tra ngây thơ "cat DATA. . /người lập bản đồ. py. sắp xếp -k1,1. . /giảm tốc. py" sẽ không hoạt động chính xác nữa vì một số chức năng được cố ý thuê ngoài cho Hadoop Chính xác, chúng tôi tính toán tổng số lần xuất hiện của một từ, e. g. 53, chỉ khi tình cờ cùng một từ ( 54) xuất hiện nhiều lần liên tiếp. Tuy nhiên, trong phần lớn các trường hợp, chúng tôi để Hadoop nhóm các cặp (khóa, giá trị) giữa bước Bản đồ và bước Giảm vì Hadoop hiệu quả hơn về mặt này so với các tập lệnh Python đơn giản của chúng tôi |