Sự khác biệt giữa phân vùng và xô bảng trong Hive là gì?


129

Tôi biết cả hai được thực hiện trên một cột trong bảng nhưng mỗi thao tác khác nhau như thế nào.

Câu trả lời:


247

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 employeebảng lớn và thường chạy các truy vấn với WHEREcá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 datelàm phân vùng cấp cao nhất và phân vùng cấp employee_idhai 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_idlà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_idlớ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.


4
Cảm ơn Navneet. Tuy nhiên, bạn có thể giải thích cách bucketing xảy ra với phân vùng không? Giả sử nếu chúng ta chỉ định 32 nhóm trong mệnh đề CLUSED BY và câu lệnh CREATE TABLE cũng chứa mệnh đề Phân vùng, các phân vùng và nhóm sẽ được quản lý như thế nào? Có số lượng phân vùng sẽ được giới hạn đến 32? HOẶC cho mỗi phân vùng, 32 thùng sẽ được tạo ra? Có phải mỗi xô là một tệp HDFS?
sgsi 2/2/2015

12
Một bảng hive có thể có cả phân vùng và xô. Dựa trên mệnh đề phân vùng của bạn, cho mỗi phân vùng sẽ có 32 nhóm được tạo. Có tệp HDFS.
Navneet Kumar

7
@sgsi Phân vùng là một thư mục, xô là một tập tin.
rời khỏi

12
Đối với hồ sơ, câu trả lời này xuất phát từ văn bản của Lập trình Hive (O'Reilly, 2012).
ianmcook

1
Tôi thấy liên kết này hữu ích. Nó có thông tin sẽ tăng thêm giá trị cho câu trả lời này. linkedin.com/pulse/...
Alex Raj Kaliamoorthy

129

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 .


Bạn có thể vui lòng giải thích hành vi CLUSTERED-BY với SORTED-BY trong một ví dụ không? Theo ví dụ của tôi, tôi thấy SORTED-BY không làm gì cả. Tôi có thiếu thứ gì không
Jagadish Talluri

2
Clustered bởi x, y được như viết PHÂN PHỐI BỞI x, y Sắp xếp x, y (xem cwiki.apache.org/confluence/display/Hive/... ) để thêm Sắp xếp để Clustered DO không có tác dụng.
Roberto Congiu

Thú vị, tôi đồng ý wrt việc sử dụng trong truy vấn chọn. Nhưng tự hỏi tại sao mọi người đang sử dụng cụm và sắp xếp theo nhau trong tuyên bố tạo bảng. Nếu không có ý nghĩa đối với SORTED BY trong DDL, thì tại sao từ khóa này lại có mặt? Không có được điều đó.
Jagadish Talluri

SORTED BY có nghĩa là được sử dụng với PHÂN PHỐI B BYNG. Chẳng hạn, bạn có thể muốn phân phối theo id người dùng và sắp xếp theo thời gian trong nhóm. CLUSTER BY chỉ là một phím tắt khi mệnh đề trên SORTED BY và DISTRIBUTED BY giống nhau. Điều duy nhất tôi có thể nghĩ là nếu bạn phân phối theo x, y và sắp xếp theo x, y và z
Roberto Congiu

Tôi không chắc ý của bạn là gì bởi "bạn chỉ có thể xô trên một trường." Tôi nghĩ rằng có thể xô theo nhiều trường, hàm băm sẽ chỉ lấy tất cả các trường và kết hợp chúng.
Istvan

18

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.

  1. server_date = xyz
    • 00000_0
    • 00001_0
    • 00002_0
    • ........
    • 00010_0

Ở đâ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.


2
Theo Roberto trong câu trả lời trên server_date sẽ là một ví dụ tồi để thực hiện phân vùng vì giá trị cardinality của nó thực sự cao. Và do đó, bạn sẽ có quá nhiều thư mục trong hdfs.
Gaurang Shah

server_date được đề cập như một ví dụ ở đây. Trong thế giới thực, phân vùng nói chung xảy ra như được mô tả bởi Roberto, bằng cách chia ngày thành năm / tháng / ngày. Đó là cách nó phải như vậy.
Priyesh

17

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:

  1. Phân phối tải thực thi theo chiều ngang
  2. Thực hiện nhanh hơn các truy vấn trong trường hợp phân vùng có khối lượng dữ liệu thấp. ví dụ: Lấy dân số từ " thành phố Vatican " trở lại rất nhanh thay vì tìm kiếm toàn bộ dân số thế giới.

Nhược điểm:

  1. Khả năng có quá nhiều sáng tạo phân vùng nhỏ - quá nhiều thư mục.
  2. Hiệu quả cho dữ liệu khối lượng thấp cho một phân vùng nhất định. Nhưng một số truy vấn như nhóm theo khối lượng dữ liệu lớn vẫn mất nhiều thời gian để thực hiện. ví dụ: Nhóm dân số của Trung Quốc sẽ mất nhiều thời gian so với việc phân nhóm dân số ở thành phố Vatican. Phân vùng không giải quyết vấn đề đáp ứng trong trường hợp dữ liệu lệch về một giá trị phân vùng cụ thể.

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

  1. Do khối lượng dữ liệu bằng nhau trong mỗi phân vùng, việc tham gia ở phía Bản đồ sẽ nhanh hơn.
  2. Phản hồi truy vấn nhanh hơn như phân vùng

Nhược điểm

  1. Bạn có thể xác định số lượng thùng trong quá trình tạo bảng nhưng việc tải khối lượng dữ liệu bằng nhau phải được lập trình viên thực hiện thủ công.

9

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.

nhập mô tả hình ảnh ở đây



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_idcộ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 bymệ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_Idcột để xô. Nó sẽ hữu ích khi chúng ta cần truy vấn sales_idcộ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.

nhập mô tả hình ảnh ở đây

Vì chúng tôi đã chỉ định các 3nhó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_idnên được lưu trữ. Ví dụ: đối với product_id='P1', tệp sales_id=1sẽ được lưu trữ trong tệp 000001_0 (nghĩa là 1% 3 = 1), sales_id=2sẽ được lưu trữ trong tệp 000002_0 (nghĩa là 2% 3 = 2), sales_id=3sẽ được lưu trữ trong tệp 000000_0 (nghĩa là 3% 3 = 0) v.v.


Đối với các cột cụm số, nó có luôn chỉ lấy mod theo số lượng thùng không? Đối với các cột được phân cụm có giá trị chuỗi, nó có sử dụng Java 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?
Don Smith

Rõ ràng (và theo các thử nghiệm của tôi) sử dụng một biến thể trên phương thức hashCode () của Java: github.com/apache/hive/blob/release-1.1.0/serde/src/java/org/ . Điều này đã được đề cập ở đây: stackoverflow.com/questions/30594038/ .
Don Smith

3

Sự khác biệt là 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


0

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.


-1

Sử dụng phân vùng trong bảng Hive rất được khuyến khích vì lý do dưới đây -

  • Chèn vào bảng Hive sẽ nhanh hơn (vì nó sử dụng nhiều luồng để ghi dữ liệu vào phân vùng)
  • Truy vấn từ bảng Hive nên hiệu quả với độ trễ thấp.

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 !!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.