[
https://issues.apache.org/jira/browse/HBASE-26242?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Xiaolin Ha updated HBASE-26242:
-------------------------------
Description:
In the requestSplit() function (called by the MemstoreFlusher and
CompactionRunner) for a region, it will check the compaction priority of the
region. If compact priority < PRIORITY_USER , it will not split.
{code:java}
public synchronized boolean requestSplit(final Region r) {
// don't split regions that are blocking
HRegion hr = (HRegion)r;
try {
if (shouldSplitRegion() && hr.getCompactPriority() >= PRIORITY_USER) {
byte[] midKey = hr.checkSplit().orElse(null);
if (midKey != null) {
requestSplit(r, midKey);
return true;
}
}
....{code}
But the region's compact priority is the minimum of all the stores, when the
number of storefiles in a store is larger than the configed
`hbase.hstore.blockingStoreFiles`, the priority will be a negative number, but
the compared priority in requestSplit() is 1(PRIORITY_USER).
{code:java}
public int getStoreCompactionPriority() {
int priority = blockingFileCount - storefiles.size();
return (priority == HStore.PRIORITY_USER) ? priority + 1 : priority;
}
{code}
As a result, when a region should split, but its speed of reducing the number
of files through compaction is slower than the speed of generating new
files(e.g. compacting L0 files to stripes, bulk load, flush memstore), the
region will never split. While split can divide the compaction pressure(1
parent compaction + 2 children compaction can be reduced to 2 children
compaction).
The problem is obvious in StripeStoreEngine, though memstore flushing is
pending when store file count up to the blocking count, each L0 compaction may
generate the stripe count new files to each stripe. And in this scenario, since
the store always compact priority to split, the stripe count is larger and
larger, the new files generated by compact is more and more, no split in the
end...
was:
In the requestSplit() function (called by the MemstoreFlusher and
CompactionRunner) for a region, it will check the compaction priority of the
region.
{code:java}
public synchronized boolean requestSplit(final Region r) {
// don't split regions that are blocking
HRegion hr = (HRegion)r;
try {
if (shouldSplitRegion() && hr.getCompactPriority() >= PRIORITY_USER) {
byte[] midKey = hr.checkSplit().orElse(null);
if (midKey != null) {
requestSplit(r, midKey);
return true;
}
}
....{code}
But the region's compact priority is the minimum of all the stores, when the
number of storefiles in one store is larger than the configed
`hbase.hstore.blockingStoreFiles`, the priority will be a negative number, but
the compared PRIORITY_USER is 1.
{code:java}
public int getStoreCompactionPriority() {
int priority = blockingFileCount - storefiles.size();
return (priority == HStore.PRIORITY_USER) ? priority + 1 : priority;
}
{code}
As a result, when a region should split, but its speed of reducing the number
of files through compaction is slower than the speed of flush, the region will
never split.
While split can divide the compaction pressure(1 parent compaction + 2 child
compaction can be reduced to 2 child compaction).
> Region never split when store file count larger than the configed blocking
> file count
> -------------------------------------------------------------------------------------
>
> Key: HBASE-26242
> URL: https://issues.apache.org/jira/browse/HBASE-26242
> Project: HBase
> Issue Type: Improvement
> Affects Versions: 3.0.0-alpha-1, 1.4.0, 2.0.0
> Reporter: Xiaolin Ha
> Priority: Major
>
> In the requestSplit() function (called by the MemstoreFlusher and
> CompactionRunner) for a region, it will check the compaction priority of the
> region. If compact priority < PRIORITY_USER , it will not split.
> {code:java}
> public synchronized boolean requestSplit(final Region r) {
> // don't split regions that are blocking
> HRegion hr = (HRegion)r;
> try {
> if (shouldSplitRegion() && hr.getCompactPriority() >= PRIORITY_USER) {
> byte[] midKey = hr.checkSplit().orElse(null);
> if (midKey != null) {
> requestSplit(r, midKey);
> return true;
> }
> }
> ....{code}
> But the region's compact priority is the minimum of all the stores, when the
> number of storefiles in a store is larger than the configed
> `hbase.hstore.blockingStoreFiles`, the priority will be a negative number,
> but the compared priority in requestSplit() is 1(PRIORITY_USER).
> {code:java}
> public int getStoreCompactionPriority() {
> int priority = blockingFileCount - storefiles.size();
> return (priority == HStore.PRIORITY_USER) ? priority + 1 : priority;
> }
> {code}
> As a result, when a region should split, but its speed of reducing the number
> of files through compaction is slower than the speed of generating new
> files(e.g. compacting L0 files to stripes, bulk load, flush memstore), the
> region will never split. While split can divide the compaction pressure(1
> parent compaction + 2 children compaction can be reduced to 2 children
> compaction).
> The problem is obvious in StripeStoreEngine, though memstore flushing is
> pending when store file count up to the blocking count, each L0 compaction
> may generate the stripe count new files to each stripe. And in this scenario,
> since the store always compact priority to split, the stripe count is larger
> and larger, the new files generated by compact is more and more, no split in
> the end...
>
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)