GIT – Tóm tắt:  Bài viết này—bài đầu tiên trong loạt bài về —tìm hiểu khung công tác , bao gồm các phần tử cơ bản của nó, như hệ thống tệp (HDFS) và các kiểu nút được dùng phổ biến. Tìm hiểu cách cài đặt và cấu hình một cụm (cluster) chỉ có một nút và đi sâu nghiên cứu ứng dụng MapReduce. Cuối cùng, khám phá các cách để theo dõi và quản lý bằng cách sử dụng các giao diện Web lõi của nó.

Tài liệu tiếng anh – Bản Gốc http://www.gocit.vn/bai-viet/distributed-data-processing-with-hadoop/

Phần 1: Khởi đầu

Mặc dù Hadoop là lõi thu gọn dữ liệu cho một số các máy tìm kiếm lớn nhất, tốt hơn là mô tả như là một khung công tác để xử lý dữ liệu phân tán. Và không chỉ có dữ liệu, mà còn rất nhiều dữ liệu, khi cần đến các máy tìm kiếm và dữ liệu đã duyệt mà chúng thu thập. Là một khung công tác phân tán, Hadoop làm lợi cho nhiều ứng dụng từ việc xử lý dữ liệu song song.

Bài viết này không có ý giới thiệu cho bạn về Hadoop và kiến trúc của nó mà đúng hơn là chỉ trình bày cách thiết lập Hadoop đơn giản. Trong phần Tài nguyên, bạn có thể tìm thêm nhiều chi tiết về kiến trúc, các thành phần và lý thuyết hoạt động của Hadoop. Vì lý do đó, chúng ta hãy đi ngay vào việc cài đặt và cấu hình Hadoop.

Thiết lập ban đầu

Nguồn gốc của Hadoop

Dự án Hadoop của Apache được gợi ý và phát triển từ công việc trước đây của . Mặc dù nắm giữ bằng sáng chế cho phương pháp xử lý dữ liệu quy mô lớn này, nên họ đã hào phóng cấp giấy phép cho Hadoop. Xem phần Tài nguyên để biết thêm nhiều chi tiết.

Với phần trình bày này, chúng ta sử dụng bản phân phối Hadoop của Cloudera. Bạn sẽ được hỗ trợ về một loạt các bản phân phối ® khác ở đó, vì vậy thật lý tưởng để bắt đầu.

