You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Dave Latham (JIRA)" <ji...@apache.org> on 2013/08/15 23:45:52 UTC

[jira] [Updated] (HBASE-9208) ReplicationLogCleaner slow at large scale

     [ https://issues.apache.org/jira/browse/HBASE-9208?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dave Latham updated HBASE-9208:
-------------------------------

    Attachment: HBASE-9208.patch

Attaching HBASE-9208.patch with the following changes:
 - Updated FileCleanerDelegate from {{boolean isFileDeletable(FileStatus fStat);}} to {{Iterable<FileStatus> getDeletableFiles(Iterable<FileStatus> files);}}
 - Added an abstract BaseFileCleanerDelegate that implements the new batch method in terms of the old method so that existing cleaners will work by extending this base class.
 - Updated CleanerChore to make a single call to each cleaner with a batch of all files for each directory (option (a) in coment above).  Also now catches and logs unexpected IOExceptions for each entry of subdirectories rather than aborting to be consistent with behavior of the top level directory as mentioned above and suggested by Jesse.

It is also available on review board at:
https://reviews.apache.org/r/13608/diff/

Have not updated SnapshotLogCleaner to take advantage of the batching interface.  I intend to create a separate JIRA for that.

A couple more questions arose during the work:
 - ReplicationLogCleaner.stop contains:
{noformat}
// Not sure why we're deleting a connection that we never acquired or used
HConnectionManager.deleteConnection(this.getConf());
{noformat}
Is this correct with the latest work on connection management?
 - The cleaner hierarchy may now be deeper than needed.  In particular there is a FileCleanerDelegate interface which is implemented by a BaseFileCleanerDelegate which is subclased by each of BaseHFileCleanerDelegate (which adds only the stopped field) and BaseLogCleanerDelegate (which includes a deprecated isLogDeletable method).  In turn these are subclassed by the concrete implementations.  Should the base classes be consolidated?

Reviews and input would be greatly appreciated.
                
> ReplicationLogCleaner slow at large scale
> -----------------------------------------
>
>                 Key: HBASE-9208
>                 URL: https://issues.apache.org/jira/browse/HBASE-9208
>             Project: HBase
>          Issue Type: Improvement
>            Reporter: Dave Latham
>            Assignee: Dave Latham
>             Fix For: 0.94.12
>
>         Attachments: HBASE-9208.patch
>
>
> At a large scale the ReplicationLogCleaner fails to clean up .oldlogs as fast as the cluster is producing them.  For each old HLog file that has been replicated and should be deleted the ReplicationLogCleaner checks every replication queue in ZooKeeper before removing it.  This means that as a cluster scales up the number of files to delete scales as well as the time to delete each file so the cleanup chore scales quadratically.  In our case it reached the point where the oldlogs were growing faster than they were being cleaned up.
> We're now running with a patch that allows the ReplicationLogCleaner to refresh its list of files in the replication queues from ZooKeeper just once for each batch of files the CleanerChore wants to evaluate.
> I'd propose updating FileCleanerDelegate to take a List<FileStatus> rather than a single one at a time.  This would allow file cleaners that check an external resource for references such as ZooKeeper (for ReplicationLogCleaner) or HDFS (for SnapshotLogCleaner which looks like it may also have similar trouble at scale) to load those references once per batch rather than for every log.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira