Câu trả lời:
Phân vùng dữ liệu thường được sử dụng để phân phối tải theo chiều ngang, điều này có lợi ích về hiệu suất và giúp tổ chức dữ liệu theo cách hợp lý. Ví dụ : nếu chúng ta đang xử lý một employee
bảng lớn và thường chạy các truy vấn với WHERE
các mệnh đề giới hạn kết quả ở một quốc gia hoặc bộ phận cụ thể. Đối với một câu trả lời truy vấn nhanh hơn Bảng Hive có thể PARTITIONED BY (country STRING, DEPT STRING)
. Các bảng phân vùng thay đổi cách Hive cấu trúc lưu trữ dữ liệu và Hive giờ đây sẽ tạo các thư mục con phản ánh cấu trúc phân vùng như
... / Nhân viên / quốc gia = ABC / DEPT = XYZ .
Nếu giới hạn truy vấn cho nhân viên từ country=ABC
, nó sẽ chỉ quét nội dung của một thư mục country=ABC
. Điều này có thể cải thiện đáng kể hiệu năng truy vấn, nhưng chỉ khi sơ đồ phân vùng phản ánh bộ lọc phổ biến. Tính năng phân vùng rất hữu ích trong Hive, tuy nhiên, một thiết kế tạo quá nhiều phân vùng có thể tối ưu hóa một số truy vấn, nhưng gây bất lợi cho các truy vấn quan trọng khác. Hạn chế khác là có quá nhiều phân vùng là số lượng lớn tệp và thư mục Hadoop được tạo không cần thiết và chi phí cho NameNode vì nó phải giữ tất cả siêu dữ liệu cho hệ thống tệp trong bộ nhớ.
Bucketing là một kỹ thuật khác để phân tách các tập dữ liệu thành các phần dễ quản lý hơn. Ví dụ: giả sử một bảng sử dụng date
làm phân vùng cấp cao nhất và phân vùng cấp employee_id
hai dẫn đến quá nhiều phân vùng nhỏ. Thay vào đó, nếu chúng ta xô bảng nhân viên và sử dụng employee_id
làm cột xô , giá trị của cột này sẽ được băm bởi một số do người dùng xác định thành các nhóm. Các bản ghi có cùng employee_id
sẽ luôn được lưu trong cùng một nhóm. Giả sử số lượng employee_id
lớn hơn nhiều so với số lượng xô, mỗi nhóm sẽ có nhiều employee_id
. Trong khi tạo bảng, bạn có thể chỉ định nhưCLUSTERED BY (employee_id) INTO XX BUCKETS;
Trong đó XX là số xô. Bucketing có một số lợi thế. Số lượng thùng được cố định để nó không dao động với dữ liệu. Nếu hai bảng được khóa bởi employee_id
, Hive có thể tạo một mẫu chính xác về mặt logic. Bucketing cũng hỗ trợ trong việc thực hiện các phép nối bên bản đồ hiệu quả, v.v.
Có một vài chi tiết bị thiếu trong các giải thích trước đó. Để hiểu rõ hơn về cách phân vùng và khóa hoạt động, bạn nên xem cách dữ liệu được lưu trữ trong tổ ong. Giả sử bạn có một cái bàn
CREATE TABLE mytable (
name string,
city string,
employee_id int )
PARTITIONED BY (year STRING, month STRING, day STRING)
CLUSTERED BY (employee_id) INTO 256 BUCKETS
sau đó hive sẽ lưu trữ dữ liệu trong một hệ thống phân cấp thư mục như
/user/hive/warehouse/mytable/y=2015/m=12/d=02
Vì vậy, bạn phải cẩn thận khi phân vùng, bởi vì nếu bạn ví dụ phân vùng bởi worker_id và bạn có hàng triệu nhân viên, cuối cùng bạn sẽ có hàng triệu thư mục trong hệ thống tệp của mình. Thuật ngữ ' cardinality ' dùng để chỉ số lượng giá trị có thể có của một lĩnh vực. Ví dụ: nếu bạn có trường 'quốc gia', các quốc gia trên thế giới có khoảng 300, vì vậy số lượng thẻ sẽ là ~ 300. Đối với một trường như 'timestamp_ms', thay đổi mỗi mili giây, số lượng thẻ có thể là hàng tỷ. Nói chung, khi chọn một trường để phân vùng, nó không nên có số lượng thẻ cao, bởi vì bạn sẽ kết thúc với quá nhiều thư mục trong hệ thống tệp của mình.
Mặt khác, cụm hay còn gọi là xô, sẽ dẫn đến một số lượng tệp cố định, vì bạn chỉ định số lượng nhóm. Những gì tổ ong sẽ làm là lấy trường, tính toán một hàm băm và gán một bản ghi cho nhóm đó. Nhưng điều gì xảy ra nếu bạn sử dụng giả sử 256 thùng và trường bạn đang sử dụng có số lượng thẻ thấp (ví dụ: đó là tiểu bang Hoa Kỳ, vì vậy chỉ có thể có 50 giá trị khác nhau)? Bạn sẽ có 50 thùng có dữ liệu và 206 thùng không có dữ liệu.
Ai đó đã đề cập đến cách phân vùng có thể cắt giảm đáng kể lượng dữ liệu bạn đang truy vấn. Vì vậy, trong bảng ví dụ của tôi, nếu bạn chỉ muốn truy vấn từ một ngày nhất định, việc phân vùng theo năm / tháng / ngày sẽ cắt giảm đáng kể lượng IO. Tôi nghĩ rằng ai đó cũng đã đề cập đến cách xô có thể tăng tốc độ tham gia với các bảng khác có cùng độ chính xác , vì vậy, trong ví dụ của tôi, nếu bạn tham gia hai bảng trên cùng một worker_id, hive có thể thực hiện liên kết xô bằng xô (thậm chí tốt hơn nếu chúng đã được sắp xếp bởi worker_id vì nó sẽ hợp nhất các phần đã được sắp xếp, hoạt động theo thời gian tuyến tính hay còn gọi là O (n)).
Vì vậy, xô hoạt động tốt khi trường có số lượng thẻ cao và dữ liệu được phân bổ đều giữa các nhóm. Phân vùng hoạt động tốt nhất khi mức độ chính xác của trường phân vùng không quá cao.
Ngoài ra, bạn có thể phân vùng trên nhiều trường , với một đơn hàng (năm / tháng / ngày là một ví dụ điển hình), trong khi bạn chỉ có thể xô vào một trường .
Tôi nghĩ rằng tôi đến trễ khi trả lời câu hỏi này, nhưng nó cứ xuất hiện trong nguồn cấp dữ liệu của tôi.
Navneet đã cung cấp câu trả lời tuyệt vời. Thêm vào nó một cách trực quan.
Phân vùng giúp loại bỏ dữ liệu, nếu được sử dụng trong mệnh đề WHERE, trong đó việc phân nhóm giúp tổ chức dữ liệu trong mỗi phân vùng thành nhiều tệp, do đó, cùng một bộ dữ liệu luôn được ghi trong cùng một nhóm. Giúp rất nhiều trong việc tham gia các cột.
Giả sử, bạn có một bảng có năm cột, tên, server_date, some_col3, some_col4 và some_col5. Giả sử, bạn đã phân vùng bảng trên server_date và bị khóa trên cột tên trong 10 nhóm, cấu trúc tệp của bạn sẽ trông giống như bên dưới.
Ở đây server_date = xyz là phân vùng và 000 tệp là các nhóm trong mỗi phân vùng. Các nhóm được tính toán dựa trên một số hàm băm, vì vậy các hàng có tên = Sandy sẽ luôn đi trong cùng một nhóm.
Phân vùng tổ ong:
Phân vùng chia số lượng lớn dữ liệu thành nhiều lát dựa trên giá trị của một cột trong bảng.
Giả sử rằng bạn đang lưu trữ thông tin của mọi người trên toàn thế giới trải rộng trên hơn 196 quốc gia trải rộng khoảng 500 lõi. Nếu bạn muốn truy vấn mọi người từ một quốc gia cụ thể (thành phố Vatican), nếu không có phân vùng, bạn phải quét tất cả 500 lõi mục thậm chí để lấy hàng nghìn mục của một quốc gia. Nếu bạn phân vùng bảng dựa trên quốc gia, bạn có thể tinh chỉnh quá trình truy vấn bằng cách chỉ kiểm tra dữ liệu cho một phân vùng quốc gia. Phân vùng Hive tạo một thư mục riêng cho giá trị cột (s).
Ưu điểm:
Nhược điểm:
Hive Bucketing:
Bucketing phân hủy dữ liệu thành các phần dễ quản lý hơn hoặc bằng nhau.
Với phân vùng, có khả năng bạn có thể tạo nhiều phân vùng nhỏ dựa trên các giá trị cột. Nếu bạn đi xô, bạn đang giới hạn số lượng xô để lưu trữ dữ liệu. Số này được xác định trong các kịch bản tạo bảng.
Ưu
Nhược điểm
Trước khi đi vào Bucketing
, chúng ta cần phải hiểu những gì Partitioning
. Hãy để chúng tôi lấy bảng dưới đây làm ví dụ. Lưu ý rằng tôi chỉ đưa ra 12 bản ghi trong ví dụ dưới đây để hiểu mức độ mới bắt đầu. Trong các kịch bản thời gian thực, bạn có thể có hàng triệu bản ghi.
THAM GIA
---------------------
Partitioning
được sử dụng để đạt được hiệu suất trong khi truy vấn dữ liệu. Ví dụ, trong bảng trên, nếu chúng ta viết sql bên dưới, nó cần quét tất cả các bản ghi trong bảng làm giảm hiệu suất và tăng chi phí.
select * from sales_table where product_id='P1'
Để tránh quét toàn bộ bảng và chỉ đọc các bản ghi liên quan đến product_id='P1'
chúng ta có thể phân vùng (chia các tệp của bảng hive) thành nhiều tệp dựa trên product_id
cột. Do đó, tệp của bảng tổ ong sẽ được chia thành hai tệp một product_id='P1'
và một với product_id='P2'
. Bây giờ khi chúng tôi thực hiện truy vấn trên, nó sẽ chỉ quét product_id='P1'
tệp.
../hive/warehouse/sales_table/product_id=P1
../hive/warehouse/sales_table/product_id=P2
Cú pháp tạo phân vùng được đưa ra dưới đây. Lưu ý rằng chúng ta không nên sử dụng product_id
định nghĩa cột cùng với các cột không được phân vùng theo cú pháp dưới đây. Điều này chỉ nên trong partitioned by
mệnh đề.
create table sales_table(sales_id int,trans_date date, amount int)
partitioned by (product_id varchar(10))
Nhược điểm : Chúng ta nên rất cẩn thận trong khi phân vùng. Đó là, nó không nên được sử dụng cho các cột trong đó số lượng giá trị lặp lại rất ít (đặc biệt là các cột khóa chính) vì nó làm tăng số lượng tệp được phân vùng và tăng chi phí cho Name node
.
BucksET
------------------
Bucketing
được sử dụng để khắc phục cons
điều mà tôi đã đề cập trong phần phân vùng. Điều này nên được sử dụng khi có rất ít giá trị lặp lại trong một cột (ví dụ - cột khóa chính). Điều này tương tự với khái niệm chỉ mục trên cột khóa chính trong RDBMS. Trong bảng của chúng tôi, chúng tôi có thể lấy Sales_Id
cột để xô. Nó sẽ hữu ích khi chúng ta cần truy vấn sales_id
cột.
Dưới đây là cú pháp cho bucketing.
create table sales_table(sales_id int,trans_date date, amount int)
partitioned by (product_id varchar(10)) Clustered by(Sales_Id) into 3 buckets
Ở đây chúng tôi sẽ tiếp tục chia dữ liệu thành một vài tệp trên đầu phân vùng.
Vì chúng tôi đã chỉ định các 3
nhóm, nó được chia thành 3 tệp cho mỗi tệp product_id
. Nó sử dụng nội bộ modulo operator
để xác định trong đó mỗi thùng sales_id
nên được lưu trữ. Ví dụ: đối với product_id='P1'
, tệp sales_id=1
sẽ được lưu trữ trong tệp 000001_0 (nghĩa là 1% 3 = 1), sales_id=2
sẽ được lưu trữ trong tệp 000002_0 (nghĩa là 2% 3 = 2), sales_id=3
sẽ được lưu trữ trong tệp 000000_0 (nghĩa là 3% 3 = 0) v.v.
hashCode()
của chuỗi làm hàm băm không? Lập trình viên có thể chọn hàm băm không?
Sự khác biệt là xô chia các tệp theo Tên cột và phân vùng chia các tệp trong Theo một giá trị cụ thể bên trong bảng
Hy vọng tôi xác định chính xác
Có những phản hồi tuyệt vời ở đây. Tôi muốn giữ nó ngắn để ghi nhớ sự khác biệt giữa phân vùng và xô.
Bạn thường phân vùng trên một cột ít độc đáo hơn. Và xô trên cột độc đáo nhất.
Ví dụ nếu bạn xem dân số thế giới với quốc gia, tên người và id số liệu sinh học của họ làm ví dụ. Như bạn có thể đoán, trường quốc gia sẽ là cột ít độc đáo nhất và id số liệu sinh học sẽ là cột duy nhất. Vì vậy, lý tưởng bạn sẽ cần phân vùng bảng theo quốc gia và xô bảng theo id số liệu sinh học.
Sử dụng phân vùng trong bảng Hive rất được khuyến khích vì lý do dưới đây -
Thí dụ :-
Giả sử rằng Tệp đầu vào (100 GB) được tải vào bảng tạm thời và nó chứa dữ liệu ngân hàng từ các khu vực địa lý khác nhau.
Bảng Hive không có phân vùng
Insert into Hive table Select * from temp-hive-table
/hive-table-path/part-00000-1 (part size ~ hdfs block size)
/hive-table-path/part-00000-2
....
/hive-table-path/part-00000-n
Vấn đề với cách tiếp cận này là - Nó sẽ quét toàn bộ dữ liệu cho bất kỳ truy vấn nào bạn chạy trên bảng này. Thời gian đáp ứng sẽ cao so với các phương pháp khác trong đó phân vùng và Bucketing được sử dụng.
Bảng tổ ong với phân vùng
Insert into Hive table partition(country) Select * from temp-hive-table
/hive-table-path/country=US/part-00000-1 (file size ~ 10 GB)
/hive-table-path/country=Canada/part-00000-2 (file size ~ 20 GB)
....
/hive-table-path/country=UK/part-00000-n (file size ~ 5 GB)
Ưu điểm - Ở đây người ta có thể truy cập dữ liệu nhanh hơn khi truy vấn dữ liệu cho các giao dịch địa lý cụ thể. Nhược điểm - Chèn / truy vấn dữ liệu có thể được cải thiện hơn nữa bằng cách chia dữ liệu trong mỗi phân vùng. Xem tùy chọn Bucketing bên dưới.
Bảng Hive với phân vùng và Bucketing
Lưu ý: Tạo bảng tổ ong ..... với "CLUSTERED BY (Partiton_Column) thành 5 nhóm
Insert into Hive table partition(country) Select * from temp-hive-table
/hive-table-path/country=US/part-00000-1 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-2 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-3 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-4 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-5 (file size ~ 2 GB)
/hive-table-path/country=Canada/part-00000-1 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-2 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-3 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-4 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-5 (file size ~ 4 GB)
....
/hive-table-path/country=UK/part-00000-1 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-2 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-3 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-4 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-5 (file size ~ 1 GB)
Ưu điểm - Chèn nhanh hơn. Truy vấn nhanh hơn.
Nhược điểm - Bucketing sẽ tạo ra nhiều tập tin hơn. Có thể có vấn đề với nhiều tệp nhỏ trong một số trường hợp cụ thể
Hy vọng điều này sẽ giúp !!