Bài viết này trước tiên giả định rằng hệ thống của bạn đã cài đặt công nghệ Java™ ((bản phát hành tối thiểu là 1.6) và cURL. Nếu chưa có, trước hết bạn cần phải bổ sung thêm những thứ đó (xem phần Tài nguyên để biết thêm thông tin về việc cài đặt này).

Vì đang chạy trên (bản phát hành Intrepid), nên tôi sử dụng tiện ích apt để lấy bản phân phối Hadoop. Quá trình này khá đơn giản và cho phép tôi lấy các gói mã nhị phân mà không cần thêm các chi tiết tải về và xây dựng nguồn. Đầu tiên, tôi nói với apt về trang Web Cloudera. Rồi tôi tạo một tệp mới trong /etc/apt/sources.list.d/cloudera.list và thêm đoạn văn bản sau đây:

deb http://archive.cloudera.com/debian intrepid-cdh3 contrib
deb-src http://archive.cloudera.com/debian intrepid-cdh3 contrib

Nếu bạn đang chạy bản phát hành Jaunty hoặc bản phát hành khác, chỉ cần thay thế intrepid bằng tên của bản phát hành cụ thể của bạn (sự hỗ trợ hiện nay bao gồm Hardy, Intrepid, Jaunty, Karmic và Lenny).

Tiếp theo, tôi lấy khóa-apt từ Cloudera để xác nhận hợp lệ gói phần mềm đã tải về:

$ curl -s http://archive.cloudera.com/debian/archive.key | \
sudo apt-key add - sudo apt-get update

Rồi cài đặt Hadoop cho một cấu hình giả phân tán (tất cả các trình tiện ích của Hadoop chạy trên một máy chủ):

$ sudo apt-get  hadoop-0.20-conf-pseudo

Lưu ý rằng cấu hình này cần khoảng 23MB (chưa kể các gói phần mềm apt khác bất kỳ đã kéo về mà chưa hiện ra). Việc cài đặt này là lý tưởng để làm việc với Hadoop và tìm hiểu về các phần tử và các giao diện của nó.

Cuối cùng, tôi thiết lập SSH chưa có mật khẩu. Nếu bạn cố gắng sử dụng ssh localhost và cụm từ mật khẩu cần thiết, bạn sẽ cần phải thực hiện các bước sau đây. Tôi giả định rằng đây là một hộp Hadoop chuyên dụng, do bước này có một vài sự ngầm định về bảo mật (xem Liệt kê 1).

Liệt kê 1. Thiết lập với SSH-chưa có mật khẩu

$ sudo su -
# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

Một lưu ý cuối cùng là bạn cần phải đảm bảo rằng máy chủ của bạn có đủ dung lượng lưu trữ cho nút dữ liệu (bộ nhớ đệm). Bộ nhớ không đủ rất dễ nhận thấy (như các lỗi cho biết không có khả năng sao chép lại một nút).

 Khởi động Hadoop

Bây giờ, bạn đã sẵn sàng để khởi động Hadoop, cách làm hiệu quả là bạn khởi động từng trình tiện ich (daemon) của Hadoop. Nhưng trước tiên, hãy định dạng Hệ thống tệp Hadoop (HDFS) của bạn bằng cách sử dụng lệnh hadoop. Lệnh hadoop có một số cách sử dụng, chúng ta sẽ tìm hiểu ngay một số trong các cách sử dụng đó.

Trước tiên, yêu cầu nút tên (namenode) định dạng tệp hệ thống DFS. Bạn làm điều này như là một phần của việc cài đặt, nhưng thật có ích để biết việc này khi bạn cần tạo một hệ thống tệp sạch.

# hadoop-0.20 namenode -format

Sau khi nhận được yêu cầu, hệ thống tệp sẽ được định dạng và trả về một số thông tin. Tiếp theo, khởi động các trình tiện ích của Hadoop. Hadoop khởi động năm trình tiện ích trong cấu hình giả phân tán này: nút tên (namenode), nút tên thứ cấp, nút dữ liệu (datanode), trình theo dõi công việc (jobtracker ) và trình theo dõi tác vụ (tasktracker ). Khi một trong các trình tiện ích đã được khởi động, bạn sẽ thấy một số lượng nhỏ văn bản được phát ra cho mỗi một trình tiện ích (xác định nơi lưu trữ các bản ghi nhật ký của nó). Mỗi trình tiện ích đang được khởi động để chạy ở chế độ nền (như là một trình tiện ích). Hình 1 minh họa nút giả phân tán ngay khi việc khởi động hoàn tất.

Hình 1. Cấu hình Hadoop giả phân tán 
Sơ đồ khối của cấu hình Hadoop giả phân tán
Hadoop cung cấp một số công cụ trình trợ giúp để đơn giản hóa việc khởi động của nó. Các công cụ này được phân loại khi bắt đầu (như start-dfs) và dừng lại (như stop-dfs). Kịch bản lệnh ngắn sau đây minh họa cách khởi động nút Hadoop:

# /usr/lib/hadoop-0.20/bin/start-dfs.sh
# /usr/lib/hadoop-0.20/bin/start-mapred.sh

Để xác minh rằng các trình tiện ích đang chạy, bạn có thể sử dụng lệnh jps (là một tiện ích ps cho các quá trình xử lý JVM). Lệnh này liệt kê năm trình tiện ích và các trình nhận dạng quá trình xử lý của chúng.

Bây giờ các trình tiện ích Hadoop đang chạy, chúng ta hãy xem xét lại chúng để giới thiệu xem mỗi trình tiện ích thực hiện cái gì trong khung công tác Hadoop. Nút tên (namenode) là các máy chủ chính trong Hadoop và quản lý vùng tên miền của hệ thống tệp và truy cập vào các tệp được lưu trữ trong cụm. Ngoài ra còn có một nút tên thứ cấp, không phải là một trình tiện ích dự phòng cho nút tên, nhưng cung cấp nhiệm vụ xác định điểm kiểm tra định kỳ và nhiệm vụ nội dịch để thay thế. Bạn sẽ tìm thấy một nút tên và một nút tên thứ cấp trong một cụm Hadoop.

Nút dữ liệu (datanode) quản lý lưu trữ được gắn vào một nút, trong đó có thể có nhiều nút trong một cụm. Mỗi nút lưu trữ dữ liệu sẽ có một trình tiện ích của nút dữ liệu đang chạy.

Cuối cùng, mỗi cụm sẽ có một trình theo dõi công việc (jobtracker) duy nhất chịu trách nhiệm bố trí công việc tại các nút dữ liệu và một trình theo dõi tác vụ (tasktracker) cho mỗi nút dữ liệu để thực hiện các công việc thực tế. Trình theo dõi công việc và trình theo dõi tác vụ hoạt động theo một thỏa thuận chủ-tớ, ở đây trình theo dõi công việc phân phối công việc trên các nút dữ liệu còn trình theo dõi tác vụ thực hiện nhiệm vụ. Trình theo dõi công việc cũng xác nhận hợp lệ công việc cần thiết và nếu nút dữ liệu bị hỏng vì lý do nào đó thì bố trí lại nhiệm vụ trước đó.

Trong cấu hình đơn giản này, tất cả các nút chỉ nằm trên cùng một nút (xem Hình 1). Tuy nhiên, do thảo luận ở trên, thật dễ dàng để xem cách Hadoop tạo việc xử lý công việc song song. Mặc dù kiến trúc đơn giản, nhưng Hadoop tạo cách dễ dàng để phân phối dữ liệu, cân bằng tải và xử lý song song một lượng lớn dữ liệu theo khả năng chịu lỗi.

 Kiểm tra Hệ thống tệp Hadoop (HDFS)

Bạn có thể thực hiện một vài thử nghiệm để đảm bảo rằng Hadoop đã khởi động và chạy bình thường (ít nhất là nút tên). Do biết rằng tất cả các quá trình của bạn có sẵn, bạn có thể sử dụng lệnh hadoop để kiểm tra vùng tên cục bộ (xem Liệt kê 2).

Liệt kê 2. Kiểm tra truy cập vào HDFS

# hadoop-0.20 fs -ls /
Found 2 items
drwxr-xr-x   -  supergroup          0 2010-04-29 16:38 /user
drwxr-xr-x   -  supergroup          0 2010-04-29 16:28 /var

Từ đó, bạn có thể thấy rằng nút tên đã chạy và có khả năng cung cấp vùng tên cục bộ. Lưu ý rằng bạn đang sử dụng một lệnh có tên là hadoop-0.20 để kiểm tra hệ thống tệp. Tiện ích này là cách bạn tương tác với cụm Hadoop, từ việc kiểm tra hệ thống tệp đến chạy các công việc trên cụm đó. Lưu ý cấu trúc lệnh sau: Sau khi chỉ ra tiện ích hadoop-0.20, bạn xác định một lệnh (trong trường hợp này, là shell của hệ thống tệp chung) và một hoặc nhiều tùy chọn (trong trường hợp này, bạn yêu cầu một danh sách tệp bằng cách sử dụng lệnh ls). Khi hadoop-0.20 là một trong các giao diện chính của bạn với cụm Hadoop, bạn sẽ thấy tiện ích này được sử dụng khá hơn một chút qua bài viết này. Liệt kê 3 cung cấp một số phép toán bổ sung của hệ thống tệp để bạn có thể tìm hiểu giao diện này thêm một chút nữa (tạo một thư mục con mới có tên là test, liệt kê nội dung của nó, rồi loại bỏ nó).

Liệt kê 3. Tìm hiểu thao tác hệ thống tệp trong Hadoop

# hadoop-0.20 fs -mkdir test
# hadoop-0.20 fs -ls test
# hadoop-0.20 fs -rmr test
Deleted hdfs://localhost/user/root/test
 Thử nghiệm Hadoop

Bây giờ bạn đã cài đặt Hadoop và đã thử nghiệm giao diện cơ bản với hệ thống tệp của nó, đây là lúc thử nghiệm Hadoop trong một ứng dụng thực. Trong ví dụ này, bạn sẽ thấy quá trình MapReduce trên một tập dữ liệu nhỏ. Người ta đặt tên map (ánh xạ) vàreduce (rút gọn) theo các hàm trong lập trình chức năng có cung cấp khả năng lõi cho việc rút gọn dữ liệu. Map liên quan đến quá trình cắt dữ liệu đầu vào thành một tập các vấn đề con nhỏ hơn để xử lý (trong đó các vấn đề con được phân phối cho các trình hoạt động song song). Reduce liên quan đến việc ráp lại các câu trả lời từ các vấn đề con thành một tập kết quả đầu ra. Lưu ý rằng tôi vẫn chưa định nghĩa xử lý có nghĩa là gì ở đây, do khung công tác cho phép bạn tự xác định việc này. MapReduce chính tắc là việc tính toán sự xuất hiện của từ trong một tập các tài liệu.

Qua thảo luận ở trên, bạn sẽ có một tập các đầu vào và một tập kết quả của các đầu ra. Bước đầu tiên là tạo một thư mục con đầu vào trong hệ thống tệp, trong đó bạn sẽ đặt công việc của mình. Bạn thực hiện việc này bằng cách sử dụng:

# hadoop-0.20 fs -mkdir input

Tiếp theo, đặt một số công việc vào thư mục con đầu vào. Trong trường hợp này, sử dụng lệnh put (đặt) để di chuyển một tệp từ hệ thống tệp cục bộ vào HDFS (xem Liệt kê 4). Lưu ý định dạng dưới đây, di chuyển tệp mã nguồn đến thư mục con HDFS (đầu vào). Sau khi thực hiện xong, bạn sẽ có hai tệp văn bản trong HDFS sẵn sàng để được xử lý.

Liệt kê 4. Di chuyển các tệp vào HDFS

# hadoop-0.20 fs -put /usr/src/linux-source-2.6.27/Doc*/memory-barriers.txt  input
# hadoop-0.20 fs -put /usr/src/linux-source-2.6.27/Doc*/rt-mutex-design.txt  input

Tiếp theo, bạn có thể kiểm tra sự có mặt của các tệp bằng cách sử dụng lệnh ls (xem Liệt kê 5).

Liệt kê 5. Kiểm tra các tệp trong HDFS

# hadoop-0.20 fs -ls input
Found 2 items
-rw-r--r--  1 root supergroup 78031 2010-04-29 17:35 /user/root/input/memory-barriers.txt
-rw-r--r--  1 root supergroup 33567 2010-04-29 17:36 /user/root/input/rt-mutex-design.txt

Khi công việc của bạn đã chắc chắn ở trong HDFS, bạn có thể thực hiện hàm MapReduce. Hàm này này đòi hỏi một lệnh đơn nhưng yêu cầu trong một thời gian dài, như trong Liệt kê 6. Lệnh này yêu cầu thực hiện một tệp tư liệu JAR (Java Archive). Nó thực sự triển khai thực hiện một số khả năng, nhưng ví dụ này tập trung vào wordcount (đếm từ). Trình tiện ích của jobtracker yêu cầu nút dữ liệu thực hiện công việc MapReduce, tạo nên lượng kết quả đầu ra đáng kể (nhỏ hơn ở đây, vì bạn chỉ xử lý hai tệp). Nó cho thấy sự phát triển của các hàm map và reduce và sau đó cung cấp một số số liệu thống kê về vào/ra (I/O) cho cả hai hệ thống tệp và xử lý các bản ghi.

Liệt kê 6. Thực hiện một công việc MapReduce với tần suất từ (wordcount) 

# hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-0.20.2+228-examples.jar \ wordcount input output
10/04/29 17:36:49 INFO input.FileInputFormat: Total input paths to process : 2
10/04/29 17:36:49 INFO mapred.JobClient: Running job: job_201004291628_0009
10/04/29 17:36:50 INFO mapred.JobClient:  map 0% reduce 0%
10/04/29 17:37:00 INFO mapred.JobClient:  map 100% reduce 0%
10/04/29 17:37:06 INFO mapred.JobClient:  map 100% reduce 100%
10/04/29 17:37:08 INFO mapred.JobClient: Job complete: job_201004291628_0009
10/04/29 17:37:08 INFO mapred.JobClient: Counters: 17
10/04/29 17:37:08 INFO mapred.JobClient:   Job Counters 
10/04/29 17:37:08 INFO mapred.JobClient:     Launched reduce tasks=1
10/04/29 17:37:08 INFO mapred.JobClient:     Launched map tasks=2
10/04/29 17:37:08 INFO mapred.JobClient:     Data-local map tasks=2
10/04/29 17:37:08 INFO mapred.JobClient:   FileSystemCounters
10/04/29 17:37:08 INFO mapred.JobClient:     FILE_BYTES_READ=47556
10/04/29 17:37:08 INFO mapred.JobClient:     HDFS_BYTES_READ=111598
10/04/29 17:37:08 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=95182
10/04/29 17:37:08 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=30949
10/04/29 17:37:08 INFO mapred.JobClient:   Map-Reduce Framework
10/04/29 17:37:08 INFO mapred.JobClient:     Reduce input groups=2974
10/04/29 17:37:08 INFO mapred.JobClient:     Combine output records=3381
10/04/29 17:37:08 INFO mapred.JobClient:     Map input records=2937
10/04/29 17:37:08 INFO mapred.JobClient:     Reduce shuffle bytes=47562
10/04/29 17:37:08 INFO mapred.JobClient:     Reduce output records=2974
10/04/29 17:37:08 INFO mapred.JobClient:     Spilled Records=6762
10/04/29 17:37:08 INFO mapred.JobClient:     Map output bytes=168718
10/04/29 17:37:08 INFO mapred.JobClient:     Combine input records=17457
10/04/29 17:37:08 INFO mapred.JobClient:     Map output records=17457
10/04/29 17:37:08 INFO mapred.JobClient:     Reduce input records=3381

Với việc xử lý đã hoàn thành, hãy kiểm tra kết quả. Nhớ lại rằng xuất phát của công việc là tính toán số lần các từ xuất hiện trong các tệp đầu vào. Kết quả đầu ra này được phát ra như là một tệp của bộ dữ liệu, đại diện cho từ và số lần nó xuất hiện ở đầu vào. Bạn có thể sử dụng lệnh cat (sau khi tìm các tệp kết quả đầu ra cụ thể) thông qua tiện ích hadoop-0.20 để phát hành các dữ liệu này (xem Liệt kê 7).

Liệt kê 7. Xem lại kết quả đầu ra từ hoạt động đếm từ MapReduce 

# hadoop-0.20 fs -ls /user/root/output
Found 2 items
drwxr-xr-x   - root supergroup          0 2010-04-29 17:36 /user/root/output/_logs
-rw-r--r--   1 root supergroup      30949 2010-04-29 17:37 /user/root/output/part-r-00000
#  
# hadoop-0.20 fs -cat output/part-r-00000 | head -13
!= 1
"Atomic 2
"Cache 2
"Control 1
"Examples 1
"Has 7
"Inter-CPU 1
"LOAD 1
"LOCK" 1
"Locking 1
"Locks 1
"MMIO 1
"Pending 5

Bạn cũng có thể trích xuất các tệp từ HDFS khi sử dụng tiện ích hadoop-0.20 (xem Liệt kê 8). Bạn làm điều này dễ dàng với tiện ích get (tương tự như put đã thực hiện ở trên để viết các tệp vào HDFS). Với phép toán get, hãy xác định một tệp trong HDFS để trích ra (từ thư mục con kết quả đầu ra của bạn) và tên tệp để viết vào hệ thống tệp cục bộ (output.txt).

Liệt kê 8. Trích xuất kết quả đầu ra từ HDFS

# hadoop-0.20 fs -get output/part-r-00000 output.txt
# cat output.txt | head -5
!= 1
"Atomic 2
"Cache 2
"Control 1
"Examples 1

Hãy xem một ví dụ khác khi dùng cùng một tệp JAR nhưng có cách sử dụng khác (ở đây, bạn sẽ tìm hiểu một grep song song). Đối với việc thử nghiệm này, hãy sử dụng các tệp đầu vào hiện có của bạn nhưng loại bỏ các thư mục con kết quả đầu ra để tạo lại nó cho thử nghiệm này:

# hadoop-0.20 fs -rmr output
Deleted hdfs://localhost/user/root/output

Tiếp theo, yêu cầu công việc MapReduce cho grep. Trong trường hợp này, grep được thực hiện song song (ánh xạ) và sau đó các kết quả grep được kết hợp lại (rút gọn). Liệt kê 9 cung cấp kết quả đầu ra cho mô hình sử dụng này (nhưng trong trường hợp này, một số kết quả đầu ra đã được lược bớt cho ngắn gọn). Lưu ý rằng yêu cầu lệnh ở đây, nơi mà yêu cầu của bạn là mộtgrep lấy đầu vào từ thư mục con có tên là input (đầu vào) và đặt kết quả trong thư mục con có tên là output (đầu ra). Tham số cuối cùng là chuỗi mà bạn tìm kiếm (trong trường hợp này là 'kernel').

Liệt kê 9. Thực hiện một công việc MapReduce cho việc tìm kiếm từ (grep) 

# hadoop-0.20 jar /usr/lib/hadoop/hadoop-0.20.2+228-examples.jar \ grep input output 'kernel'
10/04/30 09:22:29 INFO mapred.FileInputFormat: Total input paths to process : 2
10/04/30 09:22:30 INFO mapred.JobClient: Running job: job_201004291628_0010
10/04/30 09:22:31 INFO mapred.JobClient:  map 0% reduce 0%
10/04/30 09:22:42 INFO mapred.JobClient:  map 66% reduce 0%
10/04/30 09:22:45 INFO mapred.JobClient:  map 100% reduce 0%
10/04/30 09:22:54 INFO mapred.JobClient:  map 100% reduce 100%
10/04/30 09:22:56 INFO mapred.JobClient: Job complete: job_201004291628_0010
10/04/30 09:22:56 INFO mapred.JobClient: Counters: 18
10/04/30 09:22:56 INFO mapred.JobClient:   Job Counters 
10/04/30 09:22:56 INFO mapred.JobClient:     Launched reduce tasks=1
10/04/30 09:22:56 INFO mapred.JobClient:     Launched map tasks=3
10/04/30 09:22:56 INFO mapred.JobClient:     Data-local map tasks=3
10/04/30 09:22:56 INFO mapred.JobClient:   FileSystemCounters
10/04/30 09:22:56 INFO mapred.JobClient:     FILE_BYTES_READ=57
10/04/30 09:22:56 INFO mapred.JobClient:     HDFS_BYTES_READ=113144
10/04/30 09:22:56 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=222
10/04/30 09:22:56 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=109
...
10/04/30 09:23:14 INFO mapred.JobClient:     Map output bytes=15
10/04/30 09:23:14 INFO mapred.JobClient:     Map input bytes=23
10/04/30 09:23:14 INFO mapred.JobClient:     Combine input records=0
10/04/30 09:23:14 INFO mapred.JobClient:     Map output records=1
10/04/30 09:23:14 INFO mapred.JobClient:     Reduce input records=1

Khi công việc hoàn thành, hãy kiểm tra thư mục đầu ra (để xác định tệp kết quả) và sau đó thực hiện một phép toán cat của hệ thống tệp để xem nội dung của nó (xem Liệt kê 10).

Liệt kê 10. Kiểm tra đầu ra của công việc MapReduce

# hadoop-0.20 fs -ls output
Found 2 items
drwxr-xr-x  - root supergroup    0 2010-04-30 09:22 /user/root/output/_logs
-rw-r--r--  1 root supergroup   10 2010-04-30 09:23 /user/root/output/part-00000
# hadoop-0.20 fs -cat output/part-00000
17 kernel
 Các giao diện dựa trên Web

Bạn đã thấy cách kiểm tra việc HDFS, nhưng nếu bạn đang tìm kiếm thông tin về hoạt động của Hadoop, bạn sẽ tìm thấy các giao diện Web có ích. Hãy nhớ rằng ở trên cụm Hadoop là nút tên, trong đó quản lý HDFS. Bạn có thể tìm hiểu các chi tiết mức cao của hệ thống tệp này (như vùng không gian có sẵn và được sử dụng và các nút dữ liệu có sẵn) cũng như các công việc đang chạy qua http://localhost:50070. Bạn có thể nghiên cứu sâu hơn về trình theo dõi công việc (trạng thái công việc) thông qua http://localhost:50030. Lưu ý rằng trong cả hai trường hợp này, bạn tham chiếu localhost, vì tất cả trình tiện ích đang chạy trên cùng một máy chủ.

 Đi xa hơn nữa

Bài viết này đã tìm hiểu việc cài đặt và cấu hình ban đầu của một cụm Hadoop (giả-phân tán) đơn giản (trong trường hợp này, khi sử dụng bản phân phối của Cloudera cho Hadoop). Tôi chọn bản phân phối cụ thể này vì nó đã đơn giản hóa việc cài đặt và cấu hình ban đầu của Hadoop. Bạn có thể tìm thấy một số bản phân phối khác cho Hadoop (bao gồm cả mã nguồn) tại apache.org. Xem phần Tài nguyên để biết thêm thông tin.

Nhưng điều gì sẽ xảy ra nếu bạn thiếu tài nguyên phần cứng để mở rộng cụm Hadoop của mình cho các nhu cầu cụ thể của bạn? Hóa ra Hadoop rất phổ biến, bạn có thể dễ dàng chạy nó trong các cơ sở hạ tầng điện toán đám mây khi sử dụng các máy ảo của Hadoop được dựng sẵn và các máy chủ cho thuê. cung cấp các AMI ( Machine Images – Các hình ảnh của máy của ) cũng như tính toán tài nguyên trong Elastic Compute Cloud (EC2 – Đám mây điện toán linh hoạt của ). Ngoài ra, gần đây Microsoft đã công bố sự hỗ trợ sắp tới cho Hadoop trong nền tảng các dịch vụ Azure của (® Azure Services Platform).

Từ bài viết này, thật dễ dàng để xem cách Hadoop tiến hành tính toán phân tán đơn giản để xử lý các bộ dữ liệu lớn. Bài viết tiếp theo trong loạt bài này sẽ tìm hiểu cách cấu hình Hadoop trong một cụm có nhiều nút với các ví dụ bổ sung. Hẹn gặp lại bạn lần sau!

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Phần 2: Đi xa hơn nữa

Sức mạnh thực sự của kiến trúc điện toán phân tán Hadoop nằm ở sự phân tán của nó. Nói cách khác, khả năng phân tán công việc tới nhiều nút song song cho phép Hadoop mở rộng đến cơ sở hạ tầng lớn và, tương tự như vậy, xử lý một lượng dữ liệu lớn. Bài viết này bắt đầu bằng việc phân chia của một kiến trúc Hadoop phân tán và sau đó tìm hiểu cấu hình phân tán và cách sử dụng.

Kiến trúc Hadoop phân tán

Nhớ lại từ Phần 1 của loạt bài này là tất cả các trình tiện ích (daemon) Hadoop đã chạy trên cùng một máy chủ. Mặc dù không sử dụng tính chất song song của Hadoop, cấu hình giả phân tán này cho phép dễ dàng thử nghiệm các tính năng của Hadoop với thiết lập tối thiểu. Bây giờ, hãy tìm hiểu tính chất song song của Hadoop khi sử dụng một cụm các máy.

Từ Phần 1, cấu hình Hadoop quy định rằng tất cả các trình tiện ích Hadoop chạy trên một nút duy nhất. Vì vậy, trước tiên chúng ta hãy xem xét Hadoop được phân phối tự nhiên cho hoạt động song song như thế nào. Trong một thiết lập Hadoop phân tán, bạn sẽ có một nút chủ và một số các nút tớ (xem Hình 1).

Hình 1. Phân chia nút chủ và nút tớ của Hadoop 
Phân chia nút chủ và nút tớ của Hadoop

Như trong Hình 1, nút chủ bao gồm các nút tên (namenode), nút tên thứ cấp và các trình tiện ích của trình theo dõi công việc (jobtracker) (được gọi là các trình tiện ích chủ). Ngoài ra, đây là nút để từ đó bạn quản lý cụm cho các mục đích của cuộc trình diễn này (bằng cách sử dụng tiện ích và trình duyệt Hadoop). Các nút tớ bao gồm trình theo dõi tác vụ (tasktracker) và nút dữ liệu (datanode) (được gọi là các trình tiện ích tớ). Sự khác biệt của việc thiết lập này là nút chủ chứa các trình tiện ích cung cấp việc quản lý và kết hợp cụm Hadoop, ở đó nút tớ chứa các trình tiện ích triển khai thực hiện các hàm lưu trữ cho hệ thống tệp Hadoop (HDFS) và chức năng MapReduce (chức năng xử lý dữ liệu).

Với cuộc trình diễn này, bạn tạo một nút chủ và hai nút tớ đặt trên một mạng LAN. Thiết lập này được thể hiện trong Hình 2. Bây giờ, chúng ta hãy tìm hiểu việc cài đặt Hadoop để phân phối cho nhiều nút và cấu hình của nó.

Hình 2. Cấu hình cụm Hadoop
Cấu hình cụm Hadoop

Để đơn giản hóa việc triển khai, bạn sử dụng công nghệ ảo hóa, cung cấp một số lợi thế. Mặc dù có thể không có lợi về hiệu năng trong việc thiết lập này, nhưng nhờ sử dụng ảo hóa, có thể tạo ra một cài đặt Hadoop và sau đó nhân bản nó cho các nút khác. Vì lý do này, cụm Hadoop của bạn nên xuất hiện như sau đây, khi chạy các nút chủ và tớ như các máy ảo (VM) trong bối cảnh của một lớp ảo hóa (hypervisor) trên một máy chủ duy nhất (xem Hình 3).

Hình 3. Cấu hình cụm Hadoop trong một môi trường ảo 
Cấu hình cụm Hadoop trong một môi trường ảo

 Nâng cấp Hadoop

Trong phần 1, bạn đã cài đặt một bản phân phối riêng cho Hadoop, chạy trên một nút đơn (cấu hình-giả). Trong bài này, bạn cập nhật cho một cấu hình phân tán. Nếu bạn mới bắt đầu loạt bài này ở đây, hãy đọc qua Phần 1 để cài đặt cấu hình-giả Hadoop trước tiên.

Trong cấu hình-giả này, bạn đã không đặt cấu hình, do tất cả mọi thứ đã được cấu hình sẵn cho một nút đơn. Bây giờ, bạn cần cập nhật cho cấu hình này. Đầu tiên, hãy kiểm tra cấu hình hiện tại bằng cách sử dụng lệnh update-alternatives như trong Liệt kê 1. Lệnh này cho bạn biết cấu hình này là gì khi sử dụng conf.pseudo (ưu tiên cao nhất).

Liệt kê 1. Kiểm tra cấu hình Hadoop hiện tại

$ update-alternatives --display hadoop-0.20-conf
hadoop-0.20-conf - status is auto.
 link currently points to /etc/hadoop-0.20/conf.pseudo
/etc/hadoop-0.20/conf.empty - priority 10
/etc/hadoop-0.20/conf.pseudo - priority 30
Current `best' version is /etc/hadoop-0.20/conf.pseudo.

Tiếp theo, tạo một cấu hình mới bằng cách sao chép một một cấu hình đang tồn tại (trong trường hợp này là conf.empty, như trong Liệt kê 1):

$ sudo cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.dist

Cuối cùng, kích hoạt và kiểm tra cấu hình mới:

Liệt kê 2. Kích hoạt và kiểm tra cấu hình Hadoop

$ sudo update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf \ /etc/hadoop-0.20/conf.dist 40
$ update-alternatives --display hadoop-0.20-conf
hadoop-0.20-conf - status is auto.
 link currently points to /etc/hadoop-0.20/conf.dist
/etc/hadoop-0.20/conf.empty - priority 10
/etc/hadoop-0.20/conf.pseudo - priority 30
/etc/hadoop-0.20/conf.dist - priority 40
Current `best' version is /etc/hadoop-0.20/conf.dist.

Bây giờ, bạn có một cấu hình mới gọi là conf.dist để bạn sử dụng cho cấu hình phân tán mới. Trong giai đoạn này, khi chạy trong một môi trường ảo hóa, bạn sao chép nút này thành hai nút bổ sung để dùng như là các nút dữ liệu.

 Cấu hình Hadoop cho hoạt động phân tán

Bước tiếp theo là tạo ra tất cả các nút giống nhau. Bạn làm việc này trong các tệp /etc/hadoop-0.20/conf.dist có tên là masters vàslaves. Ba nút trong ví dụ này được gán cho các địa chỉ IP tĩnh, như được hiển thị ở đây (từ /etc/hosts):Liệt kê 3. Các nút Hadoop cho thiết lập này (/etc/hosts)

master 192.168.108.133
slave1 192.168.108.134
slave2 192.168.108.135

Vì vậy, trên nút chủ, bạn cập nhật /etc/hadoop-0.20/conf.dist/masters để xác định nút chủ, nó xuất hiện như sau:

master

và sau đó xác định các nút tớ trong /etc/hadoop-0.20/conf.dist/slaves, trong đó có hai dòng như sau:

slave1
slave2

Tiếp theo, từ mỗi nút, kết nối qua Secure Shell (ssh) đến mỗi nút trong số các nút khác để bảo đảm rằng ssh không cần mật khẩu đang hoạt động. Mỗi một trong các tệp (masters, slaves) được Hadoop sử dụng để bắt đầu và dừng các tiện ích mà bạn đã sử dụng trong Phần 1 của loạt bài này.

Tiếp theo, tiếp tục với cấu hình Hadoop-cụ thể trong thư mục con /etc/hadoop-0.20/conf.dist. Những thay đổi sau đây là cần thiết trên tất cả các nút (một nút chủ và hai nút tớ), theo như tài liệu Hadoop định nghĩa. Đầu tiên, xác định nút chủ HDFS trong tệp core-site.xml (Liệt kê 4), trong đó định nghĩa máy chủ và cổng của nút tên (lưu ý việc sử dụng địa chỉ IP của nút chủ). Tệp core-site.xml định nghĩa các đặc tính lõi của Hadoop.

Liệt kê 4. Định nghĩa nút chủ HDFS trong tệp core-site.xml 

<configuration>
  <property>
    <name>fs.default.name<name>
    <value>hdfs://master:54310<value>
    <description>The name and URI of the default FS.</description>
  <property>
<configuration>

Tiếp theo, xác định trình theo dõi công việc của MapReduce. Trình theo dõi công việc này có thể tồn tại trên nút riêng của nó, nhưng với cấu hình này, hãy đặt nó trên nút chủ như trong Liệt kê 5. Các tệp mapred-site.xml chứa các đặc tính MapReduce.

Liệt kê 5. Định nghĩa trình theo dõi công việc của MapReduce trong tệp mapred-site.xml 

<configuration>
  <property>
    <name>mapred.job.tracker<name>
    <value>master:54311<value>
    <description>Map Reduce jobtracker<description>
  <property>
<configuration>

Cuối cùng, xác định các yếu tố bản sao mặc định (Liệt kê 6). Giá trị này xác định số lượng các bản sao sẽ được tạo và thường không lớn hơn ba. Trong trường hợp này, bạn xác định nó là 2 (số các nút dữ liệu của bạn). Giá trị này được định nghĩa trong tệp hdfs-site.xml, trong tệp đó có chứa các đặc tính HDFS.

Liệt kê 6. Định nghĩa bản sao mặc định cho dữ liệu trong tệp hdfs-site.xml 

<configuration>
  <property>
    <name>dfs.replication<name>
    <value>2<value>
    <description>Default block replication<description>
  <property>
<configuration>

Các mục cấu hình được hiển thị trong Liệt kê 4, Liệt kê 5, và Liệt kê 6) là các phần tử cần thiết để thiết lập phân tán của bạn. Hadoop cung cấp một số lượng lớn các tùy chọn cấu hình ở đây, chúng cho phép bạn điều chỉnh toàn bộ môi trường. Phần Tài nguyên cung cấp thêm nhiều thông tin về những thứ sẵn có.

