Repository: hbase Updated Branches: refs/heads/branch-1 366d7028e -> 4468f3ce9
HBASE-13829 Add more ThrottleType (Guanghao Zhang) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4468f3ce Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4468f3ce Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4468f3ce Branch: refs/heads/branch-1 Commit: 4468f3ce952a485afc9ca5ac92ef30ac95a97e76 Parents: 366d702 Author: tedyu <[email protected]> Authored: Sat Jun 13 06:30:26 2015 -0700 Committer: tedyu <[email protected]> Committed: Sat Jun 13 06:30:26 2015 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/protobuf/ProtobufUtil.java | 16 ++ .../hbase/quotas/QuotaSettingsFactory.java | 16 ++ .../hadoop/hbase/quotas/ThrottleSettings.java | 4 + .../hadoop/hbase/quotas/ThrottleType.java | 14 +- .../hadoop/hbase/quotas/TestQuotaAdmin.java | 53 +++++- .../hadoop/hbase/quotas/TestQuotaThrottle.java | 174 +++++++++++++++++++ hbase-shell/src/main/ruby/hbase/quotas.rb | 5 +- .../src/main/ruby/shell/commands/set_quota.rb | 16 +- 8 files changed, 289 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java index fca3ca4..f6d08bb 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java @@ -2928,6 +2928,14 @@ public final class ProtobufUtil { return ThrottleType.REQUEST_NUMBER; case REQUEST_SIZE: return ThrottleType.REQUEST_SIZE; + case WRITE_NUMBER: + return ThrottleType.WRITE_NUMBER; + case WRITE_SIZE: + return ThrottleType.WRITE_SIZE; + case READ_NUMBER: + return ThrottleType.READ_NUMBER; + case READ_SIZE: + return ThrottleType.READ_SIZE; default: throw new RuntimeException("Invalid ThrottleType " + proto); } @@ -2944,6 +2952,14 @@ public final class ProtobufUtil { return QuotaProtos.ThrottleType.REQUEST_NUMBER; case REQUEST_SIZE: return QuotaProtos.ThrottleType.REQUEST_SIZE; + case WRITE_NUMBER: + return QuotaProtos.ThrottleType.WRITE_NUMBER; + case WRITE_SIZE: + return QuotaProtos.ThrottleType.WRITE_SIZE; + case READ_NUMBER: + return QuotaProtos.ThrottleType.READ_NUMBER; + case READ_SIZE: + return QuotaProtos.ThrottleType.READ_SIZE; default: throw new RuntimeException("Invalid ThrottleType " + type); } http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java index 2499e06..f78c7f8 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java @@ -103,6 +103,22 @@ public class QuotaSettingsFactory { settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, namespace, ThrottleType.REQUEST_SIZE, throttle.getReqSize())); } + if (throttle.hasWriteNum()) { + settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, namespace, + ThrottleType.WRITE_NUMBER, throttle.getWriteNum())); + } + if (throttle.hasWriteSize()) { + settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, namespace, + ThrottleType.WRITE_SIZE, throttle.getWriteSize())); + } + if (throttle.hasReadNum()) { + settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, namespace, + ThrottleType.READ_NUMBER, throttle.getReadNum())); + } + if (throttle.hasReadSize()) { + settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, namespace, + ThrottleType.READ_SIZE, throttle.getReadSize())); + } return settings; } http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java index dc036b4..0665fe1 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java @@ -67,9 +67,13 @@ class ThrottleSettings extends QuotaSettings { if (timedQuota.hasSoftLimit()) { switch (getThrottleType()) { case REQUEST_NUMBER: + case WRITE_NUMBER: + case READ_NUMBER: builder.append(String.format("%dreq", timedQuota.getSoftLimit())); break; case REQUEST_SIZE: + case WRITE_SIZE: + case READ_SIZE: builder.append(sizeToString(timedQuota.getSoftLimit())); break; default: http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java index bb5c093..9b456c2 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java @@ -26,9 +26,21 @@ import org.apache.hadoop.hbase.classification.InterfaceStability; @InterfaceAudience.Public @InterfaceStability.Evolving public enum ThrottleType { - /** Throttling based on the number of request per time-unit */ + /** Throttling based on the number of requests per time-unit */ REQUEST_NUMBER, /** Throttling based on the read+write data size */ REQUEST_SIZE, + + /** Throttling based on the number of write requests per time-unit */ + WRITE_NUMBER, + + /** Throttling based on the write data size */ + WRITE_SIZE, + + /** Throttling based on the number of read requests per time-unit */ + READ_NUMBER, + + /** Throttling based on the read data size */ + READ_SIZE, } http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java index 6b92443..f3aa1ff 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java @@ -57,6 +57,54 @@ public class TestQuotaAdmin { } @Test + public void testThrottleType() throws Exception { + Admin admin = TEST_UTIL.getHBaseAdmin(); + String userName = User.getCurrent().getShortName(); + + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, ThrottleType.WRITE_NUMBER, 12, TimeUnit.MINUTES)); + admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, true)); + + try (QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration())) { + int countThrottle = 0; + int countGlobalBypass = 0; + for (QuotaSettings settings: scanner) { + switch (settings.getQuotaType()) { + case THROTTLE: + ThrottleSettings throttle = (ThrottleSettings)settings; + if (throttle.getSoftLimit() == 6) { + assertEquals(ThrottleType.READ_NUMBER, throttle.getThrottleType()); + } else if (throttle.getSoftLimit() == 12) { + assertEquals(ThrottleType.WRITE_NUMBER, throttle.getThrottleType()); + } else { + fail("should not come here, because don't set quota with this limit"); + } + assertEquals(userName, throttle.getUserName()); + assertEquals(null, throttle.getTableName()); + assertEquals(null, throttle.getNamespace()); + assertEquals(TimeUnit.MINUTES, throttle.getTimeUnit()); + countThrottle++; + break; + case GLOBAL_BYPASS: + countGlobalBypass++; + break; + default: + fail("unexpected settings type: " + settings.getQuotaType()); + } + } + assertEquals(2, countThrottle); + assertEquals(1, countGlobalBypass); + } + + admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName)); + assertNumResults(1, null); + admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, false)); + assertNumResults(0, null); + } + + @Test public void testSimpleScan() throws Exception { Admin admin = TEST_UTIL.getHBaseAdmin(); String userName = User.getCurrent().getShortName(); @@ -65,8 +113,7 @@ public class TestQuotaAdmin { TimeUnit.MINUTES)); admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, true)); - QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration()); - try { + try (QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration())) { int countThrottle = 0; int countGlobalBypass = 0; for (QuotaSettings settings : scanner) { @@ -90,8 +137,6 @@ public class TestQuotaAdmin { } assertEquals(1, countThrottle); assertEquals(1, countGlobalBypass); - } finally { - scanner.close(); } admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName)); http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java index 4bb0d35..4605663 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java @@ -118,6 +118,38 @@ public class TestQuotaThrottle { assertEquals(60, doGets(60, tables)); } + @Test(timeout=60000) + public void testUserGlobalReadAndWriteThrottle() throws Exception { + final Admin admin = TEST_UTIL.getHBaseAdmin(); + final String userName = User.getCurrent().getShortName(); + + // Add 6req/min limit for read request + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES); + + // not limit for write request and should execute at max 6 read requests + assertEquals(60, doPuts(60, tables)); + assertEquals(6, doGets(100, tables)); + + waitMinuteQuota(); + + // Add 6req/min limit for write request + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES); + + // should execute at max 6 read requests and at max 6 write write requests + assertEquals(6, doGets(100, tables)); + assertEquals(6, doPuts(60, tables)); + + // Remove all the limits + admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName)); + triggerUserCacheRefresh(true, TABLE_NAMES); + assertEquals(60, doPuts(60, tables)); + assertEquals(60, doGets(60, tables)); + } + @Test(timeout = 60000) public void testUserTableThrottle() throws Exception { final Admin admin = TEST_UTIL.getHBaseAdmin(); @@ -143,6 +175,47 @@ public class TestQuotaThrottle { assertEquals(60, doGets(60, tables)); } + @Test(timeout=60000) + public void testUserTableReadAndWriteThrottle() throws Exception { + final Admin admin = TEST_UTIL.getHBaseAdmin(); + final String userName = User.getCurrent().getShortName(); + + // Add 6req/min limit for write request on tables[0] + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, TABLE_NAMES[0], ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 write requests and have no limit for read request + assertEquals(6, doPuts(100, tables[0])); + assertEquals(60, doGets(60, tables[0])); + + // no limit on tables[1] + assertEquals(60, doPuts(60, tables[1])); + assertEquals(60, doGets(60, tables[1])); + + // wait a minute and you should get other 6 write requests executed + waitMinuteQuota(); + + // Add 6req/min limit for read request on tables[0] + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, TABLE_NAMES[0], ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 read requests and at max 6 write requests + assertEquals(6, doPuts(100, tables[0])); + assertEquals(6, doGets(60, tables[0])); + + // no limit on tables[1] + assertEquals(30, doPuts(30, tables[1])); + assertEquals(30, doGets(30, tables[1])); + + // Remove all the limits + admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName, TABLE_NAMES[0])); + triggerUserCacheRefresh(true, TABLE_NAMES); + assertEquals(60, doPuts(60, tables)); + assertEquals(60, doGets(60, tables)); + } + @Test(timeout = 60000) public void testUserNamespaceThrottle() throws Exception { final Admin admin = TEST_UTIL.getHBaseAdmin(); @@ -168,6 +241,39 @@ public class TestQuotaThrottle { assertEquals(60, doGets(60, tables)); } + @Test(timeout=60000) + public void testUserNamespaceReadAndWriteThrottle() throws Exception { + final Admin admin = TEST_UTIL.getHBaseAdmin(); + final String userName = User.getCurrent().getShortName(); + final String NAMESPACE = "default"; + + // Add 6req/min limit for read request + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, NAMESPACE, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 read requests and have no limit for write request + assertEquals(6, doGets(60, tables[0])); + assertEquals(60, doPuts(60, tables[0])); + + waitMinuteQuota(); + + // Add 6req/min limit for write request, too + admin.setQuota(QuotaSettingsFactory + .throttleUser(userName, NAMESPACE, ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES)); + triggerUserCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 read requests and at max 6 write requests + assertEquals(6, doGets(60, tables[0])); + assertEquals(6, doPuts(60, tables[0])); + + // Remove all the limits + admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName, NAMESPACE)); + triggerUserCacheRefresh(true, TABLE_NAMES); + assertEquals(60, doPuts(60, tables)); + assertEquals(60, doGets(60, tables)); + } + @Test(timeout = 60000) public void testTableGlobalThrottle() throws Exception { final Admin admin = TEST_UTIL.getHBaseAdmin(); @@ -192,6 +298,43 @@ public class TestQuotaThrottle { assertEquals(80, doGets(80, tables[0], tables[1])); } + @Test(timeout=60000) + public void testTableGlobalReadAndWriteThrottle() throws Exception { + final Admin admin = TEST_UTIL.getHBaseAdmin(); + + // Add 6req/min limit for read request + admin.setQuota(QuotaSettingsFactory + .throttleTable(TABLE_NAMES[0], ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + triggerTableCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 read requests and have no limit for write request + assertEquals(6, doGets(100, tables[0])); + assertEquals(100, doPuts(100, tables[0])); + // should have no limits on tables[1] + assertEquals(30, doPuts(30, tables[1])); + assertEquals(30, doGets(30, tables[1])); + + // wait a minute and you should get other 6 requests executed + waitMinuteQuota(); + + // Add 6req/min limit for write request, too + admin.setQuota(QuotaSettingsFactory + .throttleTable(TABLE_NAMES[0], ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES)); + triggerTableCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 read requests and at max 6 write requests + assertEquals(6, doGets(100, tables[0])); + assertEquals(6, doPuts(100, tables[0])); + // should have no limits on tables[1] + assertEquals(30, doPuts(30, tables[1])); + assertEquals(30, doGets(30, tables[1])); + + // Remove all the limits + admin.setQuota(QuotaSettingsFactory.unthrottleTable(TABLE_NAMES[0])); + triggerTableCacheRefresh(true, TABLE_NAMES[0]); + assertEquals(80, doGets(80, tables[0], tables[1])); + } + @Test(timeout = 60000) public void testNamespaceGlobalThrottle() throws Exception { final Admin admin = TEST_UTIL.getHBaseAdmin(); @@ -214,6 +357,37 @@ public class TestQuotaThrottle { assertEquals(40, doPuts(40, tables[0])); } + @Test(timeout=60000) + public void testNamespaceGlobalReadAndWriteThrottle() throws Exception { + final Admin admin = TEST_UTIL.getHBaseAdmin(); + final String NAMESPACE = "default"; + + // Add 6req/min limit for write request + admin.setQuota(QuotaSettingsFactory + .throttleNamespace(NAMESPACE, ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES)); + triggerNamespaceCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 write requests and no limit for read request + assertEquals(6, doPuts(100, tables[0])); + assertEquals(100, doGets(100, tables[0])); + + // wait a minute and you should get other 6 requests executed + waitMinuteQuota(); + + // Add 6req/min limit for read request, too + admin.setQuota(QuotaSettingsFactory + .throttleNamespace(NAMESPACE, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES)); + triggerNamespaceCacheRefresh(false, TABLE_NAMES[0]); + + // should execute at max 6 write requests and at max 6 read requests + assertEquals(6, doPuts(100, tables[0])); + assertEquals(6, doGets(100, tables[0])); + + admin.setQuota(QuotaSettingsFactory.unthrottleNamespace(NAMESPACE)); + triggerNamespaceCacheRefresh(true, TABLE_NAMES[0]); + assertEquals(40, doPuts(40, tables[0])); + } + @Test(timeout = 60000) public void testUserAndTableThrottle() throws Exception { final Admin admin = TEST_UTIL.getHBaseAdmin(); http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-shell/src/main/ruby/hbase/quotas.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/hbase/quotas.rb b/hbase-shell/src/main/ruby/hbase/quotas.rb index fa076a5..0be428d 100644 --- a/hbase-shell/src/main/ruby/hbase/quotas.rb +++ b/hbase-shell/src/main/ruby/hbase/quotas.rb @@ -30,6 +30,8 @@ module HBaseQuotasConstants THROTTLE_TYPE = 'THROTTLE_TYPE' THROTTLE = 'THROTTLE' REQUEST = 'REQUEST' + WRITE = 'WRITE' + READ = 'READ' end module Hbase @@ -46,6 +48,7 @@ module Hbase def throttle(args) raise(ArgumentError, "Arguments should be a Hash") unless args.kind_of?(Hash) type = args.fetch(THROTTLE_TYPE, REQUEST) + args.delete(THROTTLE_TYPE) type, limit, time_unit = _parse_limit(args.delete(LIMIT), ThrottleType, type) if args.has_key?(USER) user = args.delete(USER) @@ -213,4 +216,4 @@ module Hbase return value end end -end \ No newline at end of file +end http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-shell/src/main/ruby/shell/commands/set_quota.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/set_quota.rb b/hbase-shell/src/main/ruby/shell/commands/set_quota.rb index 40e8a10..a638b93 100644 --- a/hbase-shell/src/main/ruby/shell/commands/set_quota.rb +++ b/hbase-shell/src/main/ruby/shell/commands/set_quota.rb @@ -26,21 +26,31 @@ Set a quota for a user, table, or namespace. Syntax : set_quota TYPE => <type>, <args> TYPE => THROTTLE -The request limit can be expressed using the form 100req/sec, 100req/min -and the size limit can be expressed using the form 100k/sec, 100M/min -with (B, K, M, G, T, P) as valid size unit and (sec, min, hour, day) as valid time unit. +User can either set quota on read, write or on both the requests together(i.e., read+write) +The read, write, or read+write(default throttle type) request limit can be expressed using +the form 100req/sec, 100req/min and the read, write, read+write(default throttle type) limit +can be expressed using the form 100k/sec, 100M/min with (B, K, M, G, T, P) as valid size unit +and (sec, min, hour, day) as valid time unit. Currently the throttle limit is per machine - a limit of 100req/min means that each machine can execute 100req/min. For example: hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10req/sec' + hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', LIMIT => '10req/sec' + hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10M/sec' + hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec' + hbase> set_quota TYPE => THROTTLE, USER => 'u1', TABLE => 't2', LIMIT => '5K/min' hbase> set_quota TYPE => THROTTLE, USER => 'u1', NAMESPACE => 'ns2', LIMIT => NONE + hbase> set_quota TYPE => THROTTLE, NAMESPACE => 'ns1', LIMIT => '10req/sec' hbase> set_quota TYPE => THROTTLE, TABLE => 't1', LIMIT => '10M/sec' + hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, TABLE => 't1', LIMIT => '10M/sec' hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => NONE + hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => NONE + hbase> set_quota USER => 'u1', GLOBAL_BYPASS => true EOF end
