Apache Flume: не удается зафиксировать транзакцию. Достигнут лимит места в куче

Я пытаюсь передать некоторые данные в HDFS с помощью Flume с одним агентом, настроенным на наличие источника netcat, канала памяти и приемника HDFS.

Конфигурация следующая:

a1.sources = src1
a1.channels = ch1
a1.sinks = snk1

# SOURCES CONFIGURATION
a1.sources.src1.type = netcat
a1.sources.src1.bind = 0.0.0.0
a1.sources.src1.port = 99999
a1.sources.src1.ack-every-event = false

# SOURCE -> CHANNEL
a1.sources.src1.channels = ch1

# SINKS' CONFIGURATION
a1.sinks.snk1.type = hdfs
a1.sinks.snk1.hdfs.path = /somepath
a1.sinks.snk1.hdfs.writeFormat = Text
a1.sinks.snk1.hdfs.fileType = DataStream
a1.sinks.snk1.hdfs.inUseSuffix = .tmp
a1.sinks.snk1.hdfs.filePrefix = prefix_file
a1.sinks.snk1.hdfs.batchSize = 75000
a1.sinks.snk1.hdfs.rollInterval = 120
a1.sinks.snk1.hdfs.rollCount = 0
a1.sinks.snk1.hdfs.idleTimeout = 0
#128MB for each file maximum = 128 * 1024 (MB) * 1024 (KB) = ...
a1.sinks.snk1.hdfs.rollSize = 134217728

a1.sinks.snk1.hdfs.threadsPoolSize = 25

# SINK <- CHANNEL
a1.sinks.snk1.channel = ch1

# CHANNELS' CONFIGURATION
a1.channels.ch1.type = memory
a1.channels.ch1.capacity = 5000000
a1.channels.ch1.transactionCapacity = 100000
#412MB of byte capacity = 412 * 1024 * 1024 byte
#a1.channels.ch1.byteCapacity = 432013312

Однако, если я отправляю сообщения выше определенной пропускной способности, я получаю следующее исключение:

2014-11-21 05:48:07,035 (netcat-handler-0) [WARN - org.apache.flume.source.NetcatSource$NetcatSocketHandler.processEvents(NetcatSource.java:407)] Error processing event. Exception follows.
org.apache.flume.ChannelException: Unable to put event on required channel: org.apache.flume.channel.MemoryChannel{name: ch1}
        at org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:275)
        at org.apache.flume.source.NetcatSource$NetcatSocketHandler.processEvents(NetcatSource.java:394)
        at org.apache.flume.source.NetcatSource$NetcatSocketHandler.run(NetcatSource.java:321)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.flume.ChannelException: Cannot commit transaction. Heap space limit of 3456106reached. Please increase heap space allocated to the channel as the sinks may not be keeping up with the sources
        at org.apache.flume.channel.MemoryChannel$MemoryTransaction.doCommit(MemoryChannel.java:123)
        at org.apache.flume.channel.BasicTransactionSemantics.commit(BasicTransactionSemantics.java:151)
        at org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:267)
        ... 7 more

Я не понимаю, где я мог бы изменить значение пространства кучи, в моем conf/flume-env.sh у меня есть:

JAVA_OPTS="-Xms256m -Xmx512m -Dcom.sun.management.jmxremote"

Размер пространства кучи в исключении должен быть указан в байтах, что означает, что у меня есть пространство кучи 3,3 МБ, что очень мало, но я не понимаю, откуда это значение...! Как я могу это исправить? Заранее большое спасибо!


person kir    schedule 21.11.2014    source источник
comment
Попробуйте изменить его на JAVA_OPTS="-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote"   -  person Ramanan    schedule 22.11.2014


Ответы (1)


У вас есть несколько nobs, доступных для поверните, чтобы заставить это работать должным образом:

  1. Увеличение byteCapacity: a1.channels.ch1.byteCapacity = 6912212.
  2. Увеличение памяти, как предложено в комментарии выше (JAVA_OPTS="-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote"), вероятно, является лучшим вариантом. Причина в том, что по умолчанию byteCapacity составляет 80% от максимальной памяти процессов, которая уже потребляет много памяти процессов.
  3. Уменьшить byteCapacityBufferPercentage, оставив меньше места для заголовков.
person generalpiston    schedule 23.11.2014
comment
Спасибо за ваш ответ. Я думаю, что byteCapacity уже довольно высока, поскольку она установлена ​​​​на 412 МБ. Я попытаюсь увеличить память Java и дам вам знать, что произойдет. - person kir; 27.11.2014
comment
Хорошо, я увеличил память Java с помощью JAVA_OPTS=-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote, и теперь он точно работает лучше. Я пробовал с более высокой пропускной способностью, чем раньше, и, похоже, это работает. Спасибо! - person kir; 27.11.2014