Với cấu hình của bạn đã hoàn thành, bước tiếp theo là định dạng nút tên của bạn (nút chủ HDFS). Với hoạt động này, hãy sử dụng tiện ích hadoop-0.20, xác định nút tên và hoạt động (-format):

Liệt kê 7. Định dạng nút tên

[email protected]:~# sudo su -
[email protected]:~# hadoop-0.20 namenode -format
10/05/11 18:39:58 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.2+228
STARTUP_MSG:   build =  -r cfc3233ece0769b11af9add328261295aaf4d1ad; 
************************************************************/
10/05/11 18:39:59 INFO namenode.FSNamesystem: fsOwner=root,root
10/05/11 18:39:59 INFO namenode.FSNamesystem: supergroup=supergroup
10/05/11 18:39:59 INFO namenode.FSNamesystem: isPermissionEnabled=true
10/05/11 18:39:59 INFO common.Storage: Image file of size 94 saved in 0 seconds.
10/05/11 18:39:59 INFO common.Storage: 
  Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted.
10/05/11 18:39:59 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/127.0.1.1
************************************************************/
[email protected]:~#

Với nút tên của bạn được định dạng, đây là lúc khởi động trình tiện ích của Hadoop. Bạn làm việc này giống như với cấu hình giả-phân tán của bạn trước đây trong Phần 1, trừ quá trình này thực hiện cùng công việc cho một cấu hình phân tán. Lưu ý ở đây là mã này khởi động nút tên và nút tên thứ cấp (như được biểu thị bằng lệnh jps):

