Tùy thuộc vào phiên bản Hive và cấu hình của bạn, câu trả lời cho câu hỏi của bạn có thể thay đổi. Sẽ dễ dàng hơn nếu bạn có thể chia sẻ truy vấn chính xác của mình cùng với các câu lệnh tạo của hai bảng và ước tính kích thước của chúng.
Để hiểu rõ hơn về vấn đề này, chúng ta hãy xem qua cách tham gia bên trong "thông thường" hoạt động trong Hive.
Hive tham gia MapReduce:
Dưới đây là mô tả đơn giản về cách một bên tham gia trong Hive được biên soạn để MapReduce. Nói chung, nếu bạn có hai bảng t1 và t2 với một truy vấn tham gia như:
SELECT
t1.key, t1.value, t2.value
FROM
t1
JOIN
t2 (ON t1.key = t2.key);
đâu, t1 có các nội dung sau:
k_1 v1_1
k_2 v1_2
k_3 v1_3
đâu, t2 có các nội dung sau:
k_2 v2_2
k_3 v2_3
k_4 v2_4
Chúng tôi mong chờ sự tham gia kết quả là
k_2 v1_2 v2_2
k_3 v1_3 v2_3
Giả sử các bảng được lưu trữ trên HDFS, nội dung của chúng sẽ được chia thành Tách tệp. Người lập bản đồ sẽ lấy một tệp chia làm đầu vào và phát ra khóa làm cột khóa của bảng và giá trị dưới dạng tổng hợp của cột giá trị của bảng và cờ (biểu thị bản ghi nào là từ t1 hoặc t2) .
Đối với t1:
k_1, <v1_1, t1>
k_2, <v1_2, t1>
k_3, <v1_3, t1>
Đối với t2:
k_2, <v2_2, t2>
k_3, <v2_3, t2>
k_4, <v2_4, t2>
Bây giờ, những hồ sơ này phát ra ra đi qua các giai đoạn phát ngẫu nhiên mà tất cả các hồ sơ với các phím tương tự được nhóm lại với nhau và gửi đến một giảm tốc. Ngữ cảnh của mỗi thao tác giảm là một khóa và một danh sách chứa tất cả các giá trị tương ứng với khóa đó. Trong thực tế, một bộ giảm tốc sẽ thực hiện một số thao tác giảm.
Trong ví dụ trên, chúng ta sẽ nhận được các nhóm sau:
k_1, <<v1_1, t1>>
k_2, <<v1_2, t1>, <v2_2, t2>>
k_3, <<v1_3, t1>, <v2_3, t2>>
k_4, <<v2_4, t2>>
Đây là những gì xảy ra trong giảm. Đối với mỗi giá trị trong danh sách giá trị, trình giảm tốc sẽ thực hiện phép nhân nếu các giá trị tương ứng với các bảng khác nhau.
Đối với k_1, không có giá trị từ t2 và không có gì được phát ra.
Đối k_2, một phép nhân của các giá trị được phát ra - k_2, v1_2, v2_2 (kể từ khi có một giá trị từ mỗi bảng, 1x1 = 1)
Đối k_3, một phép nhân của các giá trị được phát ra - k_3, v1_3 , v2_3 (vì có một giá trị từ mỗi bảng, 1x1 = 1)
Đối với k_4, không có giá trị nào từ t1 và không có gì được phát ra. Do đó bạn có được kết quả mà bạn mong đợi từ sự tham gia bên trong của bạn.
Ok, vậy tôi phải làm gì?
Có thể có sự sai lệch trong dữ liệu của bạn. Nói cách khác, khi bộ giảm tốc nhận dữ liệu, danh sách các giá trị tương ứng với một số khóa là rất dài gây ra lỗi. Để giảm bớt sự cố, bạn có thể thử tăng bộ nhớ khả dụng cho JVM của mình. Bạn có thể làm như vậy bằng cách đặt mapred.child.java.opts
thành giá trị như -Xmx512M
trong tệp hive-site.xml của bạn. Bạn có thể truy vấn giá trị hiện tại của tham số này bằng cách thực hiện set mapred.child.java.opts;
trong vỏ Hive của bạn.
Bạn có thể thử sử dụng các lựa chọn thay thế để tham gia "thông thường", ví dụ: bản đồ tham gia. Lời giải thích ở trên của các phép nối áp dụng cho các phép nối thường xuyên khi sự kết hợp xảy ra trong các bộ giảm tốc. Tùy thuộc vào phiên bản Hive bạn đang sử dụng, Hive có thể tự động có thể chuyển đổi một phép nối thông thường thành nối bản đồ nhanh hơn (vì việc nối kết diễn ra trong giai đoạn bản đồ). Để bật tối ưu hóa, hãy đặt hive.auto.convert.join
thành true
. Khách sạn này được giới thiệu vào Hive 0.7
Ngoài thiết hive.auto.convert.join
để true
, bạn cũng có thể đặt hive.optimize.skewjoin
để true
. Điều này sẽ làm việc xung quanh độ lệch trong vấn đề dữ liệu của bạn được mô tả trong 1.
Xin chào, bạn nên "chấp nhận" câu trả lời của Mark Grover nếu bạn đồng ý với giải pháp thay vì chấp nhận giải pháp của riêng bạn mà thực sự không phải là giải pháp mà là sự đánh giá đúng câu trả lời. –
+1 trên nhận xét ở trên. Nhưng tôi nghĩ rằng kể từ khi anh ấy mới làm quen với SO, anh ấy có thể không nhận ra mọi thứ hoạt động như thế nào ở đây. –