text:
Giới thiệu
Trong hai thập kỷ vừa qua, sự gia tăng ổn định về công suất tính toán đã tạo ra một luồng dữ liệu rộng lớn, mà dần dần đã dẫn đến một sự thay đổi hình mẫu trong kiến trúc điện toán và các cơ chế xử lý dữ liệu quy mô lớn. Ví dụ, các kính viễn vọng mạnh mẽ trong thiên văn học, các máy gia tốc hạt trong vật lý và các bộ gen trong sinh học trao khối dữ liệu khổng lồ vào tay các nhà khoa học. Facebook thu thập 15 terabyte dữ liệu mỗi ngày vào một kho dữ liệu quy mô Petabyte. Nhu cầu về khai phá dữ liệu quy mô lớn và các ứng dụng phân tích dữ liệu ngày càng tăng trong cả ngành công nghiệp phần mềm (ví dụ, phân tích dữ liệu web, phân tích luồng nhấn chuột và phân tích bản ghi nhật ký giám sát-mạng) lẫn các ngành khoa học (ví dụ, phân tích dữ liệu do các bộ mô phỏng quy mô rất lớn tạo ra, triển khai bộ cảm biến và thiết bị phòng thí nghiệm có thông lượng cao). Mặc dù các hệ thống cơ sở dữ liệu song song có lợi cho một số các ứng dụng phân tích dữ liệu này, nhưng chúng rất đắt tiền, khó quản lý và thiếu khả năng chịu lỗi với các truy vấn chạy lâu dài.
MapReduce là một khung công tác được Google giới thiệu cho việc lập trình các cụm máy tính thương mại để thực hiện xử lý dữ liệu quy mô lớn trong một lần chạy. Khung công tác này được thiết kế theo cách mà một cụm MapReduce có thể mở rộng đến hàng ngàn các nút về mặt khả năng chịu lỗi. Nhưng mô hình lập trình MapReduce có những hạn chế riêng của mình. Luồng dữ liệu một đầu vào và hai tầng của nó vô cùng cứng nhắc, ngoài thực tế là nó ở bậc rất thấp. Ví dụ, bạn phải viết mã tùy chỉnh cho ngay cả những hoạt động phổ biến nhất. Do đó, nhiều nhà lập trình cảm thấy khó chịu với khung công tác MapReduce và thích sử dụng SQL như một ngôn ngữ khai báo bậc cao. Một số dự án (Apache Pig, Apache Hive và HadoopDB) đã được phát triển để giảm bớt nhiệm vụ của các nhà lập trình và cung cấp các giao diện khai báo mức cao trên đỉnh của khung công tác MapReduce.
Trước hết hay xem xét khung công tác MapReduce và sau đó xem xét các khả năng của các hệ thống khác nhau cung cấp các giao diện bậc cao cho khung công tác MapReduce.
Khung công tác MapReduce
Một lợi thế chính về cách tiếp cận của khung công tác MapReduce là ở chỗ nó tách các ứng
dụng ra khỏi các chi tiết về chạy một chương trình phân tán, chẳng hạn như các vấn đề về
phân phối dữ liệu, lập lịch biểu và khả năng chịu lỗi. Trong mô hình này, việc tính toán lấy
một tập các cặp giá trị/khóa đầu vào và tạo ra một tập các cặp giá trị/khóa đầu ra. Người
dùng khung công tác MapReduce biểu thị tính toán này bằng cách sử dụng hai hàm:
Map (Ánh xạ) và
Reduce (Giảm). Hàm
Map lấy một cặp đầu vào và tạo ra một tập các cặp giá trị/khóa trung
gian. Khung công tác MapReduce nhóm lại với nhau tất cả các giá trị trung gian gắn liền với
khóa trung gian giống nhau
I (luôn thay đổi) và chuyển chúng cho
hàm
Reduce. Hàm
reduce nhận một khóa
trung gian
I với tập các giá trị của nó và kết hợp chúng lại với
nhau. Thông thường, chỉ có giá trị đầu ra không hoặc một được tạo ra cho mỗi lần gọi hàm
reduce. Lợi thế chính của mô hình này là ở chỗ nó cho phép các
tính toán lớn được song song hóa và được thực hiện lại dễ dàng để sử dụng nó như là cơ chế
chính về khả năng chịu lỗi.
Dự án Hadoop của Apache (Apache Hadoop) là phần mềm Java™ nguồn mở hỗ trợ các ứng dụng phân tán chuyên về dữ liệu bằng cách thực hiện việc triển khai khung công tác MapReduce. Ban đầu nó được Yahoo! phát triển như một bản sao của cơ sở hạ tầng MapReduce của Google nhưng sau đó đã trở thành nguồn mở. Hadoop quan tâm đến việc chạy mã của bạn trên một cụm các máy tính. Nói chung, khi một tập dữ liệu lớn hơn dung lượng lưu trữ của một máy tính vật lý đơn lẻ, việc phân vùng nó trên một số máy tính riêng biệt trở nên cần thiết. Các hệ thống tệp quản lý lưu trữ trên một mạng các máy tính được gọi là các hệ thống tệp phân tán. Hadoop đi kèm với một hệ thống tệp phân tán được gọi là HDFS (Hệ thống tệp phân tán Hadoop). Cụ thể là, HDFS là một hệ thống tệp phân tán lưu trữ các tệp trên tất cả các nút trong một cụm Hadoop. Nó chia tách các tệp thành các khối lớn và phân phối chúng trên các máy tính khác nhau, cộng với việc tạo nhiều bản sao của mỗi khối sao cho nếu có một máy tính bị hỏng, thì không có dữ liệu nào bị mất.
Chương trình MapReduce trong Liệt kê 1 được
biểu diễn bằng mã-giả (pseudo-code) để đếm số các lần xuất hiện của mỗi từ trong một chuỗi
các dòng văn bản. Trong Liệt kê 1, hàm
map phát ra mỗi từ cộng với một dấu hiệu liên quan của các lần xuất hiện trong khi
hàm
reduce cộng tất cả các dấu hiệu đã phát ra với một từ cụ
thể.
Liệt kê 1. Chương trình MapReduce
map(String key, String value): //key: line number, value: line text for each word w in value: EmitIntermediate(w, ?1?); reduce(String key, Iterator values): //key: a word, values: a list of counts int wordCount = 0; for each v in values: wordCount += ParseInt(v); Emit(AsString(wordCount));
Bây giờ giả sử chuỗi đầu vào của dòng văn bản trong Liệt kê 2.
Liệt kê 2. Chuỗi đầu vào
1, This is Code Example 2, Example Color is Red 3, Car Color is Green
Liệt kê 3 cho thấy kết quả đầu ra của hàm
map của đầu vào này.
Liệt kê 3. Kết quả đầu ra của hàm
map
('This', 1), ('is', 1). ('Code', 1), ('Example', 1) ('Example', 1), ('Color', 1), ('is', 1), ('Red', 1) ('Car', 1), ('Color', 1), ('is', 1), ('Green', 1)
Liệt kê 4 cho thấy kết quả đầu ra của hàm
reduce (kết quả).
Liệt kê 4. Kết quả đầu ra của hàm
reduce
('Car', 1), ('Code', 1), ('Color', 2), ('Example', 2), ('Green', 1), ('Red', 1) , ('This', 1), ('is', 3)
Với các nhà lập trình, một tính năng quan trọng của khung công tác MapReduce là chỉ có hai
nguyên hàm khai báo bậc cao (là
map và
reduce) có thể được viết bằng bất kỳ ngôn ngữ lập trình nào được chọn mà không cần
lo lắng về các chi tiết thực hiện song song của chúng. Mặt khác, mô hình lập trình MapReduce
có những hạn chế riêng của mình:
- Luồng dữ liệu một đầu vào và hai tầng của nó vô cùng cứng nhắc. Để thực hiện các nhiệm vụ có một luồng dữ liệu khác nhau (ví dụ, các phép nối hoặc n giai đoạn), bạn phải nghĩ ra các cách giải quyết không nhàm chán khác.
- Mã tùy chỉnh được viết cho ngay cả những hoạt động phổ biến nhất (ví dụ, phép chiếu và lọc), dẫn đến mã thường khó sử dụng lại và bảo trì.
- Tính chất không trong suốt của các hàm
mapvà
reducecản trở khả năng của hệ thống để thực hiện các tối ưu hóa.
Hơn nữa, nhiều nhà lập trình chưa quen với khung công tác MapReduce và thích sử dụng SQL (vì họ thành thạo hơn về nó) như là một ngôn ngữ khai báo bậc cao để biểu thị nhiệm vụ của họ trong khi để lại tất cả các chi tiết tối ưu hóa thực hiện cho các công cụ phụ trợ. Ngoài ra, cũng đúng là các sự trừu tượng hóa của ngôn ngữ bậc cao cho phép hệ thống bên dưới thực hiện tốt hơn các tối ưu hóa tự động.
Hãy xem xét các ngôn ngữ và các hệ thống được thiết kế để giải quyết các vấn đề này và thêm hương vị SQL trên đỉnh của khung công tác MapReduce.
Pig
Dự án Pig của Apache (Apache Pig) được thiết kế như một công cụ để thực hiện các luồng dữ liệu song song trên Hadoop. Nó sử dụng một ngôn ngữ, được gọi là Pig Latin để biểu diễn các luồng dữ liệu này. Với Pig Latin, bạn có thể mô tả cách dữ liệu từ một hoặc nhiều đầu vào cần đọc, xử lý và sau đó lưu trữ tới một hoặc nhiều đầu ra song song. Ngôn ngữ này lấy một vị trí trung gian giữa việc biểu diễn các nhiệm vụ khi sử dụng mô hình truy vấn khai báo bậc cao theo cách của SQL và lập trình theo thủ tục/bậc thấp khi sử dụng MapReduce. Các luồng dữ liệu Pig Latin có thể là các luồng tuyến tính đơn giản, nhưng cũng có thể là các luồng công việc phức tạp gồm nhiều điểm nối đến nhiều đầu vào và phân chia dữ liệu thành nhiều luồng để được xử lý bằng các toán tử khác nhau.
Một chương trình Pig Latin gồm có một loạt các hoạt động hoặc các phép chuyển đổi, được áp dụng cho dữ liệu đầu vào để tạo ra kết quả đầu ra. Nói chung, các hoạt động mô tả một luồng dữ liệu mà môi trường thực hiện của Pig chuyển nó thành một biểu diễn có thể thực hiện được và sau đó được thực hiện. Ở dưới các vỏ bọc này, Pig chuyển các phép chuyển đổi thành một loạt các công việc MapReduce.
Với Pig, các cấu trúc dữ liệu phong phú hơn nhiều, thường là nhiều giá trị và lồng nhau; và bộ các phép chuyển đổi, mà bạn có thể áp dụng cho các dữ liệu, mạnh hơn rất nhiều. Cụ thể là, mô hình dữ liệu Pig Latin gồm bốn kiểu sau:
- Atom (Nguyên tử) là một giá trị nguyên tử đơn giản như là một chuỗi hoặc một số, ví dụ, "John".
- Tuple (Bộ dữ liệu) là một chuỗi các trường, mỗi trường có thể là bất kỳ kiểu dữ liệu nào, ví dụ, ("John", "Melbourne").
- Bag (Túi) là một bộ sưu tập về các bộ dữ liệu với các bản sao có thể. Lược đồ
của các bộ dữ liệu hợp thành rất linh hoạt ở đó không phải tất cả các bộ dữ liệu trong một
túi cần phải có cùng số lượng và kiểu trường giống nhau. Túi trong Hình 1 liệt kê hai bộ dữ liệu : ("John","Melbourne") và
"Alice",("UNSW" "Sydney").
Hình 1. Một Túi (Bag)
- Map (Ánh xạ) là một bộ sưu tập về các mục dữ liệu, nơi mà mỗi mục có một mã
khóa liên kết mà có thể tìm kiếm mục này thông qua khóa đó. Như với các túi, lược đồ của
các mục dữ liệu hợp thành rất linh hoạt, tuy nhiên, các khóa được yêu cầu là các nguyên tử
dữ liệu > Map trong Hình 2 liệt kê các
mục dữ liệu: K1-->("John","Melbourne") và K2-->30.
Hình 2. Một ánh xạ (Map)
Pig Latin gồm các toán tử cho nhiều hoạt động dữ liệu truyền thống (
join,
sort,
filter,
group by,
union, và v.v..), cũng như khả
năng cho những người dùng phát triển các hàm riêng của họ để đọc, xử lý và ghi dữ liệu.
MapReduce cung cấp hoạt động group by (nhóm bởi) trực tiếp (về cơ bản trong đó là sự sắp xếp cộng với các giai đoạn giảm) và nó cung cấp hoạt động order by (sắp xếp bởi) gián tiếp thông qua cách mà nó thực hiện tạo nhóm. Bộ lọc và phép chiếu có thể được thực hiện không đáng kể trong giai đoạn ánh xạ. Tuy nhiên, các toán tử khác, đặc biệt là phép nối, không được cung cấp và thay vào đó phải do người dùng viết ra. Pig cung cấp một số cách thực hiện quan trọng, phức tạp về các hoạt động dữ liệu tiêu chuẩn. Ví dụ, vì số các bản ghi cho mỗi khóa trong một bộ dữ liệu hiếm khi được phân bố đều, nên dữ liệu được gửi đến các bộ giảm (reducer) thường bị sai lệch. Đó là, một bộ giảm sẽ nhận được dữ liệu nhiều hơn gấp 10 lần hoặc lớn hơn nữa so với các bộ giảm khác. Pig có các toán tử join và order by sẽ xử lý trường hợp này và (trong một số trường hợp) cân bằng lại các bộ giảm. Bảng 1 mô tả các toán tử chính của ngôn ngữ Pig Latin.
Trong MapReduce, việc xử lý dữ liệu bên trong giai đoạn ánh xạ và giảm là không trong suốt với một hệ thống. Điều này có nghĩa là MapReduce không có cơ hội để tối ưu hóa hoặc kiểm tra mã của người dùng. Trái lại, Pig có thể phân tích một kịch bản lệnh Pig Latin và hiểu luồng dữ liệu mà người dùng đang mô tả. MapReduce không có một hệ thống kiểu. Đây là cố ý và nó mang lại cho người dùng sự linh hoạt để sử dụng các kiểu dữ liệu và khung công tác tuần tự riêng của họ. Nhưng nhược điểm là ở chỗ điều này hạn chế nhiều hơn khả năng của hệ thống trong việc kiểm tra mã của người dùng với các lỗi xảy ra trước và trong thời gian chạy. Tất cả những điểm này có nghĩa là Pig Latin có chi phí viết và bảo trì mã thấp hơn nhiều so với mã Java dùng cho MapReduce.
Bảng 1. Các toán tử chính của ngôn ngữ Pig Latin
Liệt kê 5 cho thấy một chương trình Pig Latin đơn giản để tìm tất cả các nhân viên có mức lương cao.
Liệt kê 5. Tìm tất cả các nhân viên có mức lương cao
employees = LOAD 'employee.txt' AS (id, name, salary); highSalary = FILTER employees BY salary > 100000; sortedList = ORDER highSalary BY salary DESC; STORE sortedList INTO ' highSalary _Emp'; DUMP sortedList;
Trong ví dụ này, trước tiên tải tệp đầu vào vào một túi (bag) có tên là employees (các nhân viên). Sau đó, tạo ra một túi mới được gọi là highSalary (lương cao), trong đó có các bản ghi nào có trường tiền lương lớn hơn 100.000. Túi SortedList cung cấp các bản ghi đã lọc dựa vào giá trị tiền lương theo một thứ tự giảm dần. Cuối cùng, viết các nội dung của túi SortedList vào HDFS và in nội dung túi đó trên màn hình.
Liệt kê 6 cho thấy cách mô tả dễ dàng các hoạt
động nối
join bằng cách sử dụng Pig Latin.
Liệt kê 6.
các hoạt động nối join có thể dễ
dàng được mô tả bằng cách sử dụng Pig Latin
employees = LOAD 'employee.txt' AS (id, name, salary, dept); departments = LOAD 'dept.txt' AS (deptID, deptName); joinList = JOIN employees BY dept, departments BY deptID; STORE joinList INTO ' joinFile';
Theo truyền thống, các truy vấn đặc biệt được thực hiện bằng các ngôn ngữ chẳng hạn như SQL giúp dễ dàng tạo nhanh một câu hỏi cho dữ liệu cần trả lời. Để nghiên cứu dữ liệu thô, một số người dùng thích Pig Latin hơn. Vì Pig có thể hoạt động trong tình huống ở đó giản đồ không rõ, không đầy đủ hoặc không phù hợp và bởi vì nó có thể dễ dàng quản lý dữ liệu lồng nhau, các nhà nghiên cứu, những người muốn tiếp tục làm việc với dữ liệu trước khi nó bị xóa và được tải vào kho dữ liệu, thường thích Pig hơn. Các nhà nghiên cứu làm việc với các bộ dữ liệu lớn thường sử dụng ngôn ngữ tạo kịch bản lệnh như Perl hoặc Python để thực hiện việc xử lý của họ. Những người dùng với các nền tảng này thường thích mô hình luồng dữ liệu của Pig trên mô hình truy vấn khai báo của SQL.
Hive
Dự án Hive của Apache (Apache Hive) là một giải pháp kho dữ liệu nguồn mở được Nhóm Cơ sở hạ tầng dữ liệu của Facebook xây dựng trên đỉnh của môi trường Hadoop. Mục tiêu chính của dự án này là mang đến các khái niệm cơ sở dữ liệu quan hệ quen thuộc (ví dụ, các bảng, các cột, các phân vùng) và một tập con của SQL cho thế giới không cấu trúc của Hadoop, trong khi vẫn duy trì tính mở rộng và tính linh hoạt mà Hadoop đã có được. Vì vậy, nó hỗ trợ tất cả các kiểu nguyên thủy chính (ví dụ, số nguyên, các float, các chuỗi) cũng như các kiểu phức tạp (ví dụ, các ánh xạ, các danh sách, các cấu trúc). Hive hỗ trợ các truy vấn được thể hiện theo một ngôn ngữ khai báo giống như SQL, là HiveQL (Hive Query Language – Ngôn ngữ truy vấn Tổ ong) và do đó bất cứ ai đã quen thuộc với SQL đều có thể hiểu dễ dàng. Các truy vấn này tự động biên dịch thành các công việc MapReduce được thực hiện bằng cách sử dụng Hadoop. Ngoài ra, HiveQL cho phép những người dùng kết hợp các kịch bản lệnh MapReduce tùy chỉnh vào các truy vấn.
HiveQL hỗ trợ các câu lệnh của DDL (Data Definition Language - Ngôn ngữ định nghĩa dữ
liệu), mà bạn có thể sử dụng để tạo, xóa và thay đổi các bảng trong cơ sở dữ liệu. Nó cho
phép những người dùng tải dữ liệu từ các nguồn bên ngoài và chèn các kết quả truy vấn vào
các bảng Hive thông qua việc tải và chèn các câu lệnh DML (Data Manipulation Language - Ngôn
ngữ xử lý dữ liệu), tương ứng. Tuy nhiên, HiveQL hiện không hỗ trợ cập nhật và xóa các hàng
trong các bảng hiện có (cụ thể là các câu lệnh
INSERT INTO,
UPDATE và
DELETE), mà chúng cho phép sử
dụng các cơ chế rất đơn giản để giải quyết các hoạt động đọc và viết đồng thời mà không cần
thực hiện các giao thức tạo khóa phức tạp. Các thành phần của siêu kho lưu trữ (metastore)
là danh mục hệ thống của Hive, lưu trữ siêu dữ liệu về các bảng bên dưới. Siêu dữ liệu này
được quy định trong quá trình tạo bảng và được sử dụng lại mỗi khi tham khảo bảng đó trong
HiveQL. Siêu kho dữ liệu phân biệt Hive như một giải pháp kho dữ liệu truyền thống khi được
so sánh với các hệ thống xử lý dữ liệu tương tự được xây dựng trên đỉnh của kiến trúc
giống-MapReduce như Pig Latin.
Liệt kê 7 cho thấy các ví dụ về các câu lệnh HiveQL đang mô tả các hoạt động để tạo một bảng, nạp dữ liệu và truy vấn các nội dung của bảng đó.
Liệt kê 7. Các câu lệnh HiveQL đang mô tả các hoạt động để tạo ra một bảng, tải dữ liệu và truy vấn các nội dung của bảng đó
CREATE TABLE employee (empID INT, name STRING, salary BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; LOAD DATA INPATH "employee_data" INTO TABLE employee; SELECT * FROM employee WHERE salary > 100000 SORT BY salary DESC;
Hive cũng hỗ trợ xử lý dữ liệu thông qua các hàm do người dùng tạo ra (xem Liệt kê 8).
Liệt kê 8. Hive hỗ trợ xử lý dữ liệu thông qua các hàm do người dùng tạo ra
INSERT OVERWRITE TABLE employee SELECT TRANSFORM (empID, name, salary, address, department) USING 'python employee_mapper.py' AS (empID, name, salary, city) FROM employee_data;
Nói chung, Hive là một giao diện rất tốt cho bất cứ ai dựa vào thế giới cơ sở dữ liệu quan
hệ, mặc dù các chi tiết của việc thực hiện bên dưới không hoàn toàn được ẩn dấu. Bạn vẫn
phải lo lắng về một số sự khác biệt trong những thứ như là cách tối ưu nhất để quy định các
phép nối cho hiệu năng tốt nhất và một số tính năng ngôn ngữ còn thiếu. Hive cung cấp khả
năng để kết hợp mã tùy chỉnh cho các tình huống không khớp với SQL, cũng như rất nhiều công
cụ để xử lý đầu vào và đầu ra. Hive bị một số hạn chế như nó thiếu hỗ trợ cho các câu lệnh
UPDATE hay
DELETE, việc
INSERT (chèn) các hàng đơn và các kiểu dữ liệu ngày tháng hoặc thời
gian, do chúng được xử lý như các chuỗi.
HadoopDB
Dự án HadoopDB, được công ty Hadapt thương mại hóa, là một hệ thống lai cố gắng kết hợp những lợi thế về khả năng mở rộng của MapReduce với những lợi thế về hiệu năng và hiệu quả của các cơ sở dữ liệu song song. Ý tưởng cơ bản đằng sau HadoopDB là để kết nối nhiều hệ thống cơ sở dữ liệu có nút đơn (PostgreSQL) bằng cách sử dụng Hadoop làm bộ điều phối nhiệm vụ và tầng giao tiếp mạng. Các truy vấn được thể hiện trong SQL, nhưng việc triển khai của chúng được song song hóa trên các nút bằng cách sử dụng khung công tác MapReduce sao cho công việc truy vấn đơn lẻ được mở rộng, càng nhiều càng tốt, vào cơ sở dữ liệu nút tương ứng.
Nói chung, các hệ thống cơ sở dữ liệu thương mại song song đã có sẵn trong gần hai thập kỷ và hiện nay có khoảng một chục các công cụ khác nhau trên thị trường (ví dụ Teradata, Aster Data, Greenplum). Mục đích chính của các hệ thống này là để cải thiện hiệu năng thông qua việc thực hiện song song các hoạt động khác nhau như tải dữ liệu, xây dựng các chỉ mục và đánh giá các truy vấn. Nói chung, một số lý do chủ yếu làm cho MapReduce trở thành một cách tiếp cận được ưa thích hơn trên một RDBMS song song trong một số kịch bản:
- Định dạng và tải một số lượng dữ liệu rất lớn vào một RDBMS song song kịp thời là một nhiệm vụ đầy thử thách và tốn thời gian.
- Các bản ghi dữ liệu đầu vào có thể không phải luôn theo cùng một lược đồ. Các nhà phát triển thường cần có sự linh hoạt để thêm và bớt các thuộc tính và việc giải thích một bản ghi dữ liệu đầu vào cũng có thể thay đổi theo thời gian.
- Việc xử lý dữ liệu quy mô lớn có thể rất tốn thời gian và vì thế điều quan trọng là giữ cho công việc phân tích tiếp diễn ngay cả trong trường hợp hỏng hóc. Trong khi hầu hết các RDBMS song song đều có sự hỗ trợ khả năng chịu lỗi, một truy vấn thường được khởi động lại từ đầu ngay cả khi một nút trong cụm bị hỏng. Ngược lại, MapReduce xử lý hấp dẫn hơn các hỏng hóc và có thể khởi động lại chỉ một phần của tính toán đã bị mất do hỏng hóc này gây ra.
Sự so sánh giữa khung công tác MapReduce và các hệ thống cơ sở dữ liệu song song là một cuộc tranh luận đã có từ lâu rồi. Một sự so sánh quy mô lớn giữa việc thực hiện Hadoop của khung công tác MapReduce và các hệ thống quản lý cơ sở dữ liệu SQL song song về hiệu năng và độ phức tạp phát triển đã được tiến hành. Các kết quả của sự so sánh này cho thấy các hệ thống cơ sở dữ liệu song song đã hiển thị một lợi thế hiệu năng đáng kể so với MapReduce trong việc thực hiện một loạt các nhiệm vụ phân tích tập trung vào dữ liệu. Mặt khác, việc thực hiện Hadoop đã dễ dàng hơn và đơn giản hơn để thiết lập và sử dụng so với các hệ thống cơ sở dữ liệu song song. MapReduce cũng đã cho thấy là có hiệu năng cao hơn trong việc giảm thiểu số lượng công việc bị mất khi xảy ra một lỗi phần cứng. Ngoài ra, MapReduce (với việc triển khai nguồn mở của nó) đại diện cho một giải pháp rất rẻ so với các giải pháp DBMS song song rất tốn kém về mặt tài chính.
Ban đầu, các ứng dụng chính của khung công tác MapReduce đã tập trung vào việc phân tích các bộ dữ liệu không cấu trúc rất lớn như là: tạo chỉ mục web, các phân tích văn bản và khai phá dữ liệu đồ thị. Gần đây, khi MapReduce phát triển vững chắc thành các tiêu chuẩn phân tích dữ liệu trên thực tế, nó được sử dụng liên tục để truy vấn dữ liệu có cấu trúc. Trong một thời gian dài, cơ sở dữ liệu quan hệ đã chi phối các việc triển khai các hệ thống kho dữ liệu và hiệu năng của các công việc phân tích dựa vào dữ liệu có cấu trúc. Sự quan tâm đang tăng lên trong việc kết hợp MapReduce và các hệ thống cơ sở dữ liệu truyền thống để duy trì những lợi ích của cả hai thế giới này. Cụ thể là, HadoopDB cố gắng để đạt được khả năng chịu lỗi và khả năng hoạt động trong môi trường không đồng nhất bằng cách kế thừa việc thực hiện lập lịch biểu và việc thực hiện theo dõi công việc từ Hadoop. Nó cố gắng để đạt được các lợi ích hiệu năng của cơ sở dữ liệu song song bằng cách thực hiện hầu hết việc xử lý truy vấn bên trong công cụ cơ sở dữ liệu.
Hình 3minh họa kiến trúc của HadoopDB gồm có hai tầng: 1) Một tầng lưu trữ dữ liệu hoặc HDFS và 2) Một tầng xử lý dữ liệu hoặc khung công tác MapReduce.
Hình 3. Kiến trúc của HadoopDB
Trong kiến trúc này, HDFS là một hệ thống tệp có cấu trúc-khối do một Name Node (Nút Tên) trung tâm quản lý. Các tệp riêng lẻ được chia thành các khối có kích cỡ cố định và được phân phối trên nhiều Data Node (Nút dữ liệu) trong cụm. Name Node duy trì siêu dữ liệu về kích cỡ và vị trí của các khối cũng như các bản sao của chúng. Khung công tác MapReduce theo một kiến trúc chủ-khách (master-slave) đơn giản. Chủ là một Job Tracker (Bộ theo dõi Công việc) đơn và các khách hoặc các nút công nhân là các Task Tracker (Bộ theo dõi Nhiệm vụ). Job Tracker xử lý lập lịch biểu thời gian chạy của các công việc của MapReduce và duy trì thông tin về mỗi tải của Task Tracker và tài nguyên sẵn có. Database Connector (Các bộ nối cơ sở dữ liệu) là giao diện giữa các hệ thống cơ sở dữ liệu độc lập lưu trữ trên các nút trong cụm và các Task Tracker. Connector (Bộ nối) kết nối tới cơ sở dữ liệu, thực hiện truy vấn SQL và trả về các kết quả là các cặp giá trị-khóa. Thành phần Catalog (Danh mục) duy trì siêu dữ liệu về các cơ sở dữ liệu, vị trí của chúng, các vị trí của bản sao và các đặc tính phân vùng dữ liệu. Thành phần Data Loader (Bộ tải dữ liệu) chịu trách nhiệm về toàn bộ dữ liệu phân vùng lại trên một khóa phân vùng cụ thể khi tải và chia tách dữ liệu nút đơn thành nhiều phân vùng nhỏ hơn hoặc các khối. SMS planner (Bộ lập kế hoạch SMS) mở rộng HiveQL translator (Bộ phiên dịch HiveQL) và chuyển đổi SQL thành các công việc MapReduce kết nối đến các bảng được lưu trữ như các tệp trong HDFS.
Jaql
Jaql là một ngôn ngữ truy vấn được thiết kế cho JSON (JavaScript Object Notation – Ký pháp đối tượng JavaScript), một định dạng dữ liệu phổ biến do tính đơn giản và tính linh hoạt mô hình hóa của nó. JSON là một cách đơn giản nhưng linh hoạt để biểu diễn dữ liệu trải rộng từ dữ liệu bằng phẳng đến dữ liệu XML bán-cấu trúc. Trước tiên, Jaql được sử dụng để phân tích dữ liệu bán cấu trúc quy mô lớn. Nó là một ngôn ngữ truy vấn khai báo, theo chức năng, viết lại các truy vấn bậc cao, khi thích hợp, thành một truy vấn bậc thấp gồm có các công việc Map-Reduce được đánh giá bằng cách sử dụng dự án Apache Hadoop. Các tính năng cốt lõi gồm khả năng mở rộng người dùng và xử lý song song. Jaql có một ngôn ngữ kịch bản lệnh và trình biên dịch, cũng như một thành phần thời gian chạy. Nó có thể xử lý hoặc là không có lược đồ hoặc chỉ có một lược đồ một phần. Tuy nhiên, Jaql cũng có thể khai thác thông tin lược đồ cứng nhắc khi nó có sẵn, cho cả hai loại hiệu năng đang kiểm tra và hiệu năng được cải thiện. Đoạn mã sau trong Liệt kê 9 cho thấy một tài liệu JSON mẫu.
Liệt kê 9. Một tài liệu mẫu JSON
[ { id: 10, name: "Joe Smith", email: "JSmith@email.com", zip: 85150 }, { id: 20, name: "Alice Jones", email: "AJones@email.com", zip: 82116 } ]
Jaql sử dụng một mô hình dữ liệu rất đơn giản, một giá trị JDM (Jaql Data Model - Mô hình dữ liệu Jaql) hoặc là một nguyên tử, một mảng hoặc một bản ghi. Hầu hết các kiểu nguyên tử phổ biến được hỗ trợ, gồm các chuỗi, các số, các giá trị null và các ngày tháng. Các mảng và các bản ghi là các kiểu hỗn hợp có thể được lồng nhau tùy ý. Chi tiết hơn, một mảng là một bộ sưu tập các giá trị có thứ tự và có thể được sử dụng để mô hình hóa các cấu trúc dữ liệu như các véc tơ, các danh sách, các bộ hoặc các túi (bag). Một bản ghi là một bộ sưu tập các cặp giá trị-tên không theo thứ tự và có thể mô hình hóa các cấu trúc, các từ điển và các ánh xạ. Dù có tính đơn giản, nhưng JDM rất linh hoạt. Nó cho phép Jaql hoạt động với một loạt các biểu diễn dữ liệu khác nhau cho cả đầu vào lẫn đầu ra, gồm cả các tệp văn bản định giới, các tệp JSON, các tệp nhị phân, các tệp trình tự (Sequence File) của Hardtop, các cơ sở dữ liệu quan hệ, các kho giá trị-khóa hoặc các tài liệu XML. Các hàm là các giá trị hạng nhất trong Jaql. Chúng có thể được gán cho một biến và là bậc cao trong đó chúng có thể được chuyển giao như các tham số hoặc được sử dụng như là một giá trị trả về. Các hàm là thành phần quan trọng cho khả năng sử dụng lại do bất kỳ biểu thức Jaql nào đều có thể được gói gọn trong một hàm và một hàm có thể được tham số hóa theo những cách mạnh mẽ. Liệt kê 10 là một ví dụ về một kịch bản lệnh Jaql có một chuỗi các toán tử.
Liệt kê 10. Các kịch bản lệnh Jaql có một chuỗi các các toán tử
import myrecord; countFields = fn(records) ( records -> transform myrecord::names($) -> expand -> group by fName = $ as occurrences into { name: fName, num: count(occurrences) } ); read(hdfs("docs.dat")) -> countFields() -> write(hdfs("fields.dat"));
Toán tử read (đọc) tải dữ liệu thô, trong trường hợp này từ HDFS (Hadoop Distributed File System – Hệ thống tệp phân tán Hadoop) và chuyển đổi nó thành các giá trị Jaql. Các giá trị này được luồng con countFields xử lý, mà luồng con này trích xuất các tên trường và tính toán các tần số của chúng. Cuối cùng, toán tử write (ghi) lưu trữ kết quả vào lại HDFS. Bảng 2 mô tả các biểu thức cốt lõi của ngôn ngữ kịch bản lệnh Jaql.
Bảng 2. Các biểu thức cốt lõi của ngôn ngữ kịch bản lệnh Jaql
Ở một mức cao, kiến trúc Jaql đã mô tả trong Hình 4 là tương tự như hầu hết các hệ thống cơ sở dữ liệu.
Hình 4. Kiến trúc hệ thống Jaql
Các kịch bản lệnh được chuyển vào hệ thống từ trình thông dịch (interpreter) hoặc một ứng dụng, được biên dịch bởi trình phân tích cú pháp và công cụ viết lại hoặc được giải thích thêm hoặc đánh giá thêm qua dữ liệu từ tầng vào/ra (I/O). Tầng lưu trữ tương tự như một cơ sở dữ liệu thống nhất. Nó cung cấp một API để truy cập dữ liệu từ các hệ thống khác nhau gồm cả hệ thống tệp cục bộ hoặc phân tán (như HDFS của Hadoop), các hệ thống cơ sở dữ liệu (chẳng hạn như DB2, Netezza, HBase) hoặc từ các nguồn theo luồng dữ liệu như web. Không giống như các cơ sở dữ liệu thống nhất, tuy nhiên, hầu hết các dữ liệu đã truy cập được lưu trữ trong cùng một cụm và API vào/ra mô tả phân vùng dữ liệu, cho phép xử lý song song với tính tương tự của dữ liệu trong quá trình đánh giá. Jaql thu được phần lớn tính linh hoạt này từ API vào/ra của Hadoop. Nó đọc và ghi nhiều định dạng tệp phổ biến (chẳng hạn như các tệp định giới, văn bản JSON và các tệp của Hadoop Sequence). Các bộ thích ứng tùy chỉnh được viết dễ dàng để ánh xạ một bộ dữ liệu đến hoặc từ mô hình dữ liệu Jaql. Thậm chí đầu vào có thể chỉ đơn giản là các giá trị được xây dựng trong chính kịch bản lệnh. Bộ biên dịch Jaql đánh giá kịch bản lệnh cục bộ trên máy tính đã biên dịch kịch bản lệnh, nhưng sinh ra các trình thông dịch trên các nút từ xa bằng cách sử dụng MapReduce. Trình biên dịch Jaql tự động phát hiện các cơ hội song song trong một kịch bản lệnh Jaql và chuyển nó thành một tập các công việc MapReduce.
Kết luận
MapReduce đã nổi lên như là một cách phổ biến để khai thác sức mạnh của các cụm máy tính lớn. Hiện nay, MapReduce dùng như một nền tảng cho một số lượng đáng kể các phân tích dữ liệu lớn. Nó cho phép các nhà lập trình suy nghĩ theo kiểu dữ liệu là trung tâm, ở đó họ có thể tập trung vào việc áp dụng các phép chuyển đổi cho các tập bản ghi dữ liệu trong khi các chi tiết thực hiện phân tán và khả năng chịu lỗi được quản lý trong suốt bởi khung công tác MapReduce. Trong thực tế, nhiều nhà lập trình thích sử dụng các ngôn ngữ khai báo bậc cao (hoặc như-SQL) để thực hiện các công việc phân tích dữ liệu quy mô lớn song song trong khi để lại tất cả các chi tiết tối ưu hóa thực hiện cho các công cụ phụ trợ. Trong bài này, bạn đã thấy một tổng quan tiên tiến về các giao diện khai báo bậc cao cho khung công tác MapReduce. Giảm thiểu gánh nặng lập trình của bạn với các sự trừu tượng hóa của ngôn ngữ bậc cao, cho phép các hệ thống bên dưới thực hiện các tối ưu hóa tự động ở mức thực hiện và cải thiện hiệu năng của các nhiệm vụ của người dùng.
Tài nguyên
Học tập
- Truy cập trang web Dự án Apache Hadoop để tìm hiểu về thư viện phần mềm này, đó là một khung công tác cho phép xử lý phân tán các bộ dữ liệu lớn trên các cụm máy tính khi sử dụng một mô hình lập trình đơn giản.
- Truy cập trang web Hệ thống tệp phân tán của Apache Hadoop (HDFS). HDFS là hệ thống lưu trữ chính được các ứng dụng Hadoop sử dụng.
- Truy cập trang web Dự án Pig của Apache để tìm hiểu về một nền tảng dùng để phân tích các bộ dữ liệu lớn gồm một ngôn ngữ bậc cao để biểu thị chương trình phân tích dữ liệu, được ghép với cơ sở hạ tầng để đánh giá các chương trình này.
- Truy cập trang web Dự án Hive của Apache. Hive là một hệ thống kho dữ liệu cho Hadoop, tạo điều kiện tóm tắt dữ liệu dễ dàng, các truy vấn đặc biệt và việc phân tích các bộ dữ liệu lớn được lưu trữ trong hệ thống tệp tương thích của Hadoop.
- Truy cập trang web phân phối Cloudera Apache Hadoop để tìm hiểu về gói phần mềm nguồn mở được thiết kế để phân tích tinh vi và chuyển đổi dữ liệu có cấu trúc và không cấu trúc phức tạp.
- Truy cập trang web Dự án HadoopDB để khám phá sự lai ghép kiến trúc này của các công nghệ MapReduce và DBMS cho các tải làm việc phân tích.
- Truy cập Hadapt - Trang web Nền tảng phân tích thích ứng và xem xét nền tảng dữ liệu lớn đầu tiên để kết hợp các lợi ích của công nghệ Apache Hadoop và công nghệ DBMS quan hệ thành một hệ thống độc lập cho các ứng dụng dựa trên phân tích dữ liệu nhiều cấu trúc. Hadapt được thiết kế cho đám mây và được tối ưu hóa cho các môi trường ảo hóa.
- Truy cập trang web Hệ thống dữ liệu Aster và tìm hiểu cách cung cấp dữ liệu của bạn.
- Truy cập trang web Jaql. Ngôn ngữ truy vấn Jacl, được thiết kế cho JavaScript Object Notation (JSON), chủ yếu được sử dụng để phân tích dữ liệu bán cấu trúc quy mô lớn.
- Đọc hướng dẫn MapReduce của Hadoop tại Apache.org.
- Sử dụng MapReduce và cân bằng tải trên đám mây (Kirpal A. Venkatesh, Kishorekumar Neelamegam và R. Revathy, developerWorks, 07.2010): Tìm hiểu cách thực hiện khung công tác MapReduce của Hadoop trong một môi trường đám mây và sử dụng việc cân bằng tải ảo để cải thiện hiệu năng của cả hệ thống một nút lẫn hệ thống nhiều nút.
- Bảng chú giải Dữ liệu lớn (Pete Warden, O'Reilly Media, ISBN: 1449314597, 09.2011): Khám phá số lượng lớn các công cụ dữ liệu mới có sẵn trong một tài liệu hướng dẫn mô tả 60 sáng kiến trong số những sáng kiến gần đây nhất.
- Hadoop: Hướng dẫn chính thức (Tom White, O'Reilly Media, ISBN: 1449389732, 09.2010) Khám phá cách Apache Hadoop có thể giải phóng sức mạnh dữ liệu của bạn.
- Lập trình Pig (Alan Gates, O'Reilly Media, ISBN: 1449302645, 09.2011): Đọc công cụ học tập này và tham khảo Apache Pig, một công cụ mã nguồn mở để thực hiện các luồng dữ liệu song song trên Hadoop.
- HadoopDB: Một sự lai ghép kiến trúc của các công nghệ MapReduce và DBMS cho Các tải làm việc phân tích (Azza Abouzeid và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (1), 08.2009): Bài báo này nghiên cứu tính khả thi của việc xây dựng một hệ thống lai, có được các tính năng tốt nhất từ cả hai công nghệ này.
- Jaql: Một Ngôn ngữ tạo kịch bản lệnh để Phân tích dữ liệu bán-cấu trúc quy mô lớn (Kevin S. Beyer và các cộng sự, Kỷ yếu của VLDB Endowment, 4 (9), 09.2011.
- MapReduce: Xử lý dữ liệu đơn giản hóa trên Các cụm lớn, Jeffrey Dean và Sanjay Ghemawat, OSDI, 2004
- SQL/MapReduce: Một cách tiếp cận thực tế với hàm do người dùng định nghĩa tự mô tả, đa hình và có khả năng song song hóa (Eric Friedman, Peter Pawlowski và John Cieslewicz, Kỷ yếu của VLDB Endowment, 2 (2), 2009): Đọc bài báo này, có mô tả động lực cho cách tiếp cận mới đến các UDF cũng như thực hiện trong cơ sở dữ liệu nCluster của AsterData Systems.
- Xây dựng một Hệ thống luồng dữ liệu mức cao trên đỉnh MapReduce: Trải nghiệm Pig, Alan Gates và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (2), 08.2009): Bài báo này mô tả các thách thức phải đối mặt với việc phát triển Pig và báo cáo các so sánh hiệu năng giữa việc thực hiện Pig và thực hiện Map-Reduce thô.
- Pig Latin: một ngôn ngữ quen thuộc để xử lý dữ liệu (Christopher Olston và các cộng sự, Hội nghị SIGMOD, 2008)
- So sánh các cách tiếp cận để phân tích dữ liệu quy mô lớn( Andrew Pavlo và các cộng sự, Hội nghị SIGMOD, 2009)
- MapReduce và các DBMS song song: bạn bè hay kẻ thù? (Michael Stonebraker và các cộng sự, Commun. ACM 53 (1), 2010)
- Hive - Giải pháp kho dữ liệu trên một khung Map- Reduce (Ashish Thusoo và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (2), 2009)
- Cơ sở hạ tầng phân tích và kho dữ liệu tại Facebook (Ashish Thusoo, Zheng Shao, Suresh Anthony, Dhruba Borthakur, Namit Jain, Joydeep Sen Sarma, Raghotham Murthyvà Hao Liu, Hội nghị SIGMOD, 2010): Bài này trình bày cách Scribe, Hadoop và Hive đã hợp lại với nhau và đã cho phép thực hiện một kho dữ liệu lưu trữ hơn 15PB dữ liệu (2,5PB sau khi nén) và tải nhiều hơn 60TB dữ liệu mới (10TB sau khi nén) mỗi ngày.
- Một khảo sát về Các cách tiếp cận quản lý dữ liệu quy mô lớn trong môi trường Đám mây (Sherif Sakr, Anna Liu, Daniel M Batista và Mohammad Alomari, Tạp chí các hướng dẫn và khảo sát truyền thông, 13 (3), 2011): Trong bài báo này, hãy tìm một khảo sát toàn diện về rất nhiều cách tiếp cận và cơ chế triển khai các ứng dụng chuyên về dữ liệu trong đám mây đang làm tăng nhiều động lực trong cả cộng đồng nghiên cứu lẫn cộng đồng công nghiệp phần mềm.
- Trong Vùng nguồn mở trên developerWorks, tìm thông tin hướng dẫn, các công cụ và các bản cập nhật dự án lớn để giúp bạn phát triển với các công nghệ nguồn mở và sử dụng chúng với các sản phẩm của IBM.
- Trên Vùng công nghệ của developerWorks, hãy tìm các bài báo, các hướng dẫn, các hội thảo và nhiều hơn nữa về mọi khía cạnh của lập trình Java.
- Theo sát với webcast và các sự kiện kỹ thuật của developerWorks được tập trung vào một loạt các sản phẩm của IBM và các chủ đề ngành công nghiệp công nghệ thông tin.
- Tham dự một lớp hướng dẫn developerWorks Live! miễn phí để tăng tốc độ nhanh chóng dựa trên 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.
- Nghe podcast trên developerWorks để biết các cuộc phỏng vấn và thảo luận thú vị dành cho các nhà phát triển phần mềm.
- Theo dõi developerWorks trên Twitter.
- Xem các trình diễn theo yêu cầu của developerWorks, trải rộng từ các trình diễn cài đặt và thiết lập sản phẩm cho người mới bắt đầu đến các chức năng nâng cao cho các nhà phát triển có kinh nghiệm.
Lấy sản phẩm và công nghệ
- Nhận Hadoop 0.20.1 từ Apache.org.
- Nhận Pig từ Apache.org.
- Nhận Hadoop MapReduce.
- Nhận Hadoop HDFS.
- Truy cập Phần mềm dùng thử của IBM (có sẵn để tải về hoặc trên đĩa DVD) và đổi mới dự án phát triển nguồn mở tiếp theo của bạn bằng cách sử dụng phần mềm chủ yếu dành cho các nhà phát triển.
Thảo luận
- Kết nối với những người dùng developerWorks khác trong khi khám phá các blog, các diễn đàn, các nhóm và các wiki dựa vào-nhà phát triển. Giúp xây dựng nhóm Nguồn mở thế giới thực trong cộng đồng developerWorks.
Bình luận
-
Vùng dữ liệu trên developerWorks
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
-
Vùng mã nguồn mở trên developerWorks
Xem các bài viết về HTML, CSS, JavaScript,...
-
Điện toán đám mây
Tìm hiểu về điện toán đám mây

markdown:
## Giới thiệu
Trong hai thập kỷ vừa qua, sự gia tăng ổn định về công suất tính toán đã tạo ra một luồng dữ liệu rộng lớn, mà dần dần đã dẫn đến một sự thay đổi hình mẫu trong kiến trúc điện toán và các cơ chế xử lý dữ liệu quy mô lớn. Ví dụ, các kính viễn vọng mạnh mẽ trong thiên văn học, các máy gia tốc hạt trong vật lý và các bộ gen trong sinh học trao khối dữ liệu khổng lồ vào tay các nhà khoa học. Facebook thu thập 15 terabyte dữ liệu mỗi ngày vào một kho dữ liệu quy mô Petabyte. Nhu cầu về khai phá dữ liệu quy mô lớn và các ứng dụng phân tích dữ liệu ngày càng tăng trong cả ngành công nghiệp phần mềm (ví dụ, phân tích dữ liệu web, phân tích luồng nhấn chuột và phân tích bản ghi nhật ký giám sát-mạng) lẫn các ngành khoa học (ví dụ, phân tích dữ liệu do các bộ mô phỏng quy mô rất lớn tạo ra, triển khai bộ cảm biến và thiết bị phòng thí nghiệm có thông lượng cao). Mặc dù các hệ thống cơ sở dữ liệu song song có lợi cho một số các ứng dụng phân tích dữ liệu này, nhưng chúng rất đắt tiền, khó quản lý và thiếu khả năng chịu lỗi với các truy vấn chạy lâu dài.
MapReduce là một khung công tác được Google giới thiệu cho việc lập trình các cụm máy tính thương mại để thực hiện xử lý dữ liệu quy mô lớn trong một lần chạy. Khung công tác này được thiết kế theo cách mà một cụm MapReduce có thể mở rộng đến hàng ngàn các nút về mặt khả năng chịu lỗi. Nhưng mô hình lập trình MapReduce có những hạn chế riêng của mình. Luồng dữ liệu một đầu vào và hai tầng của nó vô cùng cứng nhắc, ngoài thực tế là nó ở bậc rất thấp. Ví dụ, bạn phải viết mã tùy chỉnh cho ngay cả những hoạt động phổ biến nhất. Do đó, nhiều nhà lập trình cảm thấy khó chịu với khung công tác MapReduce và thích sử dụng SQL như một ngôn ngữ khai báo bậc cao. Một số dự án (Apache Pig, Apache Hive và HadoopDB) đã được phát triển để giảm bớt nhiệm vụ của các nhà lập trình và cung cấp các giao diện khai báo mức cao trên đỉnh của khung công tác MapReduce.
Trước hết hay xem xét khung công tác MapReduce và sau đó xem xét các khả năng của các hệ thống khác nhau cung cấp các giao diện bậc cao cho khung công tác MapReduce.
## Khung công tác MapReduce
Một lợi thế chính về cách tiếp cận của khung công tác MapReduce là ở chỗ nó tách các ứng
dụng ra khỏi các chi tiết về chạy một chương trình phân tán, chẳng hạn như các vấn đề về
phân phối dữ liệu, lập lịch biểu và khả năng chịu lỗi. Trong mô hình này, việc tính toán lấy
một tập các cặp giá trị/khóa đầu vào và tạo ra một tập các cặp giá trị/khóa đầu ra. Người
dùng khung công tác MapReduce biểu thị tính toán này bằng cách sử dụng hai hàm:
Map (Ánh xạ) và
Reduce (Giảm). Hàm
Map lấy một cặp đầu vào và tạo ra một tập các cặp giá trị/khóa trung
gian. Khung công tác MapReduce nhóm lại với nhau tất cả các giá trị trung gian gắn liền với
khóa trung gian giống nhau
I (luôn thay đổi) và chuyển chúng cho
hàm
Reduce. Hàm
reduce nhận một khóa
trung gian
I với tập các giá trị của nó và kết hợp chúng lại với
nhau. Thông thường, chỉ có giá trị đầu ra không hoặc một được tạo ra cho mỗi lần gọi hàm
reduce. Lợi thế chính của mô hình này là ở chỗ nó cho phép các
tính toán lớn được song song hóa và được thực hiện lại dễ dàng để sử dụng nó như là cơ chế
chính về khả năng chịu lỗi.
Dự án Hadoop của Apache (Apache Hadoop) là phần mềm Java™ nguồn mở hỗ trợ các ứng dụng phân tán chuyên về dữ liệu bằng cách thực hiện việc triển khai khung công tác MapReduce. Ban đầu nó được Yahoo! phát triển như một bản sao của cơ sở hạ tầng MapReduce của Google nhưng sau đó đã trở thành nguồn mở. Hadoop quan tâm đến việc chạy mã của bạn trên một cụm các máy tính. Nói chung, khi một tập dữ liệu lớn hơn dung lượng lưu trữ của một máy tính vật lý đơn lẻ, việc phân vùng nó trên một số máy tính riêng biệt trở nên cần thiết. Các hệ thống tệp quản lý lưu trữ trên một mạng các máy tính được gọi là các hệ thống tệp phân tán. Hadoop đi kèm với một hệ thống tệp phân tán được gọi là HDFS (Hệ thống tệp phân tán Hadoop). Cụ thể là, HDFS là một hệ thống tệp phân tán lưu trữ các tệp trên tất cả các nút trong một cụm Hadoop. Nó chia tách các tệp thành các khối lớn và phân phối chúng trên các máy tính khác nhau, cộng với việc tạo nhiều bản sao của mỗi khối sao cho nếu có một máy tính bị hỏng, thì không có dữ liệu nào bị mất.
Chương trình MapReduce trong
[Liệt kê 1](#list1) được
biểu diễn bằng mã-giả (pseudo-code) để đếm số các lần xuất hiện của mỗi từ trong một chuỗi
các dòng văn bản. Trong Liệt kê 1, hàm
map phát ra mỗi từ cộng với một dấu hiệu liên quan của các lần xuất hiện trong khi
hàm
reduce cộng tất cả các dấu hiệu đã phát ra với một từ cụ
thể.
##### Liệt kê 1. Chương trình MapReduce
map(String key, String value): //key: line number, value: line text for each word w in value: EmitIntermediate(w, ?1?); reduce(String key, Iterator values): //key: a word, values: a list of counts int wordCount = 0; for each v in values: wordCount += ParseInt(v); Emit(AsString(wordCount));
Bây giờ giả sử chuỗi đầu vào của dòng văn bản trong
[Liệt kê 2](#list2).
##### Liệt kê 2. Chuỗi đầu vào
1, This is Code Example 2, Example Color is Red 3, Car Color is Green
[Liệt kê 3](#list3) cho thấy kết quả đầu ra của hàm
map của đầu vào này.
##### Liệt kê 3. Kết quả đầu ra của hàm
map
('This', 1), ('is', 1). ('Code', 1), ('Example', 1) ('Example', 1), ('Color', 1), ('is', 1), ('Red', 1) ('Car', 1), ('Color', 1), ('is', 1), ('Green', 1)
[Liệt kê 4](#list4) cho thấy kết quả đầu ra của hàm
reduce (kết quả).
##### Liệt kê 4. Kết quả đầu ra của hàm
reduce
('Car', 1), ('Code', 1), ('Color', 2), ('Example', 2), ('Green', 1), ('Red', 1) , ('This', 1), ('is', 3)
Với các nhà lập trình, một tính năng quan trọng của khung công tác MapReduce là chỉ có hai
nguyên hàm khai báo bậc cao (là
map và
reduce) có thể được viết bằng bất kỳ ngôn ngữ lập trình nào được chọn mà không cần
lo lắng về các chi tiết thực hiện song song của chúng. Mặt khác, mô hình lập trình MapReduce
có những hạn chế riêng của mình:
- Luồng dữ liệu một đầu vào và hai tầng của nó vô cùng cứng nhắc. Để thực hiện các nhiệm vụ có một luồng dữ liệu khác nhau (ví dụ, các phép nối hoặc n giai đoạn), bạn phải nghĩ ra các cách giải quyết không nhàm chán khác.
- Mã tùy chỉnh được viết cho ngay cả những hoạt động phổ biến nhất (ví dụ, phép chiếu và lọc), dẫn đến mã thường khó sử dụng lại và bảo trì.
- Tính chất không trong suốt của các hàm
mapvà
reducecản trở khả năng của hệ thống để thực hiện các tối ưu hóa.
Hơn nữa, nhiều nhà lập trình chưa quen với khung công tác MapReduce và thích sử dụng SQL (vì họ thành thạo hơn về nó) như là một ngôn ngữ khai báo bậc cao để biểu thị nhiệm vụ của họ trong khi để lại tất cả các chi tiết tối ưu hóa thực hiện cho các công cụ phụ trợ. Ngoài ra, cũng đúng là các sự trừu tượng hóa của ngôn ngữ bậc cao cho phép hệ thống bên dưới thực hiện tốt hơn các tối ưu hóa tự động.
Hãy xem xét các ngôn ngữ và các hệ thống được thiết kế để giải quyết các vấn đề này và thêm hương vị SQL trên đỉnh của khung công tác MapReduce.
## Pig
Dự án Pig của Apache (Apache Pig) được thiết kế như một công cụ để thực hiện các luồng dữ liệu song song trên Hadoop. Nó sử dụng một ngôn ngữ, được gọi là Pig Latin để biểu diễn các luồng dữ liệu này. Với Pig Latin, bạn có thể mô tả cách dữ liệu từ một hoặc nhiều đầu vào cần đọc, xử lý và sau đó lưu trữ tới một hoặc nhiều đầu ra song song. Ngôn ngữ này lấy một vị trí trung gian giữa việc biểu diễn các nhiệm vụ khi sử dụng mô hình truy vấn khai báo bậc cao theo cách của SQL và lập trình theo thủ tục/bậc thấp khi sử dụng MapReduce. Các luồng dữ liệu Pig Latin có thể là các luồng tuyến tính đơn giản, nhưng cũng có thể là các luồng công việc phức tạp gồm nhiều điểm nối đến nhiều đầu vào và phân chia dữ liệu thành nhiều luồng để được xử lý bằng các toán tử khác nhau.
Một chương trình Pig Latin gồm có một loạt các hoạt động hoặc các phép chuyển đổi, được áp dụng cho dữ liệu đầu vào để tạo ra kết quả đầu ra. Nói chung, các hoạt động mô tả một luồng dữ liệu mà môi trường thực hiện của Pig chuyển nó thành một biểu diễn có thể thực hiện được và sau đó được thực hiện. Ở dưới các vỏ bọc này, Pig chuyển các phép chuyển đổi thành một loạt các công việc MapReduce.
Với Pig, các cấu trúc dữ liệu phong phú hơn nhiều, thường là nhiều giá trị và lồng nhau; và bộ các phép chuyển đổi, mà bạn có thể áp dụng cho các dữ liệu, mạnh hơn rất nhiều. Cụ thể là, mô hình dữ liệu Pig Latin gồm bốn kiểu sau:
*Atom*(Nguyên tử) là một giá trị nguyên tử đơn giản như là một chuỗi hoặc một số, ví dụ, "John". *Tuple*(Bộ dữ liệu) là một chuỗi các trường, mỗi trường có thể là bất kỳ kiểu dữ liệu nào, ví dụ, ("John", "Melbourne"). *Bag*(Túi) là một bộ sưu tập về các bộ dữ liệu với các bản sao có thể. Lược đồ của các bộ dữ liệu hợp thành rất linh hoạt ở đó không phải tất cả các bộ dữ liệu trong một túi cần phải có cùng số lượng và kiểu trường giống nhau. Túi trong [Hình 1](#fig1)liệt kê hai bộ dữ liệu : ("John","Melbourne") và "Alice",("UNSW" "Sydney").
##### Hình 1. Một Túi (Bag)
*Map*(Ánh xạ) là một bộ sưu tập về các mục dữ liệu, nơi mà mỗi mục có một mã khóa liên kết mà có thể tìm kiếm mục này thông qua khóa đó. Như với các túi, lược đồ của các mục dữ liệu hợp thành rất linh hoạt, tuy nhiên, các khóa được yêu cầu là các nguyên tử dữ liệu > Map trong [Hình 2](#fig2)liệt kê các mục dữ liệu: K1-->("John","Melbourne") và K2-->30.
##### Hình 2. Một ánh xạ (Map)
Pig Latin gồm các toán tử cho nhiều hoạt động dữ liệu truyền thống (
join,
sort,
filter,
group by,
union, và v.v..), cũng như khả
năng cho những người dùng phát triển các hàm riêng của họ để đọc, xử lý và ghi dữ liệu.
MapReduce cung cấp hoạt động group by (nhóm bởi) trực tiếp (về cơ bản trong đó là sự sắp
xếp cộng với các giai đoạn giảm) và nó cung cấp hoạt động order by (sắp xếp bởi) gián tiếp
thông qua cách mà nó thực hiện tạo nhóm. Bộ lọc và phép chiếu có thể được thực hiện không
đáng kể trong giai đoạn ánh xạ. Tuy nhiên, các toán tử khác, đặc biệt là phép nối, không
được cung cấp và thay vào đó phải do người dùng viết ra. Pig cung cấp một số cách thực hiện
quan trọng, phức tạp về các hoạt động dữ liệu tiêu chuẩn. Ví dụ, vì số các bản ghi cho mỗi
khóa trong một bộ dữ liệu hiếm khi được phân bố đều, nên dữ liệu được gửi đến các bộ giảm
(reducer) thường bị sai lệch. Đó là, một bộ giảm sẽ nhận được dữ liệu nhiều hơn gấp 10 lần
hoặc lớn hơn nữa so với các bộ giảm khác. Pig có các toán tử join và order by sẽ xử lý
trường hợp này và (trong một số trường hợp) cân bằng lại các bộ giảm.
[Bảng 1](#table1) mô tả các toán tử chính của ngôn ngữ Pig Latin.
Trong MapReduce, việc xử lý dữ liệu bên trong giai đoạn ánh xạ và giảm là không trong suốt với một hệ thống. Điều này có nghĩa là MapReduce không có cơ hội để tối ưu hóa hoặc kiểm tra mã của người dùng. Trái lại, Pig có thể phân tích một kịch bản lệnh Pig Latin và hiểu luồng dữ liệu mà người dùng đang mô tả. MapReduce không có một hệ thống kiểu. Đây là cố ý và nó mang lại cho người dùng sự linh hoạt để sử dụng các kiểu dữ liệu và khung công tác tuần tự riêng của họ. Nhưng nhược điểm là ở chỗ điều này hạn chế nhiều hơn khả năng của hệ thống trong việc kiểm tra mã của người dùng với các lỗi xảy ra trước và trong thời gian chạy. Tất cả những điểm này có nghĩa là Pig Latin có chi phí viết và bảo trì mã thấp hơn nhiều so với mã Java dùng cho MapReduce.
##### Bảng 1. Các toán tử chính của ngôn ngữ Pig Latin
|Toán tử||Mô tả|
|LOAD||Tải dữ liệu từ hệ thống tệp hoặc thiết bị lưu trữ khác vào một quan hệ|
|DUMP||In một quan hệ tới giao diện điều khiển hệ thống FILTER|
|DISTINCT||Loại bỏ các hàng trùng lặp khỏi một quan hệ|
|FOREACH ... GENERATE||Thêm hoặc loại bỏ các trường khỏi một quan hệ|
|JOIN||Nối hai hoặc nhiều quan hệ|
|ORDER||Sắp xếp một quan hệ theo một hoặc nhiều trường|
|LIMIT||Hạn chế kích cỡ của một quan hệ đến một số lượng các bộ dữ liệu tối đa|
|STORE||Lưu một quan hệ vào hệ thống tệp hoặc thiết bị lưu trữ khác|
|FILTER||Loại bỏ các hàng không mong muốn khỏi một quan hệ|
|GROUP||Nhóm dữ liệu vào một quan hệ duy nhất|
|CROSS||Tạo ra sản phẩm giao cắt qua hai hoặc nhiều quan hệ|
|UNION||Kết hợp hai hoặc nhiều quan hệ vào một quan hệ|
|SPLIT||Chia tách một quan hệ thành hai hoặc nhiều quan hệ|[Liệt kê 5](#list5) cho thấy một chương trình Pig Latin
đơn giản để tìm tất cả các nhân viên có mức lương cao.
##### Liệt kê 5. Tìm tất cả các nhân viên có mức lương cao
employees = LOAD 'employee.txt' AS (id, name, salary); highSalary = FILTER employees BY salary > 100000; sortedList = ORDER highSalary BY salary DESC; STORE sortedList INTO ' highSalary _Emp'; DUMP sortedList;
Trong ví dụ này, trước tiên tải tệp đầu vào vào một túi (bag) có tên là employees (các nhân viên). Sau đó, tạo ra một túi mới được gọi là highSalary (lương cao), trong đó có các bản ghi nào có trường tiền lương lớn hơn 100.000. Túi SortedList cung cấp các bản ghi đã lọc dựa vào giá trị tiền lương theo một thứ tự giảm dần. Cuối cùng, viết các nội dung của túi SortedList vào HDFS và in nội dung túi đó trên màn hình.
[Liệt kê 6](#list6) cho thấy cách mô tả dễ dàng các hoạt
động nối
join bằng cách sử dụng Pig Latin.
##### Liệt kê 6.
các hoạt động nối join có thể dễ
dàng được mô tả bằng cách sử dụng Pig Latin
employees = LOAD 'employee.txt' AS (id, name, salary, dept); departments = LOAD 'dept.txt' AS (deptID, deptName); joinList = JOIN employees BY dept, departments BY deptID; STORE joinList INTO ' joinFile';
Theo truyền thống, các truy vấn đặc biệt được thực hiện bằng các ngôn ngữ chẳng hạn như SQL giúp dễ dàng tạo nhanh một câu hỏi cho dữ liệu cần trả lời. Để nghiên cứu dữ liệu thô, một số người dùng thích Pig Latin hơn. Vì Pig có thể hoạt động trong tình huống ở đó giản đồ không rõ, không đầy đủ hoặc không phù hợp và bởi vì nó có thể dễ dàng quản lý dữ liệu lồng nhau, các nhà nghiên cứu, những người muốn tiếp tục làm việc với dữ liệu trước khi nó bị xóa và được tải vào kho dữ liệu, thường thích Pig hơn. Các nhà nghiên cứu làm việc với các bộ dữ liệu lớn thường sử dụng ngôn ngữ tạo kịch bản lệnh như Perl hoặc Python để thực hiện việc xử lý của họ. Những người dùng với các nền tảng này thường thích mô hình luồng dữ liệu của Pig trên mô hình truy vấn khai báo của SQL.
## Hive
Dự án Hive của Apache (Apache Hive) là một giải pháp kho dữ liệu nguồn mở được Nhóm Cơ sở hạ tầng dữ liệu của Facebook xây dựng trên đỉnh của môi trường Hadoop. Mục tiêu chính của dự án này là mang đến các khái niệm cơ sở dữ liệu quan hệ quen thuộc (ví dụ, các bảng, các cột, các phân vùng) và một tập con của SQL cho thế giới không cấu trúc của Hadoop, trong khi vẫn duy trì tính mở rộng và tính linh hoạt mà Hadoop đã có được. Vì vậy, nó hỗ trợ tất cả các kiểu nguyên thủy chính (ví dụ, số nguyên, các float, các chuỗi) cũng như các kiểu phức tạp (ví dụ, các ánh xạ, các danh sách, các cấu trúc). Hive hỗ trợ các truy vấn được thể hiện theo một ngôn ngữ khai báo giống như SQL, là HiveQL (Hive Query Language – Ngôn ngữ truy vấn Tổ ong) và do đó bất cứ ai đã quen thuộc với SQL đều có thể hiểu dễ dàng. Các truy vấn này tự động biên dịch thành các công việc MapReduce được thực hiện bằng cách sử dụng Hadoop. Ngoài ra, HiveQL cho phép những người dùng kết hợp các kịch bản lệnh MapReduce tùy chỉnh vào các truy vấn.
HiveQL hỗ trợ các câu lệnh của DDL (Data Definition Language - Ngôn ngữ định nghĩa dữ
liệu), mà bạn có thể sử dụng để tạo, xóa và thay đổi các bảng trong cơ sở dữ liệu. Nó cho
phép những người dùng tải dữ liệu từ các nguồn bên ngoài và chèn các kết quả truy vấn vào
các bảng Hive thông qua việc tải và chèn các câu lệnh DML (Data Manipulation Language - Ngôn
ngữ xử lý dữ liệu), tương ứng. Tuy nhiên, HiveQL hiện không hỗ trợ cập nhật và xóa các hàng
trong các bảng hiện có (cụ thể là các câu lệnh
INSERT INTO,
UPDATE và
DELETE), mà chúng cho phép sử
dụng các cơ chế rất đơn giản để giải quyết các hoạt động đọc và viết đồng thời mà không cần
thực hiện các giao thức tạo khóa phức tạp. Các thành phần của siêu kho lưu trữ (metastore)
là danh mục hệ thống của Hive, lưu trữ siêu dữ liệu về các bảng bên dưới. Siêu dữ liệu này
được quy định trong quá trình tạo bảng và được sử dụng lại mỗi khi tham khảo bảng đó trong
HiveQL. Siêu kho dữ liệu phân biệt Hive như một giải pháp kho dữ liệu truyền thống khi được
so sánh với các hệ thống xử lý dữ liệu tương tự được xây dựng trên đỉnh của kiến trúc
giống-MapReduce như Pig Latin.
[Liệt kê 7](#list7) cho thấy các ví dụ về các câu lệnh
HiveQL đang mô tả các hoạt động để tạo một bảng, nạp dữ liệu và truy vấn các nội dung của
bảng đó.
##### Liệt kê 7. Các câu lệnh HiveQL đang mô tả các hoạt động để tạo ra một bảng, tải dữ liệu và truy vấn các nội dung của bảng đó
CREATE TABLE employee (empID INT, name STRING, salary BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; LOAD DATA INPATH "employee_data" INTO TABLE employee; SELECT * FROM employee WHERE salary > 100000 SORT BY salary DESC;
Hive cũng hỗ trợ xử lý dữ liệu thông qua các hàm do người dùng tạo ra (xem
[Liệt kê 8](#list8)).
##### Liệt kê 8. Hive hỗ trợ xử lý dữ liệu thông qua các hàm do người dùng tạo ra
INSERT OVERWRITE TABLE employee SELECT TRANSFORM (empID, name, salary, address, department) USING 'python employee_mapper.py' AS (empID, name, salary, city) FROM employee_data;
Nói chung, Hive là một giao diện rất tốt cho bất cứ ai dựa vào thế giới cơ sở dữ liệu quan
hệ, mặc dù các chi tiết của việc thực hiện bên dưới không hoàn toàn được ẩn dấu. Bạn vẫn
phải lo lắng về một số sự khác biệt trong những thứ như là cách tối ưu nhất để quy định các
phép nối cho hiệu năng tốt nhất và một số tính năng ngôn ngữ còn thiếu. Hive cung cấp khả
năng để kết hợp mã tùy chỉnh cho các tình huống không khớp với SQL, cũng như rất nhiều công
cụ để xử lý đầu vào và đầu ra. Hive bị một số hạn chế như nó thiếu hỗ trợ cho các câu lệnh
UPDATE hay
DELETE, việc
INSERT (chèn) các hàng đơn và các kiểu dữ liệu ngày tháng hoặc thời
gian, do chúng được xử lý như các chuỗi.
## HadoopDB
Dự án HadoopDB, được công ty Hadapt thương mại hóa, là một hệ thống lai cố gắng kết hợp những lợi thế về khả năng mở rộng của MapReduce với những lợi thế về hiệu năng và hiệu quả của các cơ sở dữ liệu song song. Ý tưởng cơ bản đằng sau HadoopDB là để kết nối nhiều hệ thống cơ sở dữ liệu có nút đơn (PostgreSQL) bằng cách sử dụng Hadoop làm bộ điều phối nhiệm vụ và tầng giao tiếp mạng. Các truy vấn được thể hiện trong SQL, nhưng việc triển khai của chúng được song song hóa trên các nút bằng cách sử dụng khung công tác MapReduce sao cho công việc truy vấn đơn lẻ được mở rộng, càng nhiều càng tốt, vào cơ sở dữ liệu nút tương ứng.
Nói chung, các hệ thống cơ sở dữ liệu thương mại song song đã có sẵn trong gần hai thập kỷ và hiện nay có khoảng một chục các công cụ khác nhau trên thị trường (ví dụ Teradata, Aster Data, Greenplum). Mục đích chính của các hệ thống này là để cải thiện hiệu năng thông qua việc thực hiện song song các hoạt động khác nhau như tải dữ liệu, xây dựng các chỉ mục và đánh giá các truy vấn. Nói chung, một số lý do chủ yếu làm cho MapReduce trở thành một cách tiếp cận được ưa thích hơn trên một RDBMS song song trong một số kịch bản:
- Định dạng và tải một số lượng dữ liệu rất lớn vào một RDBMS song song kịp thời là một nhiệm vụ đầy thử thách và tốn thời gian.
- Các bản ghi dữ liệu đầu vào có thể không phải luôn theo cùng một lược đồ. Các nhà phát triển thường cần có sự linh hoạt để thêm và bớt các thuộc tính và việc giải thích một bản ghi dữ liệu đầu vào cũng có thể thay đổi theo thời gian.
- Việc xử lý dữ liệu quy mô lớn có thể rất tốn thời gian và vì thế điều quan trọng là giữ cho công việc phân tích tiếp diễn ngay cả trong trường hợp hỏng hóc. Trong khi hầu hết các RDBMS song song đều có sự hỗ trợ khả năng chịu lỗi, một truy vấn thường được khởi động lại từ đầu ngay cả khi một nút trong cụm bị hỏng. Ngược lại, MapReduce xử lý hấp dẫn hơn các hỏng hóc và có thể khởi động lại chỉ một phần của tính toán đã bị mất do hỏng hóc này gây ra.
Sự so sánh giữa khung công tác MapReduce và các hệ thống cơ sở dữ liệu song song là một cuộc tranh luận đã có từ lâu rồi. Một sự so sánh quy mô lớn giữa việc thực hiện Hadoop của khung công tác MapReduce và các hệ thống quản lý cơ sở dữ liệu SQL song song về hiệu năng và độ phức tạp phát triển đã được tiến hành. Các kết quả của sự so sánh này cho thấy các hệ thống cơ sở dữ liệu song song đã hiển thị một lợi thế hiệu năng đáng kể so với MapReduce trong việc thực hiện một loạt các nhiệm vụ phân tích tập trung vào dữ liệu. Mặt khác, việc thực hiện Hadoop đã dễ dàng hơn và đơn giản hơn để thiết lập và sử dụng so với các hệ thống cơ sở dữ liệu song song. MapReduce cũng đã cho thấy là có hiệu năng cao hơn trong việc giảm thiểu số lượng công việc bị mất khi xảy ra một lỗi phần cứng. Ngoài ra, MapReduce (với việc triển khai nguồn mở của nó) đại diện cho một giải pháp rất rẻ so với các giải pháp DBMS song song rất tốn kém về mặt tài chính.
Ban đầu, các ứng dụng chính của khung công tác MapReduce đã tập trung vào việc phân tích các bộ dữ liệu không cấu trúc rất lớn như là: tạo chỉ mục web, các phân tích văn bản và khai phá dữ liệu đồ thị. Gần đây, khi MapReduce phát triển vững chắc thành các tiêu chuẩn phân tích dữ liệu trên thực tế, nó được sử dụng liên tục để truy vấn dữ liệu có cấu trúc. Trong một thời gian dài, cơ sở dữ liệu quan hệ đã chi phối các việc triển khai các hệ thống kho dữ liệu và hiệu năng của các công việc phân tích dựa vào dữ liệu có cấu trúc. Sự quan tâm đang tăng lên trong việc kết hợp MapReduce và các hệ thống cơ sở dữ liệu truyền thống để duy trì những lợi ích của cả hai thế giới này. Cụ thể là, HadoopDB cố gắng để đạt được khả năng chịu lỗi và khả năng hoạt động trong môi trường không đồng nhất bằng cách kế thừa việc thực hiện lập lịch biểu và việc thực hiện theo dõi công việc từ Hadoop. Nó cố gắng để đạt được các lợi ích hiệu năng của cơ sở dữ liệu song song bằng cách thực hiện hầu hết việc xử lý truy vấn bên trong công cụ cơ sở dữ liệu.
[Hình 3](#fig3)minh họa kiến trúc của HadoopDB gồm có
hai tầng: 1) Một tầng lưu trữ dữ liệu hoặc HDFS và 2) Một tầng xử lý dữ liệu hoặc khung công
tác MapReduce.
##### Hình 3. Kiến trúc của HadoopDB
![ Biểu đồ kiến trúc của HadoopDB](fig03.gif)
Trong kiến trúc này, HDFS là một hệ thống tệp có cấu trúc-khối do một Name Node (Nút Tên) trung tâm quản lý. Các tệp riêng lẻ được chia thành các khối có kích cỡ cố định và được phân phối trên nhiều Data Node (Nút dữ liệu) trong cụm. Name Node duy trì siêu dữ liệu về kích cỡ và vị trí của các khối cũng như các bản sao của chúng. Khung công tác MapReduce theo một kiến trúc chủ-khách (master-slave) đơn giản. Chủ là một Job Tracker (Bộ theo dõi Công việc) đơn và các khách hoặc các nút công nhân là các Task Tracker (Bộ theo dõi Nhiệm vụ). Job Tracker xử lý lập lịch biểu thời gian chạy của các công việc của MapReduce và duy trì thông tin về mỗi tải của Task Tracker và tài nguyên sẵn có. Database Connector (Các bộ nối cơ sở dữ liệu) là giao diện giữa các hệ thống cơ sở dữ liệu độc lập lưu trữ trên các nút trong cụm và các Task Tracker. Connector (Bộ nối) kết nối tới cơ sở dữ liệu, thực hiện truy vấn SQL và trả về các kết quả là các cặp giá trị-khóa. Thành phần Catalog (Danh mục) duy trì siêu dữ liệu về các cơ sở dữ liệu, vị trí của chúng, các vị trí của bản sao và các đặc tính phân vùng dữ liệu. Thành phần Data Loader (Bộ tải dữ liệu) chịu trách nhiệm về toàn bộ dữ liệu phân vùng lại trên một khóa phân vùng cụ thể khi tải và chia tách dữ liệu nút đơn thành nhiều phân vùng nhỏ hơn hoặc các khối. SMS planner (Bộ lập kế hoạch SMS) mở rộng HiveQL translator (Bộ phiên dịch HiveQL) và chuyển đổi SQL thành các công việc MapReduce kết nối đến các bảng được lưu trữ như các tệp trong HDFS.
## Jaql
Jaql là một ngôn ngữ truy vấn được thiết kế cho JSON (JavaScript Object Notation – Ký pháp
đối tượng JavaScript), một định dạng dữ liệu phổ biến do tính đơn giản và tính linh hoạt mô
hình hóa của nó. JSON là một cách đơn giản nhưng linh hoạt để biểu diễn dữ liệu trải rộng từ
dữ liệu bằng phẳng đến dữ liệu XML bán-cấu trúc. Trước tiên, Jaql được sử dụng để phân tích
dữ liệu bán cấu trúc quy mô lớn. Nó là một ngôn ngữ truy vấn khai báo, theo chức năng, viết
lại các truy vấn bậc cao, khi thích hợp, thành một truy vấn bậc thấp gồm có các công việc
Map-Reduce được đánh giá bằng cách sử dụng dự án Apache Hadoop. Các tính năng cốt lõi gồm
khả năng mở rộng người dùng và xử lý song song. Jaql có một ngôn ngữ kịch bản lệnh và trình
biên dịch, cũng như một thành phần thời gian chạy. Nó có thể xử lý hoặc là không có lược đồ
hoặc chỉ có một lược đồ một phần. Tuy nhiên, Jaql cũng có thể khai thác thông tin lược đồ
cứng nhắc khi nó có sẵn, cho cả hai loại hiệu năng đang kiểm tra và hiệu năng được cải
thiện. Đoạn mã sau trong
[Liệt kê 9](#list9) cho thấy một
tài liệu JSON mẫu.
##### Liệt kê 9. Một tài liệu mẫu JSON
[ { id: 10, name: "Joe Smith", email: "JSmith@email.com", zip: 85150 }, { id: 20, name: "Alice Jones", email: "AJones@email.com", zip: 82116 } ]
Jaql sử dụng một mô hình dữ liệu rất đơn giản, một giá trị JDM (Jaql Data Model - Mô hình
dữ liệu Jaql) hoặc là một nguyên tử, một mảng hoặc một bản ghi. Hầu hết các kiểu nguyên tử
phổ biến được hỗ trợ, gồm các chuỗi, các số, các giá trị null và các ngày tháng. Các mảng và
các bản ghi là các kiểu hỗn hợp có thể được lồng nhau tùy ý. Chi tiết hơn, một mảng là một
bộ sưu tập các giá trị có thứ tự và có thể được sử dụng để mô hình hóa các cấu trúc dữ liệu
như các véc tơ, các danh sách, các bộ hoặc các túi (bag). Một bản ghi là một bộ sưu tập các
cặp giá trị-tên không theo thứ tự và có thể mô hình hóa các cấu trúc, các từ điển và các ánh
xạ. Dù có tính đơn giản, nhưng JDM rất linh hoạt. Nó cho phép Jaql hoạt động với một loạt
các biểu diễn dữ liệu khác nhau cho cả đầu vào lẫn đầu ra, gồm cả các tệp văn bản định giới,
các tệp JSON, các tệp nhị phân, các tệp trình tự (Sequence File) của Hardtop, các cơ sở dữ
liệu quan hệ, các kho giá trị-khóa hoặc các tài liệu XML. Các hàm là các giá trị hạng nhất
trong Jaql. Chúng có thể được gán cho một biến và là bậc cao trong đó chúng có thể được
chuyển giao như các tham số hoặc được sử dụng như là một giá trị trả về. Các hàm là thành
phần quan trọng cho khả năng sử dụng lại do bất kỳ biểu thức Jaql nào đều có thể được gói
gọn trong một hàm và một hàm có thể được tham số hóa theo những cách mạnh mẽ.
[Liệt kê 10](#list10) là một ví dụ về một kịch bản lệnh Jaql
có một chuỗi các toán tử.
##### Liệt kê 10. Các kịch bản lệnh Jaql có một chuỗi các các toán tử
import myrecord; countFields = fn(records) ( records -> transform myrecord::names($) -> expand -> group by fName = $ as occurrences into { name: fName, num: count(occurrences) } ); read(hdfs("docs.dat")) -> countFields() -> write(hdfs("fields.dat"));
Toán tử read (đọc) tải dữ liệu thô, trong trường hợp này từ HDFS (Hadoop Distributed File
System – Hệ thống tệp phân tán Hadoop) và chuyển đổi nó thành các giá trị Jaql. Các giá trị
này được luồng con countFields xử lý, mà luồng con này trích xuất các tên trường và tính
toán các tần số của chúng. Cuối cùng, toán tử write (ghi) lưu trữ kết quả vào lại HDFS.
[Bảng 2](#table2) mô tả các biểu thức cốt lõi của ngôn
ngữ kịch bản lệnh Jaql.
##### Bảng 2. Các biểu thức cốt lõi của ngôn ngữ kịch bản lệnh Jaql
|Biểu thức||Mô tả|
|transform||Biểu thức transform (chuyển đổi) áp dụng một hàm (hoặc phép chiếu) cho mọi phần tử của một mảng để tạo ra một mảng mới.|
|expand||Biểu thức expand (mở rộng) hầu như thường được sử dụng để lấy ra mảng đầu vào của nó.|
|group by||Tương tự như GROUP BY trong SQL, biểu thức group by trong Jaql phân vùng đầu vào của nó dựa vào một biểu thức phân nhóm và áp dụng một biểu thức tổng hợp cho mỗi nhóm.|
|Filter||Biểu thức filter (bộ lọc) giữ lại các giá trị đầu vào mà một vị từ cụ thể đánh giá các giá trị là đúng.|
|Join||Biểu thức join (nối) hỗ trợ equijoin (nối thiết bị) của 2 hoặc nhiều đầu vào hơn. Tất cả các tùy chọn các phép nối bên trong và bên ngoài cũng được hỗ trợ.|
|Union||Biểu thức union (hợp) là một hàm Jaql kết hợp nhiều mảng đầu vào thành một mảng đầu ra duy nhất.|
|Control-flow||Hai biểu thức kiểm soát luồng được dùng phổ biến nhất trong Jaql là if-then-else và các biểu thức khối. Biểu thức if-then-else tương tự như các biểu thức có điều kiện được tìm thấy trong hầu hết các ngôn ngữ lập trình và các ngôn ngữ tạo kịch bản lệnh. Một khối thiết lập một phạm vi cục bộ ở đó có thể khai báo biến không và nhiều biến cục bộ và câu lệnh cuối cùng cung cấp các giá trị trả về của khối đó.|
Ở một mức cao, kiến trúc Jaql đã mô tả trong
[Hình 4](#fig4) là tương tự như hầu hết các hệ thống cơ sở dữ liệu.
##### Hình 4. Kiến trúc hệ thống Jaql
![ Biểu đồ kiến trúc của Jaql system](fig04.gif)
Các kịch bản lệnh được chuyển vào hệ thống từ trình thông dịch (interpreter) hoặc một ứng dụng, được biên dịch bởi trình phân tích cú pháp và công cụ viết lại hoặc được giải thích thêm hoặc đánh giá thêm qua dữ liệu từ tầng vào/ra (I/O). Tầng lưu trữ tương tự như một cơ sở dữ liệu thống nhất. Nó cung cấp một API để truy cập dữ liệu từ các hệ thống khác nhau gồm cả hệ thống tệp cục bộ hoặc phân tán (như HDFS của Hadoop), các hệ thống cơ sở dữ liệu (chẳng hạn như DB2, Netezza, HBase) hoặc từ các nguồn theo luồng dữ liệu như web. Không giống như các cơ sở dữ liệu thống nhất, tuy nhiên, hầu hết các dữ liệu đã truy cập được lưu trữ trong cùng một cụm và API vào/ra mô tả phân vùng dữ liệu, cho phép xử lý song song với tính tương tự của dữ liệu trong quá trình đánh giá. Jaql thu được phần lớn tính linh hoạt này từ API vào/ra của Hadoop. Nó đọc và ghi nhiều định dạng tệp phổ biến (chẳng hạn như các tệp định giới, văn bản JSON và các tệp của Hadoop Sequence). Các bộ thích ứng tùy chỉnh được viết dễ dàng để ánh xạ một bộ dữ liệu đến hoặc từ mô hình dữ liệu Jaql. Thậm chí đầu vào có thể chỉ đơn giản là các giá trị được xây dựng trong chính kịch bản lệnh. Bộ biên dịch Jaql đánh giá kịch bản lệnh cục bộ trên máy tính đã biên dịch kịch bản lệnh, nhưng sinh ra các trình thông dịch trên các nút từ xa bằng cách sử dụng MapReduce. Trình biên dịch Jaql tự động phát hiện các cơ hội song song trong một kịch bản lệnh Jaql và chuyển nó thành một tập các công việc MapReduce.
## Kết luận
MapReduce đã nổi lên như là một cách phổ biến để khai thác sức mạnh của các cụm máy tính lớn. Hiện nay, MapReduce dùng như một nền tảng cho một số lượng đáng kể các phân tích dữ liệu lớn. Nó cho phép các nhà lập trình suy nghĩ theo kiểu dữ liệu là trung tâm, ở đó họ có thể tập trung vào việc áp dụng các phép chuyển đổi cho các tập bản ghi dữ liệu trong khi các chi tiết thực hiện phân tán và khả năng chịu lỗi được quản lý trong suốt bởi khung công tác MapReduce. Trong thực tế, nhiều nhà lập trình thích sử dụng các ngôn ngữ khai báo bậc cao (hoặc như-SQL) để thực hiện các công việc phân tích dữ liệu quy mô lớn song song trong khi để lại tất cả các chi tiết tối ưu hóa thực hiện cho các công cụ phụ trợ. Trong bài này, bạn đã thấy một tổng quan tiên tiến về các giao diện khai báo bậc cao cho khung công tác MapReduce. Giảm thiểu gánh nặng lập trình của bạn với các sự trừu tượng hóa của ngôn ngữ bậc cao, cho phép các hệ thống bên dưới thực hiện các tối ưu hóa tự động ở mức thực hiện và cải thiện hiệu năng của các nhiệm vụ của người dùng.
## Tài nguyên
### Học tập
- Truy cập
[trang web Dự án Apache Hadoop](http://hadoop.apache.org)để tìm hiểu về thư viện phần mềm này, đó là một khung công tác cho phép xử lý phân tán các bộ dữ liệu lớn trên các cụm máy tính khi sử dụng một mô hình lập trình đơn giản.
- Truy cập
[trang web Hệ thống tệp phân tán của Apache Hadoop (HDFS)](http://hadoop.apache.org/hdfs). HDFS là hệ thống lưu trữ chính được các ứng dụng Hadoop sử dụng.
- Truy cập
[trang web Dự án Pig của Apache](http://pig.apache.org)để tìm hiểu về một nền tảng dùng để phân tích các bộ dữ liệu lớn gồm một ngôn ngữ bậc cao để biểu thị chương trình phân tích dữ liệu, được ghép với cơ sở hạ tầng để đánh giá các chương trình này.
- Truy cập
[trang web Dự án Hive của Apache](http://hive.apache.org). Hive là một hệ thống kho dữ liệu cho Hadoop, tạo điều kiện tóm tắt dữ liệu dễ dàng, các truy vấn đặc biệt và việc phân tích các bộ dữ liệu lớn được lưu trữ trong hệ thống tệp tương thích của Hadoop.
- Truy cập
[trang web phân phối Cloudera Apache Hadoop](http://www.cloudera.com)để tìm hiểu về gói phần mềm nguồn mở được thiết kế để phân tích tinh vi và chuyển đổi dữ liệu có cấu trúc và không cấu trúc phức tạp.
- Truy cập
[trang web Dự án HadoopDB](http://db.cs.yale.edu/hadoopdb/hadoopdb.html)để khám phá sự lai ghép kiến trúc này của các công nghệ MapReduce và DBMS cho các tải làm việc phân tích.
- Truy cập
[Hadapt - Trang web Nền tảng phân tích thích ứng](http://www.hadapt.com/)và xem xét nền tảng dữ liệu lớn đầu tiên để kết hợp các lợi ích của công nghệ Apache Hadoop và công nghệ DBMS quan hệ thành một hệ thống độc lập cho các ứng dụng dựa trên phân tích dữ liệu nhiều cấu trúc. Hadapt được thiết kế cho đám mây và được tối ưu hóa cho các môi trường ảo hóa.
- Truy cập
[trang web Hệ thống dữ liệu Aster](http://www.asterdata.com)và tìm hiểu cách cung cấp dữ liệu của bạn.
- Truy cập
[trang web Jaql](http://code.google.com/p/jaql). Ngôn ngữ truy vấn Jacl, được thiết kế cho JavaScript Object Notation (JSON), chủ yếu được sử dụng để phân tích dữ liệu bán cấu trúc quy mô lớn.
- Đọc
[hướng dẫn MapReduce của Hadoop](http://hadoop.apache.org/common/docs/r0.20.1/mapred_tutorial.html)tại Apache.org. [Sử dụng MapReduce và cân bằng tải trên đám mây](http://www.ibm.com/developerworks/cloud/library/cl-mapreduce/)(Kirpal A. Venkatesh, Kishorekumar Neelamegam và R. Revathy, developerWorks, 07.2010): Tìm hiểu cách thực hiện khung công tác MapReduce của Hadoop trong một môi trường đám mây và sử dụng việc cân bằng tải ảo để cải thiện hiệu năng của cả hệ thống một nút lẫn hệ thống nhiều nút. [Bảng chú giải Dữ liệu lớn](http://shop.oreilly.com/product/0636920022466.do)(Pete Warden, O'Reilly Media, ISBN: 1449314597, 09.2011): Khám phá số lượng lớn các công cụ dữ liệu mới có sẵn trong một tài liệu hướng dẫn mô tả 60 sáng kiến trong số những sáng kiến gần đây nhất. [Hadoop: Hướng dẫn chính thức](http://shop.oreilly.com/product/0636920010388.do)(Tom White, O'Reilly Media, ISBN: 1449389732, 09.2010) Khám phá cách Apache Hadoop có thể giải phóng sức mạnh dữ liệu của bạn. [Lập trình Pig](http://shop.oreilly.com/product/0636920018087.do)(Alan Gates, O'Reilly Media, ISBN: 1449302645, 09.2011): Đọc công cụ học tập này và tham khảo Apache Pig, một công cụ mã nguồn mở để thực hiện các luồng dữ liệu song song trên Hadoop. [HadoopDB: Một sự lai ghép kiến trúc của các công nghệ MapReduce và DBMS cho Các tải làm việc phân tích](http://www.vldb.org/pvldb/2/vldb09-861.pdf)(Azza Abouzeid và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (1), 08.2009): Bài báo này nghiên cứu tính khả thi của việc xây dựng một hệ thống lai, có được các tính năng tốt nhất từ cả hai công nghệ này. [Jaql: Một Ngôn ngữ tạo kịch bản lệnh để Phân tích dữ liệu bán-cấu trúc quy mô lớn](http://www.mpi-inf.mpg.de/~rgemulla/publications/beyer11jaql.pdf)(Kevin S. Beyer và các cộng sự, Kỷ yếu của VLDB Endowment, 4 (9), 09.2011. [MapReduce: Xử lý dữ liệu đơn giản hóa trên Các cụm lớn](http://static.usenix.org/event/osdi04/tech/full_papers/dean/dean.pdf), Jeffrey Dean và Sanjay Ghemawat, OSDI, 2004 [SQL/MapReduce: Một cách tiếp cận thực tế với hàm do người dùng định nghĩa tự mô tả, đa hình và có khả năng song song hóa](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.151.7463)(Eric Friedman, Peter Pawlowski và John Cieslewicz, Kỷ yếu của VLDB Endowment, 2 (2), 2009): Đọc bài báo này, có mô tả động lực cho cách tiếp cận mới đến các UDF cũng như thực hiện trong cơ sở dữ liệu nCluster của AsterData Systems. [Xây dựng một Hệ thống luồng dữ liệu mức cao trên đỉnh MapReduce: Trải nghiệm Pig](http://www.vldb.org/pvldb/2/vldb09-1074.pdf), Alan Gates và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (2), 08.2009): Bài báo này mô tả các thách thức phải đối mặt với việc phát triển Pig và báo cáo các so sánh hiệu năng giữa việc thực hiện Pig và thực hiện Map-Reduce thô. [Pig Latin: một ngôn ngữ quen thuộc để xử lý dữ liệu](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.124.5496)(Christopher Olston và các cộng sự, Hội nghị SIGMOD, 2008) [So sánh các cách tiếp cận để phân tích dữ liệu quy mô lớn](http://database.cs.brown.edu/sigmod09/benchmarks-sigmod09.pdf)( Andrew Pavlo và các cộng sự, Hội nghị SIGMOD, 2009) [MapReduce và các DBMS song song: bạn bè hay kẻ thù?](http://database.cs.brown.edu/papers/stonebraker-cacm2010.pdf)(Michael Stonebraker và các cộng sự, Commun. ACM 53 (1), 2010) [Hive - Giải pháp kho dữ liệu trên một khung Map- Reduce](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.151.2637)(Ashish Thusoo và các cộng sự, Kỷ yếu của VLDB Endowment, 2 (2), 2009) [Cơ sở hạ tầng phân tích và kho dữ liệu tại Facebook](http://dl.acm.org/citation.cfm?id=1807278)(Ashish Thusoo, Zheng Shao, Suresh Anthony, Dhruba Borthakur, Namit Jain, Joydeep Sen Sarma, Raghotham Murthyvà Hao Liu, Hội nghị SIGMOD, 2010): Bài này trình bày cách Scribe, Hadoop và Hive đã hợp lại với nhau và đã cho phép thực hiện một kho dữ liệu lưu trữ hơn 15PB dữ liệu (2,5PB sau khi nén) và tải nhiều hơn 60TB dữ liệu mới (10TB sau khi nén) mỗi ngày. [Một khảo sát về Các cách tiếp cận quản lý dữ liệu quy mô lớn trong môi trường Đám mây](http://www.mendeley.com/research/survey-large-scale-data-management-approaches-cloud-environments/)(Sherif Sakr, Anna Liu, Daniel M Batista và Mohammad Alomari, Tạp chí các hướng dẫn và khảo sát truyền thông, 13 (3), 2011): Trong bài báo này, hãy tìm một khảo sát toàn diện về rất nhiều cách tiếp cận và cơ chế triển khai các ứng dụng chuyên về dữ liệu trong đám mây đang làm tăng nhiều động lực trong cả cộng đồng nghiên cứu lẫn cộng đồng công nghiệp phần mềm.
- Trong
[Vùng nguồn mở trên developerWorks](http://www.ibm.com/developerworks/opensource/?S_TACT=105AGY75), tìm thông tin hướng dẫn, các công cụ và các bản cập nhật dự án lớn để giúp bạn phát triển với các công nghệ nguồn mở và sử dụng chúng với các sản phẩm của IBM.
- Trên
[Vùng công nghệ của developerWorks](http://www.ibm.com/developerworks/java/?S_TACT=105AGY75), hãy tìm các bài báo, các hướng dẫn, các hội thảo và nhiều hơn nữa về mọi khía cạnh của lập trình Java.
- Theo sát với
[webcast và các sự kiện kỹ thuật của developerWorks](http://www.ibm.com/developerworks/offers/techbriefings/events.html?S_TACT=105AGY75)được tập trung vào một loạt các sản phẩm của IBM và các chủ đề ngành công nghiệp công nghệ thông tin.
- Tham dự một
[lớp hướng dẫn developerWorks Live! miễn phí](http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGY75)để tăng tốc độ nhanh chóng dựa trên 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.
- Nghe
[podcast trên developerWorks](https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=70786d1c-a2d4-4de8-a807-fccfa600bc77&S_TACT=105AGY75)để biết các cuộc phỏng vấn và thảo luận thú vị dành cho các nhà phát triển phần mềm.
- Theo dõi
[developerWorks trên Twitter](http://www.twitter.com/developerworks/).
- Xem
[các trình diễn theo yêu cầu của developerWorks](http://www.ibm.com/developerworks/offers/lp/demos/?S_TACT=105AGY75), trải rộng từ các trình diễn cài đặt và thiết lập sản phẩm cho người mới bắt đầu đến các chức năng nâng cao cho các nhà phát triển có kinh nghiệm.
### Lấy sản phẩm và công nghệ
- Nhận
[Hadoop 0.20.1](http://hadoop.apache.org/common/releases.html)từ Apache.org.
- Nhận
[Pig](http://pig.apache.org/releases.html)từ Apache.org.
- Nhận
[Hadoop MapReduce](http://hadoop.apache.org/mapreduce/releases.html).
- Nhận
[Hadoop HDFS](http://hadoop.apache.org/hdfs/releases.html).
- Truy cập
[Phần mềm dùng thử của IBM](http://www.ibm.com/developerworks/downloads/?S_TACT=105AGY75)(có sẵn để tải về hoặc trên đĩa DVD) và đổi mới dự án phát triển nguồn mở tiếp theo của bạn bằng cách sử dụng phần mềm chủ yếu dành cho các nhà phát triển.
### Thảo luận
[Kết nối với những người dùng developerWorks khác](http://www.ibm.com/developerworks/community?S_TACT=105AGY75)trong khi khám phá các blog, các diễn đàn, các nhóm và các wiki dựa vào-nhà phát triển. Giúp xây dựng nhóm [Nguồn mở thế giới thực](https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=6e6f6d1b-95c3-46df-8a26-b7efd8ee4b57&S_TACT=105AGY75)trong cộng đồng developerWorks.
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Language: en-US