Liệt kê 8. Khởi động nút tên

[email protected]:~# /usr/lib/hadoop-0.20/bin/start-dfs.sh
starting namenode, logging to 
  /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-namenode-mtj-desktop.out
192.168.108.135: starting datanode, logging to 
  /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-datanode-mtj-desktop.out
192.168.108.134: starting datanode, logging to 
  /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-datanode-mtj-desktop.out
192.168.108.133: starting secondarynamenode, 
  logging to /usr/lib/hadoop-0.20/logs/hadoop-root-secondarynamenode-mtj-desktop.out
[email protected]:~# jps
7367 NameNode
7618 Jps
7522 SecondaryNameNode
[email protected]:~#

Nếu bây giờ bạn kiểm tra một trong các nút tớ (các nút dữ liệu) bằng cách sử dụng lệnh jps, bạn sẽ thấy rằng có một trình tiện ích của nút dữ liệu hiện đang tồn tại trên mỗi nút:

Liệt kê 9. Kiểm tra nút dữ liệu trên một trong các nút tớ

[email protected]:~# jps
10562 Jps
10451 DataNode
[email protected]:~#

Bước tiếp theo là khởi động các trình tiện ích MapReduce (trình theo dõi công việc và trình theo dõi tác vụ). Bạn thực hiện việc này như trong Liệt kê 10. Lưu ý rằng kịch bản khởi động trình theo dõi công việc trên nút chủ (theo như cấu hình của bạn định nghĩa, xem Liệt kê 5) và các trình theo dõi tác vụ trên mỗi nút tớ. Một lệnh jps trên nút chủ cho thấy trình theo dõi công việc hiện đang chạy.

Liệt kê 10. Khởi động các trình tiện ích của MapReduce

[email protected]:~# /usr/lib/hadoop-0.20/bin/start-mapred.sh
starting jobtracker, logging to 
  /usr/lib/hadoop-0.20/logs/hadoop-root-jobtracker-mtj-desktop.out
192.168.108.134: starting tasktracker, logging to 
  /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-tasktracker-mtj-desktop.out
192.168.108.135: starting tasktracker, logging to 
  /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-tasktracker-mtj-desktop.out
[email protected]:~# jps
7367 NameNode
7842 JobTracker
7938 Jps
7522 SecondaryNameNode
[email protected]:~#

Cuối cùng, hãy kiểm tra một nút tớ bằng lệnh jps. Ở đây, bạn thấy rằng một trình tiện ích của trình theo dõi tác vụ đã nối trình tiện ích của nút dữ liệu tới mỗi nút dữ liệu tớ:

Liệt kê 11. Kiểm tra nút dữ liệu trên một trong các nút tớ 

[email protected]:~# jps
7785 DataNode
8114 Jps
7991 TaskTracker
[email protected]:~#

Các mối quan hệ giữa các kịch bản khởi động, các nút và các trình tiện ích đã khởi động được thể hiện trong Hình 4. Như bạn thấy, kịch bản lệnh start-dfs khởi động các nút tên và các nút dữ liệu, ở đó kịch bản lệnh start-mapred khởi động một trình theo dõi công việc và các trình theo dõi tác vụ.

Hình 4. Mối quan hệ của các kịch bản lệnh khởi động và các trình tiện ích cho mỗi nút 
Mối quan hệ của các kịch bản lệnh khởi động và các trình tiện ích cho mỗi nút

 Thử nghiệm HDFS

