2

当我尝试使用 Flume 下载推文并将它们通过管道传输到 Hadoop 时,由于缺少 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 中放置了太多推文,需要将它们写入磁盘并再次释放空间(或类似的东西)。是否有关于如何执行此操作的指南?

4

2 回答 2

1

在 flume-env.sh 中设置 JAVA_OPTS 值并启动 Flume 代理。

于 2013-07-30T19:28:04.137 回答
1

看来问题与批量大小和事务容量有关。我将它们更改为以下内容:

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

这甚至不需要我更改 JAVA_OPTS 值。

于 2013-08-12T14:09:14.780 回答