2012-07-08 35 views
9

Tôi có truy vấn Hive đang chọn khoảng 30 cột và khoảng 400.000 bản ghi và chèn chúng vào bảng khác. Tôi có một tham gia trong mệnh đề SQL của tôi, đó chỉ là một tham gia bên trong.Hiệu chỉnh điều chỉnh truy vấn Hive

Truy vấn không thành công do vượt quá giới hạn vượt quá giới hạn Java GC.

Điều kỳ lạ là nếu tôi xóa mệnh đề nối và chỉ chọn dữ liệu từ bảng (khối lượng cao hơn một chút) thì truy vấn hoạt động tốt.

Tôi khá mới đối với Hive. Tôi không thể hiểu tại sao sự tham gia này gây ra ngoại lệ bộ nhớ.

Có điều gì mà tôi cần biết về cách viết các truy vấn Hive để chúng không gây ra những vấn đề này không? Bất cứ ai có thể giải thích lý do tại sao việc tham gia có thể gây ra vấn đề này nhưng chọn một khối lượng dữ liệu cao hơn và cùng một số cột thì không.

Đánh giá cao suy nghĩ của bạn về điều này. Cảm ơn

Trả lời

6

Rất cám ơn phản hồi Đánh dấu. Nhiều đánh giá cao.

Sau nhiều giờ tôi cuối cùng đã phát hiện ra thứ tự của các bảng trong câu lệnh nối tạo sự khác biệt. Để đạt hiệu suất tối ưu và quản lý bộ nhớ, lần kết nối cuối cùng phải là bảng lớn nhất.

Thay đổi thứ tự các bảng của tôi trong câu lệnh nối đã khắc phục sự cố.

Xem bảng lớn nhất cuối tại http://hive.apache.org/docs/r0.9.0/language_manual/joins.html

lời giải thích của bạn ở trên là rất hữu ích là tốt. Rất cám ơn

+5

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. –

+0

+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. –

34

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ì?

  1. 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.

  2. 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

  3. 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.

Các vấn đề liên quan