Bây giờ Hadoop đã khởi động và đang chạy trên cụm của bạn, bạn có thể chạy một vài thử nghiệm để đảm bảo rằng nó hoạt động (xem Liệt kê 12). Đầu tiên, hãy đưa ra lệnh (fs) của hệ thống tệp qua tiện ích hadoop-0.20 và yêu cầu hoạt động df (đĩa trống). Như với Linux®, lệnh này chỉ đơn giản xác định khoảng không gian đã dùng hết và có sẵn cho thiết bị cụ thể. Vì vậy, với hệ thống tệp vừa được định dạng, bạn vẫn chưa sử dụng khoảng không gian nào. Tiếp theo, hãy thực hiện một hoạt động ls trên thư mục gốc của HDFS, tạo một thư mục con, danh sách nội dung của nó và gỡ bỏ nó. Cuối cùng, bạn có thể thực hiện lệnhfsck (kiểm tra tệp hệ thống) trên HDFS bằng cách sử dụng lệnh fsck trong tiện ích hadoop-0.20. Tất cả điều này cho bạn biết —cùng với nhiều thông tin khác (chẳng hạn như đã phát hiện có 2 nút dữ liệu)—rằng hệ thống tệp vẫn chạy tốt.

Liệt kê 12. Kiểm tra HDFS

[email protected]:~# hadoop-0.20 fs -df
File system		Size	Used	Avail		Use%
/		16078839808	73728	3490967552	0%
[email protected]:~# hadoop-0.20 fs -ls /
Found 1 items
drwxr-xr-x   - root supergroup          0 2010-05-12 12:16 /tmp
[email protected]:~# hadoop-0.20 fs -mkdir test
[email protected]:~# hadoop-0.20 fs -ls test
[email protected]:~# hadoop-0.20 fs -rmr test
Deleted hdfs://192.168.108.133:54310/user/root/test
[email protected]:~# hadoop-0.20 fsck /
.Status: HEALTHY
 Total size:	4 B
 Total dirs:	6
 Total files:	1
 Total blocks (validated):	1 (avg. block size 4 B)
 Minimally replicated blocks:	1 (100.0 %)
 Over-replicated blocks:	0 (0.0 %)
 Under-replicated blocks:	0 (0.0 %)
 Mis-replicated blocks:		0 (0.0 %)
 Default replication factor:	2
 Average block replication:	2.0
 Corrupt blocks:		0
 Missing replicas:		0 (0.0 %)
 Number of data-nodes:		2
 Number of racks:		1

The filesystem under path '/' is HEALTHY
[email protected]:~#

 Thực hiện một công việc MapReduce

Bước tiếp theo là thực hiện một công việc MapReduce (Ánh xạ Rút gọn) để xác nhận rằng toàn bộ thiết lập của bạn đang hoạt động đúng (xem Liệt kê 13). Bước đầu tiên của quá trình này là đưa ra một số dữ liệu. Vì vậy, hãy bắt đầu bằng cách tạo một thư mục để chứa dữ liệu đầu vào của bạn (gọi là input), bạn làm việc này bằng cách sử dụng tiện ích hadoop-0.20 bằng lệnh tạo thư mục mkdir. Rồi, sử dụng lệnh put của tiện ích hadoop-0.20 để đặt hai tệp vào HDFS. Bạn có thể kiểm tra các nội dung của thư mục đầu vào bằng cách sử dụng lệnh ls của tiện ích Hadoop.

Liệt kê 13. Tạo dữ liệu đầu vào

[email protected]:~# hadoop-0.20 fs -mkdir input
root[email protected]:~# hadoop-0.20 fs -put \ /usr/src/linux-source-2.6.27/Doc*/memory-barriers.txt input
[email protected]:~# hadoop-0.20 fs -put \ /usr/src/linux-source-2.6.27/Doc*/rt-mutex-design.txt input
[email protected]:~# hadoop-0.20 fs -ls input
Found 2 items
-rw-r--r--  2 root supergroup  78031 2010-05-12 14:16 /user/root/input/memory-barriers.txt
-rw-r--r--  2 root supergroup  33567 2010-05-12 14:16 /user/root/input/rt-mutex-design.txt
[email protected]:~#

Tiếp theo, bắt đầu công việc MapReduce đếm từ (wordcount). Như trong mô hình giả-phân tán, bạn chỉ định thư mục con đầu vào của bạn (trong đó có chứa các tệp đầu vào) và thư mục kết quả đầu ra (vẫn chưa có nhưng sẽ được nút tên tạo ra và nằm cùng với dữ liệu kết quả):

Liệt kê 14. Chạy công việc đếm từ MapReduce trên cụm

[email protected]:~# hadoop-0.20 jar \ /usr/lib/hadoop-0.20/hadoop-0.20.2+228-examples.jar wordcount input output
10/05/12 19:04:37 INFO input.FileInputFormat: Total input paths to process : 2
10/05/12 19:04:38 INFO mapred.JobClient: Running job: job_201005121900_0001
10/05/12 19:04:39 INFO mapred.JobClient:  map 0% reduce 0%
10/05/12 19:04:59 INFO mapred.JobClient:  map 50% reduce 0%
10/05/12 19:05:08 INFO mapred.JobClient:  map 100% reduce 16%
10/05/12 19:05:17 INFO mapred.JobClient:  map 100% reduce 100%
10/05/12 19:05:19 INFO mapred.JobClient: Job complete: job_201005121900_0001
10/05/12 19:05:19 INFO mapred.JobClient: Counters: 17
10/05/12 19:05:19 INFO mapred.JobClient:   Job Counters 
10/05/12 19:05:19 INFO mapred.JobClient:     Launched reduce tasks=1
10/05/12 19:05:19 INFO mapred.JobClient:     Launched map tasks=2
10/05/12 19:05:19 INFO mapred.JobClient:     Data-local map tasks=2
10/05/12 19:05:19 INFO mapred.JobClient:   FileSystemCounters
10/05/12 19:05:19 INFO mapred.JobClient:     FILE_BYTES_READ=47556
10/05/12 19:05:19 INFO mapred.JobClient:     HDFS_BYTES_READ=111598
10/05/12 19:05:19 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=95182
10/05/12 19:05:19 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=30949
10/05/12 19:05:19 INFO mapred.JobClient:   Map-Reduce Framework
10/05/12 19:05:19 INFO mapred.JobClient:     Reduce input groups=2974
10/05/12 19:05:19 INFO mapred.JobClient:     Combine output records=3381
10/05/12 19:05:19 INFO mapred.JobClient:     Map input records=2937
10/05/12 19:05:19 INFO mapred.JobClient:     Reduce shuffle bytes=47562
10/05/12 19:05:19 INFO mapred.JobClient:     Reduce output records=2974
10/05/12 19:05:19 INFO mapred.JobClient:     Spilled Records=6762
10/05/12 19:05:19 INFO mapred.JobClient:     Map output bytes=168718
10/05/12 19:05:19 INFO mapred.JobClient:     Combine input records=17457
10/05/12 19:05:19 INFO mapred.JobClient:     Map output records=17457
10/05/12 19:05:19 INFO mapred.JobClient:     Reduce input records=3381
[email protected]:~#

Bước cuối cùng là tìm hiểu dữ liệu đầu ra. Vì bạn đã chạy công việc đếm từ MapReduce rồi, nên kết quả chỉ có một tệp (được rút gọn từ các tệp ánh xạ đã xử lý). Tệp này chứa một danh sách các bộ dữ liệu đại diện cho các từ được tìm thấy trong các tệp đầu vào và số lần chúng xuất hiện trong tất cả các tệp đầu vào:

Liệt kê 15. Kiểm tra kết quả đầu ra của công việc MapReduce

[email protected]:~# hadoop-0.20 fs -ls output
Found 2 items
drwxr-xr-x   - root supergroup          0 2010-05-12 19:04 /user/root/output/_logs
-rw-r--r--   2 root supergroup      30949 2010-05-12 19:05 /user/root/output/part-r-00000
[email protected]:~# hadoop-0.20 fs -cat output/part-r-00000 | head -13
!=	1
"Atomic	2
"Cache	2
"Control	1
"Examples	1
"Has	7
"Inter-CPU	1
"LOAD	1
"LOCK"	1
"Locking	1
"Locks	1
"MMIO	1
"Pending	5
[email protected]:~#

 Các giao diện quản lý Web

Mặc dù tiện ích hadoop-0.20 rất linh hoạt và phong phú, những đôi khi sử dụng Giao diện người dùng đồ họa (GUI) để thay thế lại thuận tiện hơn. Bạn có thể đính kèm nút tên cho việc kiểm tra hệ thống tệp thông qua http://master:50070 và tới trình theo dõi công việc qua GUI. Thông qua nút tên, bạn có thể kiểm tra HDFS, như trong Hình 5, ở đây bạn kiểm tra thư mục đầu vào (trong đó chứa dữ liệu đầu vào của bạn—xem lại từ Liệt kê 13).

Hình 5. Kiểm tra HDFS qua nút tên 
Kiểm tra HDFS qua nút tên

Thông qua trình theo dõi công việc, bạn có thể kiểm tra các công việc đang chạy hay đã hoàn thành rồi. Trong Hình 6, bạn có thể thấy việc kiểm tra của công việc cuối cùng của bạn (từ Liệt kê 14). Hình này cho thấy các dữ liệu khác nhau được phát ra như kết quả đầu ra cho yêu cầu tư liệu Java (JAR) ngoài trạng thái và số lượng các nhiệm vụ. Lưu ý ở đây là hai nhiệm vụ ánh xạ được thực hiện (một cho mỗi tệp đầu vào) và một nhiệm vụ rút gọn (để rút gọn hai đầu vào ánh xạ).

Hình 6. Kiểm tra trạng thái của một công việc đã hoàn thành
Kiểm tra trạng thái của một công việc đã hoàn thành

Cuối cùng, bạn có thể kiểm tra trạng thái của các nút dữ liệu của bạn thông qua nút tên. Trang chủ của nút tên xác định số nút đang hoạt động (live) và nút không còn hoạt động nữa (như là các liên kết) và cho phép bạn kiểm tra chúng thêm nữa. Trang được hiển thị trong Hình 7 cho thấy các nút dữ liệu đang hoạt động của bạn ngoài các số liệu thống kê cho mỗi nút dữ liệu.

Hình 7. Kiểm tra trạng thái của các nút dữ liệu đang hoạt động 
Kiểm tra trạng thái của các nút dữ liệu đang hoạt động

Có thể có nhiều khung nhìn khác nhau thông qua các giao diện Web của nút tên và trình theo dõi công việc, nhưng để cho ngắn gọn, bộ mẫu này được hiển thị. Trong các trang Web của nút tên và trình theo dõi công việc, bạn sẽ tìm thấy một số các liên kết sẽ dẫn bạn tới các thông tin bổ sung về cấu hình và hoạt động của Hadoop (bao gồm cả các bản ghi nhật ký thời gian chạy).

Đi xa hơn nữa

