2010-08-01 32 views
14

Tôi đang chạy một công việc Hadoop trên 1,5 TB dữ liệu với nhiều mẫu phù hợp. Tôi có một số máy với RAM 16GB mỗi, và tôi luôn luôn nhận được OutOfMemoryException về công việc này với dữ liệu này (tôi đang sử dụng Hive).Làm thế nào để tránh OutOfMemoryException khi chạy Hadoop?

Tôi muốn biết cách tối ưu đặt tùy chọn HADOOP_HEAPSIZE trong tệp hadoop-env.sh vì vậy, công việc của tôi sẽ không thành công. Thậm chí có thể, để đặt tùy chọn này để công việc của tôi sẽ không thành công?

Khi tôi đặt HADOOP_HEAPSIZE thành 1,5 GB và loại bỏ một nửa mẫu phù hợp khỏi truy vấn, công việc chạy thành công. Vì vậy, tùy chọn này là gì, nếu nó không giúp tránh thất bại công việc?

Tôi muốn làm thử nghiệm nhiều hơn với thiết lập tối ưu, nhưng vì những công việc đó mất> 10 giờ để chạy, tôi xin lời khuyên của bạn.

+0

Điều gì khiến bạn nghĩ rằng 'HADOOP_HEAPSIZE' không * không * giúp tránh thất bại? Âm thanh như từ kinh nghiệm của bạn mà nó. Vì những lý do có thể được biết chỉ từ kiểm tra dữ liệu/công việc của bạn, tình huống của bạn yêu cầu kích thước heap ít nhất là lớn này. Bạn có thể tái cấu trúc công việc của bạn để nó không cần một đống lớn như vậy? –

+0

Tôi đã sửa đổi công việc của mình, vì vậy nó không sử dụng một đống lớn như vậy, nhưng cũng tại thời điểm này tôi đã thay đổi 'HADOOP_HEAPSIZE'. Và tôi không thấy kết quả thực sự của chagne này, tôi có nghĩa là: Tại sao thiết lập heap nhỏ hơn: amount_of_my_RAM/number_of_mappers_or_reducers? – wlk

Trả lời

13

Công việc thất bại hay máy chủ của bạn gặp sự cố? Nếu công việc của bạn thất bại vì OutOfMemmory trên các nút, bạn có thể tweek số lượng bản đồ tối đa của bạn và giảm và JVM opts cho mỗi do đó sẽ không bao giờ xảy ra. mapred.child.java.opts (mặc định là 200Xmx) thường phải được tăng lên dựa trên phần cứng của các nút dữ liệu cụ thể của bạn.

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

nhiệm vụ Max có thể được thiết lập trên Namenode hoặc ghi đè (và thiết lập cuối cùng) trên các nút dữ liệu mà có thể có cấu hình phần cứng khác nhau. Nhiệm vụ tối đa được thiết lập cho cả người lập bản đồ và bộ giảm tốc. Để tính toán điều này, nó dựa trên CPU (lõi) và lượng RAM bạn có và cũng là JVM max bạn thiết lập trong mapred.child.java.opts (mặc định là 200). Mỗi Datanode và Tasktracker được thiết lập là 1GB để cho một máy 8GB, mapred.tasktracker.map.tasks.maximum có thể được đặt thành 7 và mapred.tasktracker.reduce.tasks.maximum được đặt thành 7 với mapred.child.java .opts đặt thành -400Xmx (giả sử 8 lõi). Xin lưu ý rằng các max tác vụ này được CPU thực hiện nhiều nếu bạn chỉ có 1 CPU với 1 lõi thì đã đến lúc lấy phần cứng mới cho nút dữ liệu của bạn hoặc đặt nhiệm vụ mặt nạ thành 1. Nếu bạn có 1 CPU với 4 lõi thì thiết lập bản đồ thành 3 và giảm xuống còn 3 sẽ là tốt (tiết kiệm 1 lõi cho daemon).

Theo mặc định, chỉ có một trình giảm tốc và bạn cần định cấu hình mapred.reduce.tasks thành nhiều hơn một. Giá trị này phải ở đâu đó giữa 0,95 và 1,75 lần số lượng tác vụ tối đa trên mỗi nút lần số lượng nút dữ liệu. Vì vậy, nếu bạn có 3 nút dữ liệu và đó là thiết lập tác vụ tối đa là 7 rồi định cấu hình từ 25 đến 36.

Nếu máy chủ của bạn gặp sự cố với OutOfMemory thì đó là nơi HADOOP_HEAPSIZE chỉ xuất hiện trong quá trình đống (không phải thực hiện nhiệm vụ).

Cuối cùng, nếu Công việc của bạn mất nhiều thời gian, bạn có thể kiểm tra xem liệu bạn có bổ sung cấu hình tốt khác là mapred.compress.map.output hay không. Đặt giá trị này thành true (cân bằng giữa thời gian để nén vs chuyển) tăng tốc độ giảm thiểu sao chép rất nhiều đặc biệt là khi làm việc với các tập dữ liệu lớn. Thường thì các công việc cần có thời gian nhưng cũng có các tùy chọn để tinh chỉnh tốc độ tăng lên = 8 ^)

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