[
https://issues.apache.org/jira/browse/HBASE-3323?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12970025#action_12970025
]
Todd Lipcon commented on HBASE-3323:
------------------------------------
Hi Cosmin. I agree that the log split process can be fixed up a bit to use a
smaller amount of memory. Fixing the data structure to get rid of all those
extra objects is one thing that's pretty straightfowrard like you mentioned. As
for how to change the split process itself, I think following a more typical
producer/consumer model makes more sense. For example, something like this:
{noformat}
buffers = map<region name, arraylist<edit>>
for each log:
for each edit:
buf = map.get(region) [inserting a new arraylist if necessary]
buf.add(edit)
if buf length > some number of bytes:
while workqueue length > some threshold: wait
workqueue.add(buf)
buffers.remove(region)
{noformat}
then we have a set of threads which pull chunks of edits off the work queue and
write into the appropriate file (where the file handles are kept open).
> OOME in master splitting logs
> -----------------------------
>
> Key: HBASE-3323
> URL: https://issues.apache.org/jira/browse/HBASE-3323
> Project: HBase
> Issue Type: Bug
> Components: master
> Affects Versions: 0.90.0
> Reporter: Todd Lipcon
> Priority: Blocker
> Fix For: 0.90.0
>
> Attachments: sizes.png
>
>
> In testing a RS failure under heavy increment workload I ran into an OOME
> when the master was splitting the logs.
> In this test case, I have exactly 136 bytes per log entry in all the logs,
> and the logs are all around 66-74MB). With a batch size of 3 logs, this means
> the master is loading about 500K-600K edits per log file. Each edit ends up
> creating 3 byte[] objects, the references for which are each 8 bytes of RAM,
> so we have 160 (136+8*3) bytes per edit used by the byte[]. For each edit we
> also allocate a bunch of other objects: one HLog$Entry, one WALEdit, one
> ArrayList, one LinkedList$Entry, one HLogKey, and one KeyValue. Overall this
> works out to 400 bytes of overhead per edit. So, with the default settings on
> this fairly average workload, the 1.5M log entries takes about 770MB of RAM.
> Since I had a few log files that were a bit larger (around 90MB) it exceeded
> 1GB of RAM and I got an OOME.
> For one, the 400 bytes per edit overhead is pretty bad, and we could probably
> be a lot more efficient. For two, we should actually account this rather than
> simply having a configurable "batch size" in the master.
> I think this is a blocker because I'm running with fairly default configs
> here and just killing one RS made the cluster fall over due to master OOME.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.