Trong bài này, bạn đã thấy một cấu hình phân tán-giả từ Cloudera có thể được chuyển đổi thành một cấu hình phân tán hoàn toàn như thế nào. Lạ thật, chỉ cần một vài bước cùng với một giao diện giống nhau cho các ứng dụng MapReduce đã làm cho Hadoop trở thành một công cụ có ích duy nhất để xử lý phân tán. Ngoài ra thật thú vị để tìm hiểu khả năng mở rộng của Hadoop. Bằng cách thêm vào các nút dữ liệu mới (cùng với việc cập nhật các tệp XML và các tệp tớ của chúng trong nút chủ), bạn có thể dễ dàng mở rộng Hadoop ngay cả trong các mức xử lý song song cao hơn. Phần 3, bài đăng cuối cùng trong loạt bài về Hadoop, sẽ tìm hiểu cách phát triển một ứng dụng MapReduce cho Hadoop.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Hadoop  được phát triển thông qua Quỹ phần mềm Apache .
  • Đánh giá các sản phẩm IBM theo cách phù hợp nhất cho với bạn: hãy tải về một bản dùng thử sản phẩm, hãy thử một sản phẩm trực tuyến, sử dụng một sản phẩm trong một môi trường đám mây hoặc dành một vài giờ trong SOA Sandboxđể tìm hiểu cách triển khai thực hiện có hiệu quả kiến trúc hướng dịch vụ (SOA-Service Oriented Architecture).

Phần 3: Phát triển ứng dụng

Hai bài viết đầu tiên của loạt bài này tập trung vào việc cài đặt và cấu hình của Hadoop cho các cụm đơn nút và đa nút. Bài viết cuối cùng này tìm hiểu cách lập trình trong Hadoop—nói cụ thể là sự phát triển của ứng dụng ánh xạ và rút gọn trong ngôn ngữ Ruby. Tôi chọn Ruby, vì thứ nhất, nó là một ngôn ngữ tạo kịch bản lệnh hướng đối tượng tuyệt vời mà bạn nên biết và thứ hai bạn sẽ tìm thấy nhiều tài liệu tham khảo trong phần Tài nguyên với các hướng dẫn tập trung vào cả ngôn ngữ Java™ lẫn ngôn ngữ Python. Qua việc tìm hiểu này về lập trình MapReduce, tôi cũng giới thiệu cho bạn về API theo luồng. API này cung cấp phương tiện để phát triển các ứng dụng trên các ngôn ngữ khác với ngôn ngữ Java.

Hãy bắt đầu bằng một giới thiệu ngắn về ánh xạ và rút gọn (theo quan điểm chức năng) và sau đó đi sâu vào mô hình lập trình Hadoop và kiến trúc của nó và các yếu tố dùng để chia cắt, phân phối và quản lý công việc.

Nguồn gốc ánh xạ và rút gọn

Vì vậy, cái gì là các yếu tố chức năng đã thôi thúc mô hình lập trình MapReduce? Vào năm 1958, John McCarthy đã phát minh ra một ngôn ngữ gọi là Lisp, cho phép triển khai thực hiện cả tính toán số lẫn tính toán ký hiệu nhưng dưới dạng đệ quy xa lạ với hầu hết các ngôn ngữ đang sử dụng hiện nay. (Thực sự có một lịch sử hấp dẫn về Lisp trên Wikipedia bao gồm một hướng dẫn thực tế — đáng bỏ thời gian để đọc). Lisp lần đầu tiên được thực hiện trên máy IBM® 704, máy tính được sản xuất hàng loạt đầu tiên cũng hỗ trợ cho ngôn ngữ đã quen thuộc từ trước được yêu thích là: FORTRAN.

Hàm map (ánh xạ) có nguồn gốc trong các ngôn ngữ chức năng như Lisp nhưng bây giờ đã phổ biến trong nhiều ngôn ngữ khác, là một ứng dụng hàm số trên một danh sách các phần tử. Điều này có nghĩa gì? Liệt kê 1 cung cấp một phiên giao dịch với Scheme Shell (SCSH), đó là dẫn xuất của Lisp. Dòng đầu tiên xác định một hàm được gọi là square (bình phương) nhận một đối số và trả về căn bậc hai của nó. Dòng tiếp theo minh họa việc sử dụng hàm map. Như đã thấy, với hàm map, bạn cung cấp hàm của mình và danh sách các phần tử mà hàm này được áp dụng. Kết quả là một danh sách mới có chứa các phần tử bình phương.

Liệt kê 1. Biểu diễn hàm map trong SCSH

