Có một vài cách bạn có thể đi về tách ra Hive. Cách đầu tiên và dễ nhất là đặt số lượng bộ giảm tốc. Vì mỗi lần giảm ghi vào tệp đầu ra của riêng nó, số lượng trình giảm tốc bạn chỉ định sẽ tương ứng với số lượng tệp đầu ra được viết. Lưu ý rằng một số truy vấn Hive sẽ không dẫn đến số lượng bộ giảm mà bạn chỉ định (ví dụ: SELECT COUNT(*) FROM some_table
luôn dẫn đến một bộ giảm tốc). Để chỉ định số lượng trình giảm tốc chạy điều này trước truy vấn của bạn:
set mapred.reduce.tasks=10
Một cách khác bạn có thể chia thành nhiều tệp đầu ra sẽ có Hive chèn kết quả truy vấn của bạn vào bảng được phân đoạn. Điều này sẽ dẫn đến ít nhất một tệp cho mỗi phân vùng. Đối với điều này có ý nghĩa bạn phải có một số cột hợp lý để phân vùng trên. Ví dụ, bạn sẽ không muốn phân vùng trên một cột id duy nhất hoặc bạn sẽ có một tệp cho mỗi bản ghi. Cách tiếp cận này sẽ đảm bảo ít nhất tập tin đầu ra cho mỗi phân vùng và tối đa là numPartitions * numReducers
. Đây là một ví dụ (đừng lo lắng quá nhiều về hive.exec.dynamic.partition.mode
, nó cần phải được thiết lập để truy vấn này hoạt động).
hive.exec.dynamic.partition.mode=nonstrict
CREATE TABLE table_to_export_to_redshift (
id INT,
value INT
)
PARTITIONED BY (country STRING)
INSERT OVERWRITE TABLE table_to_export_to_redshift
PARTITION (country)
SELECT id, value, country
FROM some_table
Để kiểm soát tốt hơn, bạn có thể viết tập lệnh giảm của riêng mình để chuyển sang tổ ong và làm giảm tập lệnh viết thành nhiều tệp. Một khi bạn đang viết giảm tốc của riêng bạn, bạn có thể làm khá nhiều bất cứ điều gì bạn muốn.
Cuối cùng, bạn có thể từ bỏ cố gắng điều động Hive để xuất số lượng tệp mong muốn của bạn và chỉ tách chúng ra khỏi chính bạn khi Hive được thực hiện. Theo mặc định, Hive lưu trữ các bảng của nó không nén và trong văn bản thuần túy trong thư mục kho của nó (ví dụ: /apps/hive/warehouse/table_to_export_to_redshift
). Bạn có thể sử dụng các lệnh shell của Hadoop, một công việc MapReduce, Pig, hoặc kéo chúng vào Linux và tách chúng ra ngoài theo ý bạn.
Tôi không có bất kỳ trải nghiệm nào với Redshift, vì vậy một số đề xuất của tôi có thể không phù hợp để sử dụng bởi Redshift vì bất kỳ lý do gì.
Một vài lưu ý: Chia nhỏ tệp thành nhiều hơn, tệp nhỏ hơn thường không tốt cho Hadoop. Bạn có thể nhận được tăng tốc cho Redshift, nhưng nếu các tập tin được tiêu thụ bởi các phần khác của hệ sinh thái Hadoop (MapReduce, Hive, Pig, v.v.) bạn có thể thấy mất hiệu suất nếu các tệp quá nhỏ (mặc dù 1GB sẽ ổn) . Ngoài ra, hãy đảm bảo rằng thời gian xử lý/nhà phát triển thêm đáng giá thời gian bạn tiết kiệm được để song song với tải dữ liệu Redshift của bạn.
Tuyệt vời, cảm ơn –
Ví dụ của bạn không thực hiện bất kỳ phân vùng nào. Cả hai lệnh 'CREATE TABLE' và' INSERT OVERWRITE' cần xác định (các) phân vùng để sử dụng. – libjack
@libjack Cảm ơn bạn đã đánh bắt điều đó. Đã sửa lỗi ở trên. –