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.
13 trang |
Chia sẻ: lylyngoc | Lượt xem: 1556 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Sử dụng các ngôn ngữ như-SQL với khung công tác MapReduce, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Sử dụng các ngôn ngữ như-SQL với khung công tác
MapReduce
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.
Về đầu trang
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:
1. 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.
2. 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ì.
3. Tính chất không trong suốt của các hàm map và reduce cả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.
Về đầu trang
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:
1. 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".
2. 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").
3. 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)
4. 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
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 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.
Về đầu trang
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.
Về đầu trang
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ị