2013-07-29 78 views
2

當我嘗試使用Flume下載推文並將它們傳送到Hadoop中時,由於缺少Java堆空間而導致內存不足異常。在使用Flume/Hadoop時,Ubuntu中的Java內存不足異常

我已經在Hadoop中的mapred-site.xml中當前設置的堆空間爲4GB,像這樣:

<property> 
    <name>mapred.child.java.opts</name> 
    <value>-Xmx4096m</value> 
</property> 

我希望能不斷地鳴叫下載了兩天,但不能讓過去45分鐘沒有錯誤。

因爲我確實有磁盤空間來保存所有這些,所以我認爲錯誤來自Java必須同時處理這麼多事情。有沒有辦法讓我減慢下載這些推文的速度,或者採取其他措施來解決這個問題?

編輯:flume.conf包括

TwitterAgent.sources = Twitter 
TwitterAgent.channels = MemChannel 
TwitterAgent.sinks = HDFS 

TwitterAgent.sources.Twitter.type = TwitterSource 
TwitterAgent.sources.Twitter.channels = MemChannel 
TwitterAgent.sources.Twitter.consumerKey = <required> 
TwitterAgent.sources.Twitter.consumerSecret = <required> 
TwitterAgent.sources.Twitter.accessToken = <required> 
TwitterAgent.sources.Twitter.accessTokenSecret = <required> 
TwitterAgent.sources.Twitter.keywords = manchester united, man united, man utd, man u 

TwitterAgent.sinks.HDFS.channel = MemChannel 
TwitterAgent.sinks.HDFS.type = hdfs 
TwitterAgent.sinks.HDFS.hdfs.path = hdfs://localhost:50070/user/flume/tweets/%Y/%m/%d/%H/ 
TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream 
TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text 
TwitterAgent.sinks.HDFS.hdfs.batchSize = 1000 
TwitterAgent.sinks.HDFS.hdfs.rollSize = 0 
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000 

TwitterAgent.channels.MemChannel.type = memory 
TwitterAgent.channels.MemChannel.capacity = 10000 
TwitterAgent.channels.MemChannel.transactionCapacity = 100 

編輯2

我已經嘗試增加內存到8GB仍然沒有幫助。我假設我一次性在Hadoop中放置了太多推文,並且需要將它們寫入磁盤並再次釋放空間(或者出現這種情況)。有沒有關於如何做到這一點的指南?

+0

你可以發佈你用來下載推文的Java代碼嗎? – araknoid

+0

完成 - 它在那裏是一個錯誤?我從Cloudera提供的代碼修改了這些代碼。 –

+1

通常'-Xmx4096'也應該包含值爲'-Xmx4096m'的單位。 – araknoid

回答

1

看來問題與批量大小和transactionCapacity有關。我將它們更改爲以下內容:

TwitterAgent.sinks.HDFS.hdfs.batchSize = 100 
TwitterAgent.channels.MemChannel.transactionCapacity = 1000 

這不工作,甚至無需更改JAVA_OPTS值。

0

在flume-env.sh中設置JAVA_OPTS值並啓動flume agent。