> (define square (lambda (x) (* x x)))
> (map square '(1 3 5 7))
'(1 9 25 49)
>

Việc rút gọn cũng được áp dụng trên một danh sách nhưng thường rút gọn danh sách theo một giá trị vô hướng . Ví dụ có trong Liệt kê 2 minh họa một hàm SCSH khác để thu nhỏ một danh sách theo một dạng vô hướng—trong trường hợp này, tổng hợp danh sách các giá trị theo dạng (1 + (2 + (3 + (4 + (5))))). Lưu ý rằng đây là cách lập trình chức năng cổ điển, dựa vào phép đệ quy qua phép lặp.

Liệt kê 2. Biểu diễn hàm rút gọn trong SCSH

> (define (list-sum lis) (if (null? lis) 0 (+ (car lis) (list-sum (cdr lis)))))
> (list-sum '(1 2 3 4 5))
15
>

Thật thú vị khi nhận thấy rằng phép đệ quy là phép lặp hiệu quả trong các ngôn ngữ mệnh lệnh vì phép đệ quy được dịch thành phép lặp trong các bao gói.

 Mô hình lập trình của Hadoop

Google đã giới thiệu ý tưởng về MapReduce như là một mô hình lập trình để xử lý hay tạo các tập dữ liệu lớn. Trong mô hình chính tắc, một hàm map xử lý các cặp giá trị-khóa, tạo ra một tập trung gian của các cặp giá trị-khóa. Sau đó hàm reduce xử lý các cặp giá trị-khóa trung gian đó, kết hợp các giá trị với các khóa có liên quan (xem Hình 1). Dữ liệu đầu vào được phân chia thành nhiều phần theo cách để cho nó có thể được phân phối trong một cụm các máy cho phép xử lý song song. Theo cách như vậy, dữ liệu trung gian đã tạo ra được xử lý song song, làm cho cách tiếp cận này là lý tưởng đối với việc xử lý số lượng dữ liệu rất lớn.

Hình 1. Hình ảnh đơn giản hóa của quá trình xử lý MapReduce
Hình ảnh đơn giản hóa của quá trình xử lý MapReduce
Với một trình làm mới nhanh chóng, hãy xem xét các kiến trúc từ Hình 1 theo quan điểm về ánh xạ và rút gọn cho việc đếm từ (vì bạn sẽ phát triển một ứng dụng ánh xạ và rút gọn trong bài viết này). Khi dữ liệu đầu vào được cung cấp (vào trong hệ thống tệp của Hadoop [HDFS]), đầu tiên nó được chia thành các phần và sau đó được phân phối tới các trình công việc (worker) ánh xạ (thông qua trình theo dõi công việc). Mặc dù ví dụ trong Hình 2 cho thấy một câu ngắn được chia nhỏ, thông thường số từ để chia nhỏ thành dải có kích thước khoảng 128MB vì lý do là: Cần rất ít thời gian để thiết lập công việc, vì có nhiều việc để làm nên cần giảm thiểu chi phí hoạt động này. Các trình công việc ánh xạ (trong ví dụ chính tắc) phân chia công việc thành các vectơ riêng có chứa các từ được đánh dấu và giá trị ban đầu (là 1, trong trường hợp này). Khi hoàn thành các nhiệm vụ ánh xạ (do trình theo dõi công việc – task tracker trong Hadoop quy định), công việc này được chuyển tới trình công việc rút gọn. Trình công việc rút gọn biến đổi các khóa thành một tập duy nhất, có giá trị biểu diễn số lượng các khóa đã tìm thấy.

Hình 2. Ví dụ MapReduce đơn giản
Ví dụ MapReduce đơn giản
Lưu ý rằng quá trình này có thể xảy ra trên cùng một máy hoặc các máy khác nhau hoặc được thực hiện tuần tự hoặc song song nhờ sử dụng cách phân vùng dữ liệu khác nhau và vẫn cho kết quả như nhau.

Mặc dù quan điểm chính tắc (cho việc tìm kiếm tạo chỉ mục bằng cách sử dụng đếm từ) là một cách để xem xét Hadoop, nó cho thấy rằng mô hình điện toán này có thể được áp dụng chung cho một số vấn đề tính toán, như bạn sẽ thấy.

 Tính linh hoạt của Hadoop

Từ ví dụ đơn giản chỉ ra trong Hình 2, lưu ý rằng hai phần tử chính là các quá trình map và reduce. Mặc dù có quan điểm truyền thống về cách hoạt động của quá trình này, nhưng đó không phải là một yêu cầu về kiến trúc cho các quá trình map và reduce để chạy theo cách này. Đây là sức mạnh thực sự của Hadoop — tính linh hoạt của nó để triển khai thực hiện các quá trình map vàreduce để vận hành theo cách giải quyết một ứng dụng cụ thể. Ví dụ đếm từ là có ích và có thể áp dụng cho một số lượng các vấn đề lớn, nhưng các mô hình khác vẫn còn thích hợp trong khung công tác chung này. Tất cả những thứ cần thiết là sự phát triển của ứng dụng map và reduce để tạo ra các quá trình hiển thị cho Hadoop.

Trong số các ứng dụng khác, Hadoop thậm chí đã được sử dụng cho các ứng dụng học máy với các thuật toán đa dạng như các mạng thần kinh, các máy vector tựa và phân cụm theo thuật toán k-means (xem phần Tài nguyên để biết thêm thông tin).

 Tạo luồng dữ liệu

Mặc dù Hadoop là một khung công tác dựa trên Java, nhưng lại có thể viết các ứng dụng map và reduce bằng các ngôn ngữ khác ngôn ngữ Java. Việc tạo luồng đáp ứng điều này. Tiện ích streaming (tạo luồng) trong Hadoop thực hiện một kiểu kết nối luồng dữ liệu. Với tiện ích streaming, bạn có thể xác định các khả năng thực thi ánh xạ và rút gọn riêng của bạn (với mỗi đầu vào lấy từ đầu vào tiêu chuẩn [stdin] và đưa ra kết quả qua đầu ra chuẩn [stdout]) và tiện ích streaming đọc và ghi dữ liệu một cách thích hợp, gọi ra các ứng dụng của bạn khi cần (xem Liệt kê 3).

Liệt kê 3. Sử dụng tiện ích streaming của Hadoop

hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
	-input inputData
	-output outputData
	-mapper map_exec
	-reducer reduce_exec

Liệt kê 3 minh họa cách sử dụng tiện ích streaming trong Hadoop, trong khi Hình 3 cho thấy bằng biểu đồ cách xác định luồng dữ liệu. Lưu ý rằng đây là một ví dụ đơn giản về sử dụng tạo luồng. Có sẵn nhiều tùy chọn để điều chỉnh cách phân tích cú pháp dữ liệu, để điều chỉnh cách lấy các hình ảnh, để xác định hình ảnh thay thế cho bộ phân vùng hoặc bộ kết hợp và chỉnh sửa cấu hình khác (xem phần Tài nguyên để biết thêm thông tin).

Hình 3. Ví dụ tạo luồng đồ họa
Ví dụ tạo luồng đồ họa

Ví dụ về Ruby

Với hiểu biết cơ bản về tiện ích streaming đã thu được, bạn đã sẵn sàng viết một ứng dụng ánh xạ và rút gọn Ruby đơn giản và xem cách sử dụng các quá trình này trong khung công tác Hadoop. Ví dụ ở đây theo ứng dụng MapReduce chính tắc, nhưng vè sau bạn sẽ thấy các ứng dụng khác (cùng với cách bạn sẽ triển khai thực hiện chúng dưới dạng ánh xạ và rút gọn).

Hãy bắt đầu bằng trình ánh xạ (mapper). Kịch bản lệnh này nhận đầu vào nguyên bản từ stdin (đầu vào chuẩn), đánh dấu nó và rồi phát hành một tập hợp các cặp giá trị-khóa tới stdout (đầu ra chuẩn). Giống như hầu hết các ngôn ngữ tạo kịch bản lệnh hướng-đối tượng, nhiệm vụ này hầu như quá đơn giản. Kịch bản lệnh của trình ánh xạ thể hiện trong Liệt kê 4 (với một số nhận xét và khoảng trống để cho nó có kích thước lớn hơn một chút). Chương trình này sử dụng một trình lặp (iterator) để đọc một dòng từ stdin và một trình lặp khác để phân chia dòng đó thành các mã thông báo riêng. Mỗi mã đánh dấu (từ) lúc này được phát hành tới stdout với giá trị đi kèm là 1 (được phân cách nhờ một tab).

Liệt kê 4. Kịch bản lệnh ánh xạ của Ruby (map.rb)

	
#!/usr/bin/env ruby

# Our input comes from STDIN
STDIN.each_line do |line|

  # Iterate over the line, splitting the words from the line and emitting
  # as the word with a count of 1.
  line.split.each do |word|
    puts "#{word}\t1"
  end

end

Tiếp theo, hãy xem xét ứng dụng rút gọn. Ứng dụng này phức tạp hơn một chút nhưng sử dụng một hàm băm (mảng kết hợp) của Ruby để đơn giản hóa hoạt động rút gọn (xem Liệt kê 5). Kịch bản lệnh này một lần nữa hoạt động thông qua dữ liệu đầu vào từ stdin (thông qua tiện ích streaming) và chia dòng đó thành một từ và giá trị. Hàm băm này sau đó được kiểm tra với từ này; nếu tìm thấy từ, thì số đếm được thêm vào phần tử. Nếu không, bạn tạo một mục nhập mới trong hàm băm cho từ đó và rồi nạp số đếm (mà phải là 1 từ quá trình của trình ánh xạ). Khi tất cả đầu vào đã được xử lý, bạn chỉ lặp lại qua hàm băm và gửi các cặp giá tri-khóa tới stdout.

Liệt kê 5. Kịch bản lệnh rút gọn của Ruby (reduce.rb)

	
#!/usr/bin/env ruby

# Create an empty word hash
wordhash = {}

# Our input comes from STDIN, operating on each line
STDIN.each_line do |line|

  # Each line will represent a word and count
  word, count = line.strip.split

  # If we have the word in the hash, add the count to it, otherwise
  # create a new one.
  if wordhash.has_key?(word)
    wordhash[word] += count.to_i
  else
    wordhash[word] = count.to_i
  end

end

# Iterate through and emit the word counters
wordhash.each {|record, count| puts "#{record}\t#{count}"}

Với các kịch bản lệnh ánh xạ và rút gọn đã hoàn thành, hãy kiểm tra chúng từ dòng lệnh. Hãy nhớ thay đổi các tệp này để có thể thực hiện được bằng cách sử dụng chmod +x. Bắt đầu bằng cách tạo ra một tệp đầu vào, như trong Liệt kê 6.

Liệt kê 6 Tạo một tệp đầu vào

# echo "Hadoop is an implementation of the map reduce framework for " \ "distributed processing of large data sets." > input
#

Với đầu vào này, bạn có thể kiểm tra kịch bản lệnh của trình ánh xạ của bạn, như trong Liệt kê 7. Hãy nhớ lại rằng kịch bản lệnh này chỉ đơn giản gắn mã cho đầu vào đến các cặp giá trị-khóa, ở đây mỗi giá trị sẽ là 1 (không phải đầu vào duy nhất).

Liệt kê 7 Kiểm tra kịch bản lệnh của trình ánh xạ

# cat input | ruby map.rb
Hadoop	1
is	1
an	1
implementation	1
of	1
the	1
map	1
reduce	1
framework	1
for	1
distributed	1
processing	1
of	1
large	1
data	1
sets.	1
#

Cho đến nay, mọi thứ đều ổn. Bây giờ, hãy kết hợp toàn bộ ứng dụng với nhau dưới dạng tạo luồng gốc (các đường ống của (Linux®). Trong Liệt kê 8, bạn chuyển đầu vào của mình qua kịch bản lệnh ánh xạ của mình, sắp xếp kết quả đầu ra (bước tùy chọn) và sau đó chuyển dữ liệu kết quả trung gian qua kịch bản lệnh của trình rút gọn.

Liệt kê 8. Quá trình MapReduce đơn giản khi sử dụng các đường ống của Linux 

# cat input | ruby map.rb | sort | ruby reduce.rb
large	1
of	2
framework	1
distributed	1
data	1
an	1
the	1
reduce	1
map	1
sets.	1
Hadoop	1
implementation	1
for	1
processing	1
is	1
#
 Ruby với Hadoop

Khi các kịch bản lệnh ánh xạ và rút gọn của bạn hoạt động như mong muốn trong môi trường shell, hãy đặt chúng vào để thử nghiệm với Hadoop. Tôi sẽ bỏ qua các nhiệm vụ thiết lập Hadoop (xem Phần 1 hoặc Phần 2 của loạt bài này để cài đặt Hadoop và chạy).

Bước đầu tiên là tạo một thư mục đầu vào trong HDFS cho dữ liệu đầu vào của bạn và sau đó đưa ra một tệp mẫu mà bạn sẽ thử nghiệm các kịch bản của mình trong đó. Liệt kê 9 minh họa bước này (xem Phần 1 hoặc Phần 2 để biết thêm thông tin về các bước này).

Liệt kê 9. Tạo dữ liệu đầu vào cho quá trình MapReduce

# hadoop fs -mkdir input
# hadoop dfs -put /usr/src/linux-source-2.6.27/Documentation/memory-barriers.txt input
# hadoop fs -ls input
Found 1 items
-rw-r--r--  1 root supergroup  78031 2010-06-04 17:36 /user/root/input/memory-barriers.txt

Tiếp theo, sử dụng tiện ích streaming gọi Hadoop với các kịch bản lệnh tùy chỉnh, xác định dữ liệu đầu vào và vị trí đầu ra (xem Liệt kê 10). Lưu ý trong ví dụ này các tùy chọn -file chỉ đơn giản là ra lệnh cho Hadoop đóng gói các kịch bản lệnh Ruby của bạn như là một phần đệ trình công việc.

Liệt kê 10. Sử dụng tạo luồng của Hadoop với các kịch bản lệnh tùy chỉnh MapReduce của Ruby 

# hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-0.20.2+228-streaming.jar \ -file /home/mtj/ruby/map.rb -mapper /home/mtj/ruby/map.rb \ -file /home/mtj/ruby/reduce.rb -reducer /home/mtj/ruby/reduce.rb \ -input input/* -output output
packageJobJar: [/home/mtj/ruby/map.rb, /home/mtj/ruby/reduce.rb, /var/lib/hadoop-0.20/...
10/06/04 17:42:38 INFO mapred.FileInputFormat: Total input paths to process : 1
10/06/04 17:42:39 INFO streaming.StreamJob: getLocalDirs(): [/var/lib/hadoop-0.20/...
10/06/04 17:42:39 INFO streaming.StreamJob: Running job: job_201006041053_0001
10/06/04 17:42:39 INFO streaming.StreamJob: To kill this job, run:
10/06/04 17:42:39 INFO streaming.StreamJob: /usr/lib/hadoop-0.20/bin/hadoop job ...
10/06/04 17:42:39 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/...
10/06/04 17:42:40 INFO streaming.StreamJob:  map 0%  reduce 0%
10/06/04 17:43:17 INFO streaming.StreamJob:  map 100%  reduce 0%
10/06/04 17:43:26 INFO streaming.StreamJob:  map 100%  reduce 100%
10/06/04 17:43:29 INFO streaming.StreamJob: Job complete: job_201006041053_0001
10/06/04 17:43:29 INFO streaming.StreamJob: Output: output

Cuối cùng, tìm hiểu kết quả đầu ra bằng cách sử dụng phép toán của hệ thống tệp cat thông qua tiện ích hadoop (xem Liệt kê 11).

Liệt kê 11. Tìm hiểu kết quả đầu ra của Hadoop

# hadoop fs -ls /user/root/output
Found 2 items
drwxr-xr-x  - root supergroup      0 2010-06-04 17:42 /user/root/output/_logs
-rw-r--r--  1 root supergroup  23014 2010-06-04 17:43 /user/root/output/part-00000
# hadoop fs -cat /user/root/output/part-00000 | head -12
+--->|	4
immediate	2
Alpha)	1
enable	1
_mandatory_	1
Systems	1
DMA.	2
AMD64	1
{*C,*D},	2
certainly	2
back	2
this	23

Vì vậy, với kịch bản lệnh có ít hơn 30 dòng, bạn đã triển khai thực hiện các phần tử map và reduce và biểu diễn việc thực hiện chúng trong khung công tác của Hadoop. Một ví dụ đơn giản, chỉ là một ví dụ minh họa cho sức mạnh thực sự đằng sau Hadoop và lý do nó trở thành một khung công tác phổ biến cho việc xử lý các tập dữ liệu lớn với các thuật toán tùy chỉnh hoặc độc quyền.

 Các ứng dụng khác với Hadoop

Hadoop có thể được sử dụng trong nhiều ứng dụng ngoài việc tính toán đếm từ đơn giản trong các tập dữ liệu lớn. Tất cả những gì cần thiết là một biểu diễn dữ liệu dưới dạng một vector để cơ sở hạ tầng Hadoop có thể sử dụng vector đó. Mặc dù những ví dụ chính tắc sử dụng biểu diễn vector như là một khóa và giá trị, thì không có hạn chế nào về cách bạn có thể xác định giá trị (chẳng hạn như là một tổng số của một số giá trị). Tính linh hoạt này có thể mở ra nhiều cơ hội mới cho Hadoop trong một tập các ứng dụng phong phú hơn.

Một ứng dụng thú vị hoàn toàn phù hợp với mô hình đếm từ MapReduce là lập bảng tần suất truy cập vào máy chủ Web (đã thảo luận trong tài liệu của Google có ảnh hướng lớn đến sự phát triển sau này). Đối với các ứng dụng này, các URL được dùng như các khóa (do được tiếp nhận từ bản ghi nhật ký của máy chủ Web). Kết quả của quá trình reduce là tổng lượng truy cập cho mỗi URL đối với một trang Web cụ thể dựa vào các bản ghi nhật ký của máy chủ Web.

Trong các ứng dụng học máy, Hadoop đã được sử dụng như một cách để mở rộng các thuật toán phát sinh cho việc xử lý tập hợp lớn các cá thể của thuật toán phát sinh (GA:genetic algorithm) (các giải pháp tiềm năng). Quá trình map thực hiện thuật toán phát sinh truyền thống, tìm kiếm giải pháp riêng tốt nhất từ vùng lưu trữ cục bộ. Ứng dụng rút gọn sau đó trở thành một vòng đấu của các giải pháp riêng trong giai đoạn ánh xạ. Điều này cho phép các nút riêng xác định các giải pháp tốt nhất của chúng và sau đó cho phép các giải pháp này cạnh tranh với nhau trong giai đoạn rút gọn trong việc hiển thị phân tán của quá trình chọn lọc tự nhiên.

Một ứng dụng thú vị khác đã được tạo ra để xác định các botnet có trong thư rác điện tử. Bước đầu tiên trong quá trình này là phân loại thư điện tử với mục đích thu gọn chúng (dựa trên một tập các dấu vết) khi chúng đến từ một tổ chức cụ thể. Với việc lọc dữ liệu này, người ta dựng lên một biểu đồ với các thư điện tử đã được kết nối theo một cách nào đó (ví dụ, có liên quan đến cùng một liên kết trong nội dung phần thân của thư điện tử). Sau đó các thư điện tử liên quan được đưa về các máy chủ (địa chỉ IP tĩnh hoặc động) để xác định botnet nghi ngờ.

Ngoài ra các ứng dụng xem xét thế giới thông qua các sản phẩm ánh xạ và rút gọn, Hadoop có ích như là một phương tiện phân phối công việc trong một cụm các máy. Ánh xạ và rút gọn không nhất thiết áp đặt với một kiểu ứng dụng cụ thể. Thay vào đó, Hadoop có thể được coi như là một cách để phân phối cả dữ liệu lẫn các thuật toán cho máy chủ để xử lý song song nhanh hơn.

 Hệ sinh thái ứng dụng của Hadoop

Mặc dù Hadoop cung cấp một khung công tác linh hoạt, nhưng các ứng dụng khác cũng có sẵn khung công tác có thể chuyển đổi giao diện của nó cho các ứng dụng khác. Một ví dụ thú vị có tên là Hive, là một cơ sở hạ tầng kho dữ liệu có ngôn ngữ truy vấn riêng của nó (gọi là Hive QL). Hive làm cho Hadoop quen thuộc hơn với các ứng dụng có nền SQL (Structured Query Language-Ngôn ngữ truy vấn có cấu trúc), ngoài ra nó cũng hỗ trợ cơ sở hạ tầng MapReduce truyền thống để xử lý dữ liệu.

HBase là một ứng dụng thú vị khác nằm trên HDFS. Nó có một hệ thống cơ sở dữ liệu hiệu năng cao tương tự như BigTable của Google. Thay vì xử lý tệp truyền thống, HBase tạo biểu mẫu đầu vào và đầu ra cho các bảng cơ sở dữ liệu để xử lý MapReduce.

Cuối cùng, Pig là một nền tảng trên Hadoop để phân tích các tập hợp dữ liệu lớn. Pig cung cấp một ngôn ngữ bậc cao để biên dịch các ứng dụng ánh xạ và rút gọn.

 Đi xa hơn nữa

Bài viết cuối cùng này trong loạt bài về Hadoop đã tìm hiểu sự phát triển của ứng dụng ánh xạ và rút gọn trong Ruby cho khung công tác Hadoop. Hy vọng rằng, từ bài viết này, bạn có thể nhận thấy sức mạnh thực sự của Hadoop. Mặc dù Hadoop hạn chế bạn theo một mô hình lập trình cụ thể, mô hình đó linh hoạt và có thể được áp dụng cho một số lượng lớn các ứng dụng.

Tài nguyên

Học tập

  • MapReduce: Đơn giản hóa việc xử lý dữ liệu trên các cụm lớn là tài liệu có ảnh hướng lớn về MapReduce, được Jeff Dean và Sanjay Ghemawat viết vào năm 2004. Bài viết này vẫn còn rất thú vị để đọc.
  • Bài viết này tìm hiểu tiện ích streaming của Hadoop, cho phép phát triển các kịch bản lệnh ánh xạ và rút gọn bằng các ngôn ngữ khác ngôn ngữ Java. Apache cung cấp một tập lớn các tài nguyên cho streaming, bao gồm các tài liệuStreaming của Hadoop và streaming wiki (cung cấp hướng dẫn có giá trị cho các tùy chọn dòng lệnh khác nhau).
  • Wikipedia cung cấp những hướng dẫn cụ thể cho các ngôn ngữ Lisp và Scheme cũng như một hướng dẫn chung về những khái niệm lập trình chức năng (và MapReduce).
  • Để trình diễn các phần tử lập trình chức năng về ánh xạ và rút gọn, bài viết này sử dụng Scheme shell. Thậm chí nếu bạn đã từng muốn thử nghiệm với Scheme, thì SCSH là một hộp thử (sandbox) cụ thể để thử nghiệm với ngôn ngữ mạnh mẽ này. Bạn cũng có thể tìm hiểu về Scheme và tạo kịch bản lệnh bằng C trong bài viết của Tim Tạo kịch bản lệnh bằng Guile(developerWorks, 01.2009) hoặc xem hướng dẫn Scheme cụ thể.
  • Trong tài liệu Map-Reduce để học máy trên nền đa lõi, mô hình MapReduce được sử dụng để thực hiện một loạt các thuật toán học máy cho các bộ xử lý đa lõi. Thật thú vị để tìm hiểu xem mô hình MapReduce có thể áp dụng cho một loạt các thuật toán tính toán như thế nào.
  • Hive là một cơ sở hạ tầng kho dữ liệu được xây dựng trên Hadoop. Nó cung cấp một ngôn ngữ truy vấn trên dữ liệu Hadoop trong việc hỗ trợ cho mô hình lập trình Hadoop truyền thống. HBase là một sự biểu diễn cơ sở dữ liệu trên HDFS của Hadoop, cho phép MapReduce hoạt động với các bảng cơ sở dữ liệu trên các tệp đơn giản. Cuối cùng, Pig là một nền tảng để phân tích tập dữ liệu lớn bao gồm một ngôn ngữ bậc cao để lập trình Hadoop.
  • Ngôn ngữ Ruby là ngôn ngữ mới nhất trong các ngôn ngữ tạo kịch bản lệnh hướng đối tượng. Nó là động lực cho sự tập trung vào năng suất của lập trình viên.
  • Xem danh sách của các thuật toán Hadoop và MapReduce trong các tài liệu học thuật. Trang Web này cung cấp một góc nhìn thú vị về cách Hadoop được sử dụng cho một loạt các ứng dụng (từ khoa học, học máy, dịch vụ Web và nhiều hơn nữa).
  • Yahoo! cung cấp một tập tài nguyên cho Hadoop lớn tại mạng của nhà phát triển. Cụ thể là Hướng dẫn Hadoop của Yahoo!, , trong đó giới thiệu Hadoop và cung cấp một cuộc thảo luận chi tiết về sử dụng và cấu hình của nó.
  • Trong vùng developerWorks Linux, tìm thấy hàng trăm bài báo và hướng dẫn, cũng như các bản tải về, các diễn đàn thảo luận và tài nguyên phong phú khác dành cho các nhà phát triển và nhà quản trị Linux.
  • Theo sát các sự kiện kỹ thuật và Webcast của developerWorks đã tập trung vào một loạt các sản phẩm của IBM và các chủ đề của ngành công nghiệp công nghệ thông tin.
  • Tham dự một buổi hướng dẫn chi tiết về developerWorks Live! miễn phí để nhanh chóng tăng tốc cho các sản phẩm và các công cụ của IBM cũng như các xu hướng của ngành công nghiệp công nghệ thông tin.
  • Xem một loạt các chương trình trình diễn theo yêu cầu miễn phí của developerWorks từ cài đặt và thiết lập sản phẩm cho những người mới bắt đầu đến chức năng cao cấp cho những nhà phát triển có kinh nghiệm.
  • Theo dõi developerWorks trên Twitter, hoặc đặt mua một nguồn cung cấp những bài viết ngắn của Linux trên developerWorks.

Lấy sản phẩm và công nghệ

  • Cloudera cung cấp một số bản phân phối Hadoop miễn phí (và ổn định!). Bạn có thể tải về một bản phân phối cho mộtloạt trong số các bản phân phối Linuxmột máy ảo, và thậm chí cả máy ảo cho Amazon EC2.
  • Đánh giá các sản phẩm IBM theo cách phù hợp nhất cho với bạn: hãy tải về một bản dùng thử sản phẩm, hãy thử một sản phẩm trực tuyến, sử dụng một sản phẩm trong một môi trường đám mây hoặc dành một vài giờ trong SOA Sandboxđể tìm hiểu cách triển khai thực hiện có hiệu quả kiến trúc hướng dịch vụ (SOA-Service Oriented Architecture).
Nguồn : IBM Libary
Print Friendly, PDF & Email

Comments

comments

Bài viết liên quan