2011-11-05 40 views
9

Tôi đang cố gắng chạy một công việc bộ nhớ cao trên cụm Hadoop (0.20.203). Tôi đã sửa đổi tệp mapred-site.xml để thực thi một số giới hạn bộ nhớ.Chỉ định giới hạn bộ nhớ với hadoop

<property> 
    <name>mapred.cluster.max.map.memory.mb</name> 
    <value>4096</value> 
    </property> 
    <property> 
    <name>mapred.cluster.max.reduce.memory.mb</name> 
    <value>4096</value> 
    </property> 
    <property> 
    <name>mapred.cluster.map.memory.mb</name> 
    <value>2048</value> 
    </property> 
    <property> 
    <name>mapred.cluster.reduce.memory.mb</name> 
    <value>2048</value> 
    </property> 

Trong công việc của mình, tôi đang chỉ định lượng bộ nhớ mình cần. Thật không may, mặc dù tôi đang chạy quá trình của tôi với -Xmx2g (công việc sẽ chạy tốt với bộ nhớ này nhiều như một ứng dụng giao diện điều khiển) Tôi cần phải yêu cầu bộ nhớ nhiều hơn cho người lập bản đồ của tôi (như là một subquestion, tại sao điều này?) Hoặc nó là bị giết.

val conf = new Configuration() 
conf.set("mapred.child.java.opts", "-Xms256m -Xmx2g -XX:+UseSerialGC"); 
conf.set("mapred.job.map.memory.mb", "4096"); 
conf.set("mapred.job.reduce.memory.mb", "1024"); 

Bộ giảm tốc này hầu như không cần bất kỳ bộ nhớ nào vì tôi đang thực hiện trình giảm nhận dạng.

class IdentityReducer[K, V] extends Reducer[K, V, K, V] { 
    override def reduce(key: K, 
     values: java.lang.Iterable[V], 
     context:Reducer[K,V,K,V]#Context) { 
     for (v <- values) { 
     context write (key, v) 
     } 
    } 
    } 

Tuy nhiên, trình giảm tốc vẫn đang sử dụng nhiều bộ nhớ. Có thể cung cấp cho các đối số JVM giảm khác so với trình ánh xạ không? Hadoop giết bộ giảm tốc và tuyên bố nó đang sử dụng bộ nhớ 3960 MB! Và các bộ giảm tốc không kết thúc công việc. Sao có thể như thế được?

TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits. 
Current usage : 4152717312bytes. 
Limit : 1073741824bytes. 
Killing task. 

UPDATE: ngay cả khi tôi chỉ định một công việc trực tuyến với cat như mapper và uniq như là sản phẩm giảm và -Xms512M -Xmx1g -XX:+UseSerialGC nhiệm vụ của tôi mất hơn 2g bộ nhớ ảo! Điều này có vẻ lộng lẫy ở 4x kích thước heap tối đa.

TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits. 
Current usage : 2186784768bytes. 
Limit : 2147483648bytes. 
Killing task. 

Cập nhật: các original JIRA cho việc thay đổi định dạng cấu hình để sử dụng bộ nhớ đặc biệt đề cập đến việc sử dụng Java là chủ yếu quan tâm đến bộ nhớ vật lý để ngăn chặn trận đòn. Tôi nghĩ rằng đây là chính xác những gì tôi muốn: Tôi không muốn một nút để quay lên một người lập bản đồ nếu có bộ nhớ vật lý không đầy đủ có sẵn. Tuy nhiên, tất cả các tùy chọn này dường như đã được thực hiện như những ràng buộc bộ nhớ ảo, rất khó quản lý.

+0

Chỉ cần tò mò - sự khác biệt giữa việc thiết lập bộ nhớ tối đa bằng cách sử dụng mapred.child.java.opts/-Xmx và mapred.job.map.memory.mb/mapred.job.reduce.memory.mb là gì? Tôi đã đưa ra một truy vấn trong SO (http://goo.gl/aIBLr), nhưng không có phản hồi. –

Trả lời

6

Kiểm tra ulimit của bạn. Từ Cloudera, trên phiên bản 0.20.2, nhưng một vấn đề tương tự có thể được áp dụng cho các phiên bản sau:

... nếu bạn thiết lập mapred.child.ulimit, điều quan trọng là nó phải có nhiều hơn hai lần so với đống giá trị kích thước được đặt trong mapred.child.java.opts. Ví dụ: , nếu bạn đặt heap 1G, hãy đặt mapred.child.ulimit thành 2.5GB. Trẻ em quy trình hiện được đảm bảo để ngã ba ít nhất một lần và ngã ba trong giây lát yêu cầu gấp đôi chi phí trong bộ nhớ ảo.

Cũng có thể thiết lập mapred.child.java.opts theo chương trình là "quá trễ"; bạn có thể muốn xác minh nó thực sự đang có hiệu lực, và đặt nó trong mapred-site.xml của bạn nếu không.

+1

Có vẻ như 'ulimit' là một ràng buộc chặt chẽ hơn' mapred.job.reduce.memory.mb' và nó không được thiết lập trong quá trình cài đặt của tôi. Đó là một tài liệu tham khảo hữu ích cho bao nhiêu VM để cho phép tuy nhiên ... – schmmd

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