http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone3/cloudstone3.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone3/cloudstone3.py b/test/bench/cloudstone3/cloudstone3.py new file mode 100755 index 0000000..e6e1bca --- /dev/null +++ b/test/bench/cloudstone3/cloudstone3.py @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.IngestBenchmark import IngestBenchmark + +class CloudStone3(IngestBenchmark): + "TestIngest one thousand chunky records on each tserver" + + _size = 65535 + _count = 10000 + + def size(self): + return self._size + + def count(self): + return self._count + + def setSpeed(self, speed): + if speed == "fast": + self._size = 2**10 + self._count = 1000 + elif speed == "medium": + self._size = 2**13 + self._count = 5000 + elif speed == "slow": + self._size = 2**16 + self._count = 10000 + + +def suite(): + result = unittest.TestSuite([ + CloudStone3(), + ]) + return result
http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone4/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone4/__init__.py b/test/bench/cloudstone4/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/cloudstone4/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone4/cloudstone4.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone4/cloudstone4.py b/test/bench/cloudstone4/cloudstone4.py new file mode 100755 index 0000000..c87bec9 --- /dev/null +++ b/test/bench/cloudstone4/cloudstone4.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.TeraSortBenchmark import TeraSortBenchmark + +class CloudStone4(TeraSortBenchmark): + "TestCloudIngest one terabyte of data" + +def suite(): + result = unittest.TestSuite([ + CloudStone4(), + ]) + return result http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone5/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone5/__init__.py b/test/bench/cloudstone5/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/cloudstone5/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone5/cloudstone5.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone5/cloudstone5.py b/test/bench/cloudstone5/cloudstone5.py new file mode 100755 index 0000000..2c4ba78 --- /dev/null +++ b/test/bench/cloudstone5/cloudstone5.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.TableSplitsBenchmark import TableSplitsBenchmark + +class CloudStone5(TableSplitsBenchmark): + "Creates a table with many splits" + +def suite(): + result = unittest.TestSuite([ + CloudStone5(), + ]) + return result http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone6/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone6/__init__.py b/test/bench/cloudstone6/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/cloudstone6/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone6/cloudstone6.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone6/cloudstone6.py b/test/bench/cloudstone6/cloudstone6.py new file mode 100755 index 0000000..6e72633 --- /dev/null +++ b/test/bench/cloudstone6/cloudstone6.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.CreateTablesBenchmark import CreateTablesBenchmark + +class CloudStone6(CreateTablesBenchmark): + "Creates many tables and then deletes them" + +def suite(): + result = unittest.TestSuite([ + CloudStone6(), + ]) + return result http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone7/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone7/__init__.py b/test/bench/cloudstone7/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/cloudstone7/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone7/cloudstone7.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone7/cloudstone7.py b/test/bench/cloudstone7/cloudstone7.py new file mode 100755 index 0000000..1933a4b --- /dev/null +++ b/test/bench/cloudstone7/cloudstone7.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.RowHashBenchmark import RowHashBenchmark + +class CloudStone7(RowHashBenchmark): + "Hashes all the rows in an accumulo table and outputs them to another table" + +def suite(): + result = unittest.TestSuite([ + CloudStone7(), + ]) + return result http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone8/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone8/__init__.py b/test/bench/cloudstone8/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/cloudstone8/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone8/cloudstone8.py ---------------------------------------------------------------------- diff --git a/test/bench/cloudstone8/cloudstone8.py b/test/bench/cloudstone8/cloudstone8.py new file mode 100755 index 0000000..a02a0a1 --- /dev/null +++ b/test/bench/cloudstone8/cloudstone8.py @@ -0,0 +1,64 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.TeraSortBenchmark import TeraSortBenchmark + +class CloudStone8(TeraSortBenchmark): + "Tests variable length input keys and values" + + keymin = 10 + keymax = 50 + valmin = 100 + valmax = 500 + rows = 1000000 + tablename = 'VariableLengthIngestTable' + + + def shortDescription(self): + return 'Ingests %d rows of variable key and value length to be sorted. '\ + 'Lower score is better.' % (self.numrows()) + + def setSpeed(self, speed): + if speed == "slow": + self.rows = 1000000 + self.keymin = 60 + self.keymax = 100 + self.valmin = 200 + self.valmax = 300 + self.numsplits = 400 + elif speed == "medium": + self.rows = 100000 + self.keymin = 40 + self.keymax = 70 + self.valmin = 130 + self.valmax = 170 + self.numsplits = 40 + elif speed == "fast": + self.rows = 10000 + self.keymin = 30 + self.keymax = 50 + self.valmin = 80 + self.valmax = 100 + self.numsplits = 4 + +def suite(): + result = unittest.TestSuite([ + CloudStone8(), + ]) + return result http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/Benchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/Benchmark.py b/test/bench/lib/Benchmark.py new file mode 100755 index 0000000..1481ccf --- /dev/null +++ b/test/bench/lib/Benchmark.py @@ -0,0 +1,115 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time + +import unittest +import os +import glob +import sys + +from options import log + +from path import accumulo + +class Benchmark(unittest.TestCase): + + username = '' + password = '' + zookeepers = '' + instance = '' + + def __init__(self): + unittest.TestCase.__init__(self) + self.finished = None + + def name(self): + return self.__class__.__name__ + + def setUp(self): + # verify accumulo is running + self.start = time.time() + + def tearDown(self): + self.stop = time.time() + log.debug("Runtime: %.2f", self.stop - self.start) + self.finished = True + + def runTime(self): + return self.stop - self.start + + def score(self): + if self.finished: + return self.runTime() + return 0. + + # Each class that extends Benchmark should overwrite this + def setSpeed(self, speed): + print "Classes that extend Benchmark need to override setSpeed." + + + def setUsername(self, user): + self.username = user + + def getUsername(self): + return self.username + + def setPassword(self, password): + self.password = password + + def getPassword(self): + return self.password + + def setZookeepers(self, zookeepers): + self.zookeepers = zookeepers + + def getZookeepers(self): + return self.zookeepers + + def setInstance(self, instance): + self.instance = instance + + def getInstance(self): + return self.instance + + def sleep(self, tts): + time.sleep(tts) + + def needsAuthentication(self): + return 0 + + def findjar(self, path): + globjar = [ j for j in glob.glob(path) if j.find('javadoc') == -1 and j.find('sources') == -1 ] + return globjar[0] + + # Returns the location of the local test jar + def gettestjar(self): + return self.findjar(accumulo() + '/lib/accumulo-test.jar') + + # Returns a string of core, thrift and zookeeper jars with a specified delim + def getjars(self, delim=','): + accumulo_core_jar = self.findjar(accumulo('lib', 'accumulo-core.jar')) + accumulo_start_jar = self.findjar(accumulo('lib', 'accumulo-start.jar')) + accumulo_fate_jar = self.findjar(accumulo('lib', 'accumulo-fate.jar')) + accumulo_trace_jar = self.findjar(accumulo('lib', 'accumulo-trace.jar')) + accumulo_thrift_jar = self.findjar(accumulo('lib', 'libthrift.jar')) + accumulo_zookeeper_jar = self.findjar(os.path.join(os.getenv('ZOOKEEPER_HOME'), 'zookeeper*.jar')) + return delim.join([accumulo_core_jar, accumulo_thrift_jar, accumulo_zookeeper_jar, accumulo_start_jar, + accumulo_fate_jar, accumulo_trace_jar]) + + # Builds the running command for the map/reduce class specified sans the arguments + def buildcommand(self, classname, *args): + return [accumulo('bin', 'accumulo'), classname, '-libjars', self.getjars()] + list(map(str, args)) + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/CreateTablesBenchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/CreateTablesBenchmark.py b/test/bench/lib/CreateTablesBenchmark.py new file mode 100755 index 0000000..e5761d6 --- /dev/null +++ b/test/bench/lib/CreateTablesBenchmark.py @@ -0,0 +1,78 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import subprocess + +from lib import cloudshell, runner, path +from lib.Benchmark import Benchmark +from lib.tservers import runEach, tserverNames +from lib.path import accumulo, accumuloJar +from lib.util import sleep +from lib.options import log + +class CreateTablesBenchmark(Benchmark): + "Creating and deleting tables" + + tables = 1000 + + def setUp(self): + for x in range(1, self.tables): + currentTable = 'test_ingest%d' % (x) + log.debug("Checking for table existence: %s" % currentTable) + code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % currentTable) + if out.find('does not exist') == -1: + command = 'deletetable -f %s\n' % (currentTable) + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, 'Did not successfully delete table: %s' % currentTable) + Benchmark.setUp(self) + + def runTest(self): + for x in range(1, self.tables): + currentTable = 'test_ingest%d' % (x) + command = 'createtable %s\n' % (currentTable) + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, 'Did not successfully create table: %s' % currentTable) + # print err + for x in range(1, self.tables): + currentTable = 'test_ingest%d' % (x) + command = 'deletetable -f %s\n' % (currentTable) + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, 'Did not successfully delete table: %s' % currentTable) + # print err + log.debug("Process finished") + return code, out, err + + def numTables(self): + return self.tables + + def shortDescription(self): + return 'Creates %d tables and then deletes them. '\ + 'Lower score is better.' % (self.numTables()) + + def setSpeed(self, speed): + if speed == "slow": + self.tables = 50 + elif speed == "medium": + self.tables = 10 + elif speed == "fast": + self.tables = 5 + + def needsAuthentication(self): + return 1 http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/IngestBenchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/IngestBenchmark.py b/test/bench/lib/IngestBenchmark.py new file mode 100755 index 0000000..3036c28 --- /dev/null +++ b/test/bench/lib/IngestBenchmark.py @@ -0,0 +1,94 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import unittest + +from lib import cloudshell +from lib.Benchmark import Benchmark +from lib.tservers import runEach, tserverNames +from lib.path import accumulo, accumuloJar +from lib.util import sleep +from lib.options import log + +class IngestBenchmark(Benchmark): + "TestIngest records on each tserver" + + rows = 1000000 + + def setUp(self): + code, out, err = cloudshell.run(self.username, self.password, 'table test_ingest\n') + if out.find('does not exist') == -1: + log.debug("Deleting table test_ingest") + code, out, err = cloudshell.run(self.username, self.password, 'deletetable test_ingest -f\n') + self.assertEquals(code, 0, "Could not delete the table 'test_ingest'") + code, out, err = cloudshell.run(self.username, self.password, 'createtable test_ingest\n') + self.assertEqual(code, 0, "Could not create the table 'test_ingest'") + Benchmark.setUp(self) + + def tearDown(self): + command = 'deletetable test_ingest -f\n' + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, "Could not delete the table 'test_ingest'") + Benchmark.tearDown(self) + + def size(self): + return 50 + + def random(self): + return 56 + + def count(self): + return self.rows + + def runTest(self): + commands = {} + for i, s in enumerate(tserverNames()): + commands[s] = '%s %s -u %s -p %s --size %d --random %d --rows %d --start %d --cols %d' % ( + accumulo('bin', 'accumulo'), + 'org.apache.accumulo.test.TestIngest', + self.username, self.password, + self.size(), + self.random(), + self.count(), + i*self.count(), + 1) + results = runEach(commands) + codes = {} + for tserver, (code, out, err) in results.items(): + codes.setdefault(code, []) + codes[code].append(tserver) + for code, tservers in codes.items(): + if code != 0: + self.assertEqual(code, 0, "Bad exit code (%d) from tservers %r" % (code, tservers)) + + def score(self): + if self.finished: + return self.count() * self.size() / 1e6 / self.runTime() + return 0. + + def shortDescription(self): + return 'Ingest %d rows of values %d bytes on every tserver. '\ + 'Higher is better.' % (self.count(), self.size()) + + def setSpeed(self, speed): + if speed == "fast": + self.rows = 10000 + elif speed == "medium": + self.rows = 100000 + elif speed == "slow": + self.rows = 1000000 + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/RowHashBenchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/RowHashBenchmark.py b/test/bench/lib/RowHashBenchmark.py new file mode 100755 index 0000000..34009d6 --- /dev/null +++ b/test/bench/lib/RowHashBenchmark.py @@ -0,0 +1,136 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import subprocess +import os +import glob +import random +import time + +from lib import cloudshell, runner, path +from lib.Benchmark import Benchmark +from lib.tservers import runEach, tserverNames +from lib.path import accumulo, accumuloJar +from lib.util import sleep +from lib.options import log + +class RowHashBenchmark(Benchmark): + "RowHashing Benchmark" + + keymin = 10 + keymax = 10 + valmin = 80 + valmax = 80 + rows = 1000000 + maxmaps = 60 + hadoop_version = '' + input_table = 'RowHashTestInput' + output_table = 'RowHashTestOutput' + + def setUp(self): + dir = os.path.dirname(os.path.realpath(__file__)) + file = os.path.join( dir, 'splits' ) + code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.input_table) + if out.find('does not exist') == -1: + code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' % self.input_table) + self.sleep(15) + code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.input_table, file)) + code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.output_table) + if out.find('does not exist') == -1: + code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' % + self.output_table) + self.sleep(15) + code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.output_table, file)) + command = self.buildcommand('org.apache.accumulo.test.mapreduce.TeraSortIngest', + '--count', self.numrows(), + '-nk', self.keysizemin(), + '-xk', self.keysizemax(), + '-nv', self.minvaluesize(), + '-xv', self.maxvaluesize(), + '--table', self.input_table, + '-i', self.getInstance(), + '-z', self.getZookeepers(), + '-u', self.getUsername(), + '-p', self.getPassword(), + '--splits', self.maxmaps) + handle = runner.start(command, stdin=subprocess.PIPE) + log.debug("Running: %r", command) + out, err = handle.communicate("") + Benchmark.setUp(self) + + def tearDown(self): + code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.input_table) + self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.input_table, out)) + code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.output_table) + self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.output_table, out)) + Benchmark.tearDown(self) + + def tearDown(self): + code, out, err = cloudshell.run(self.username, self.password, "deletetable %s\n" % self.input_table) + self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.input_table, out)) + code, out, err = cloudshell.run(self.username, self.password, "deletetable %s\n" % self.output_table) + self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.output_table, out)) + Benchmark.tearDown(self) + + def keysizemin(self): + return self.keymin + + def keysizemax(self): + return self.keymax + + def numrows(self): + return self.rows + + def minvaluesize(self): + return self.valmin + + def maxvaluesize(self): + return self.valmax + + def runTest(self): + command = self.buildcommand('org.apache.accumulo.test.mapreduce.RowHash', + self.getInstance(), + self.getZookeepers(), + self.getUsername(), + self.getPassword(), + self.input_table, + 'column:columnqual', + self.output_table, + self.maxmaps) + handle = runner.start(command, stdin=subprocess.PIPE) + log.debug("Running: %r", command) + out, err = handle.communicate("") + log.debug("Process finished: %d (%s)", handle.returncode, ' '.join(handle.command)) + return handle.returncode, out, err + + def shortDescription(self): + return 'Hashes %d rows from one table and outputs them into another table. '\ + 'Lower score is better.' % (self.numrows()) + + def setSpeed(self, speed): + if speed == "slow": + self.rows = 1000000 + self.maxmaps = 400 + elif speed == "medium": + self.rows = 100000 + self.maxmaps = 40 + else: # if speed == "fast" + self.rows = 10000 + self.maxmaps = 4 + + def needsAuthentication(self): + return 1 http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/TableSplitsBenchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/TableSplitsBenchmark.py b/test/bench/lib/TableSplitsBenchmark.py new file mode 100755 index 0000000..2a21fe4 --- /dev/null +++ b/test/bench/lib/TableSplitsBenchmark.py @@ -0,0 +1,76 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import subprocess +import os +import glob +import random +import time + +from lib import cloudshell, runner, path +from lib.Benchmark import Benchmark +from lib.tservers import runEach, tserverNames +from lib.path import accumulo, accumuloJar +from lib.util import sleep +from lib.options import log + +class TableSplitsBenchmark(Benchmark): + "Creating a table with predefined splits and then deletes it" + + splitsfile = 'slowsplits' + tablename = 'test_splits' + + def setUp(self): + # Need to generate a splits file for each speed + code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.tablename) + if out.find('does not exist') == -1: + log.debug('Deleting table %s' % self.tablename) + code, out, err = cloudshell.run(self.username, self.password, 'deletetable %s -f\n' % self.tablename) + self.assertEqual(code, 0, "Could not delete table") + Benchmark.setUp(self) + + def runTest(self): + command = 'createtable %s -sf %s\n' % (self.tablename, self.splitsfile) + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, 'Could not create table: %s' % out) + return code, out, err + + def shortDescription(self): + return 'Creates a table with splits. Lower score is better.' + + def tearDown(self): + command = 'deletetable %s -f\n' % self.tablename + log.debug("Running Command %r", command) + code, out, err = cloudshell.run(self.username, self.password, command) + self.assertEqual(code, 0, "Could not delete table") + log.debug("Process finished") + Benchmark.tearDown(self) + + def setSpeed(self, speed): + dir = os.path.dirname(os.path.realpath(__file__)) + if speed == "slow": + splitsfile = 'slowsplits' + elif speed == "medium": + splitsfile = 'mediumsplits' + else: # speed == "fast" + splitsfile = 'fastsplits' + self.splitsfile = os.path.join( dir, splitsfile) + + def needsAuthentication(self): + return 1 + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/TeraSortBenchmark.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/TeraSortBenchmark.py b/test/bench/lib/TeraSortBenchmark.py new file mode 100755 index 0000000..f9984b2 --- /dev/null +++ b/test/bench/lib/TeraSortBenchmark.py @@ -0,0 +1,110 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +import subprocess +import os +import glob +import random +import time + +from lib import cloudshell, runner, path +from lib.Benchmark import Benchmark +from lib.util import sleep +from lib.options import log + +class TeraSortBenchmark(Benchmark): + "TeraSort in the cloud" + + keymin = 10 + keymax = 10 + valmin = 78 + valmax = 78 + rows = 10000000000 + numsplits = 400 + # Change this number to modify how the jobs are run on hadoop + rows_per_split = 250000 + hadoop_version = '' + tablename = 'CloudIngestTest' + + + def setUp(self): + code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.tablename) + if out.find('does not exist') == -1: + log.debug('Deleting table %s' % self.tablename) + code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' % self.tablename) + Benchmark.setUp(self) + + def tearDown(self): + code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.tablename) + self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.tablename, out)) + Benchmark.tearDown(self) + + def keysizemin(self): + return self.keymin + + def keysizemax(self): + return self.keymax + + def numrows(self): + return self.rows + + def minvaluesize(self): + return self.valmin + + def maxvaluesize(self): + return self.valmax + + def runTest(self): + dir = os.path.dirname(os.path.realpath(__file__)) + file = os.path.join( dir, 'splits' ) + code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.tablename, file)) + command = self.buildcommand('org.apache.accumulo.test.mapreduce.TeraSortIngest', + '--count', self.numrows(), + '-nk', self.keysizemin(), + '-xk', self.keysizemax(), + '-nv', self.minvaluesize(), + '-xv', self.maxvaluesize(), + '-t', self.tablename, + '-i', self.instance, + '-z', self.zookeepers, + '-u', self.username, + '-p', self.password, + '--splits', self.numsplits) + handle = runner.start(command, stdin=subprocess.PIPE) + log.debug("Running: %r", command) + out, err = handle.communicate("") + log.debug("Process finished: %d (%s)", handle.returncode, ' '.join(handle.command)) + self.assertEqual(handle.returncode, 0, "Job did not complete successfully") + return handle.returncode, out, err + + def needsAuthentication(self): + return 1 + + def shortDescription(self): + return 'Ingests %d rows (to be sorted). '\ + 'Lower score is better.' % (self.numrows()) + + def setSpeed(self, speed): + if speed == "slow": + self.rows = 10000000000 + self.numsplits = 400 + elif speed == "medium": + self.rows = 10000000 + self.numsplits = 40 + elif speed == "fast": + self.rows = 10000 + self.numsplits = 4 http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/__init__.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/__init__.py b/test/bench/lib/__init__.py new file mode 100755 index 0000000..09697dc --- /dev/null +++ b/test/bench/lib/__init__.py @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/cloudshell.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/cloudshell.py b/test/bench/lib/cloudshell.py new file mode 100755 index 0000000..8c552fb --- /dev/null +++ b/test/bench/lib/cloudshell.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import subprocess + +from lib import path +from lib import runner +from lib.options import log + + +def run(username, password, input): + "Run a command in accumulo" + handle = runner.start([path.accumulo('bin', 'accumulo'), 'shell', '-u', username, '-p', password], + stdin=subprocess.PIPE) + log.debug("Running: %r", input) + out, err = handle.communicate(input) + log.debug("Process finished: %d (%s)", + handle.returncode, + ' '.join(handle.command)) + return handle.returncode, out, err http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/fastsplits ---------------------------------------------------------------------- diff --git a/test/bench/lib/fastsplits b/test/bench/lib/fastsplits new file mode 100644 index 0000000..63a3126 --- /dev/null +++ b/test/bench/lib/fastsplits @@ -0,0 +1,300 @@ + 8_[[@]V)g +! Hm=E#(X} +!N<~+ Y7LW +"!#02~UMAc +"C[`\+0<6_ +#$;~d/|&`) +#)S(BIkV+8 +#9||w=nFUS +#<f!5A0/2F +#PAB|J{K(P +#\M_9bs,y~ +$GFv0'F=_G +$VdF;\XyxC +$`"WiH2o>, +$l"]2vq>x% +$oBIw^3Q6g +%+QoBOq:F[ +%6hnyeW+xu +%9Ty&[2+AR +%Bu+%{xQk} +%IETwl`7@u +%NH<U0fa^T +%fJ &xc,uR +':,7c#E@=c +'Fh9*<Ffi4 +'H*d.B,one +'}/tlA^J7d +(H;1tZhH5! +(U2mqCC|fy +)4h-S][gEg +)S(BIkV+8$ +)X%u=$fKWE +)g~h'DpOn9 +)m6Qf=5KHM +)no79`(x]f +*! Hm=E#(X +*,j.9UR]}J +*u^.u0<N,m ++QoBOq:F[7 +,*$>>"34"i +,4O]Y@h-%. +,A_;2J/poG +,j.9UR]}J@ +,xWmj0-)<r +-$O;nf/dKo +-){&T;kH|/ +-BFcq5=qK[ +-EypWN*I4D +-KgIM-K=cK +-Z6]ka+Omr +-_9z+e^[Sv +.(U2mqCC|f +.Nk"~w?=7f +.Xq'a@Ve@L +.YJ|irdw_@ +.ptinhidK? +.zpEan^lN +/.YJ|irdw_ +/UmI2_.}qy +/y_@;{hWz? +/|hir_ZKl? +0Q:S5|;s y +0t!#F.jycv +10Q:S5|;s +1<Q8ka\IS+ +1NFCWfkIgL +2=Mo\my;(Y +2tacz_=}.6 +3Mc<F>'fXk +4G3;-_4c@z +4_e1LVoOd{ +4d[Bz~I#*c +4h-S][gEg@ +4p,Z_@(F(0 +5r8Qtn]%Zp +6%~Wgz .`r +6@vYDc%@-k +6UB2tRz9VG +6]NN,?mXfF +6|;OY,eC^m +71NFCWfkIg +7T,N*L0|B$ +7X&k)Mnw7A +7hu(z$ .d2 +7|m#)G;g7' +8 gNp8#@5R +8$/O8Z<a$C +88Imw^rpkO +8G]KhZ=^vD +8X~QuCBfmG +8^OB&SnJ.[ +8_[[@]V)gn +9ZL)eI5z"S +:,7c#E@=cF +:F.DT"MrX= +:HOBc>hCMu +;E`6m/n=B( +;eT#S*'^m@ +;~9@/]L7t4 +<+`jK~}h[K +<v3lFW:Ih{ +=+sqj~[8<C +=Mo\my;(Y+ +>32ir!c?v) +>H@1?E 1Sr +>IyA_El%$K +>rL,qr~TqI +?%IETwl`7@ +?g8{KnWc(2 +?lQTa c1DE +@+@B*+,%9E +@BT^o`(~GO +@`,Y#9tX0V +A-Xo.RbIa3 +A7hu(z$ .d +AFV1^w+wyf +A_;2J/poG# +Aa|<zVU0YB +AfZn),"ibh +B>rL,qr~Tq +BFcq5=qK[! +BbY^)[9#jl +B|~j!/o.AX +C3!##k\4+L +C8 gNp8#@5 +C876I<O,T6 +CdWn]fP!g` +Ce3bHH1*$G +ChOeh,bJ]y +D+*d~OplV3 +DJ2j^@_uGQ +DgCs5Xj,Nw +E746NYvO}K +EU,y{4\Q7y +EwOwA\-ko3 +EypWN*I4D_ +FV1^w+wyfX +Fh9*<Ffi4S +F~M<q,taX* +G!%-3jzL^V +H&NywA&UO, +H;1tZhH5!z +HOBc>hCMu< +HQ\jNVWxb +H]>129!z1Z +Hm#7?^2*^v +IBHd-yE=*8 +Id~_^eb*:~ +IyA_El%$KO +J2j^@_uGQE +KA!~Bd6{w/ +KgIM-K=cKv +L(D\MVWT]q +Lb4`Xe|Ide +M:F.DT"MrX +ME746NYvO} +METKC~VFEZ +MHX\>VSx"a +MQ_,z sLfk +N;m+QQ)MM: +Nk"~w?=7fW +O$oBIw^3Q6 +O7h/k3y4Wx +O9L>=;KJo? +O<K;.-fKB! +OCtBJFLcXs +P<9]<"\Htb +PAB|J{K(PB +Pgh4d,q@WL +Q6@vYDc%@- +Q;5Zp=+%\} +Q>32ir!c?v +QQ;5Zp=+%\ +QbIzMD=/~) +Qj{.TkiD2f +RH{]O><_tb +Rw2v5>R*~X +S)]6byA mX +Sf@jpK'i:? +T7|m#)G;g7 +TlP76bt0.d +U=n~3gOx(g +U>7^ux VgB +UW^?k\EMo| +UmI2_.}qy} +VA>Shg;h$Q +VHFQ0J%G]u +Vxd,Vz>!t] +WVxd,Vz>!t +W^?k\EMo|g +X%u=$fKWE# +X_RMVKC8/K +Xa!\`%>};~ +Xq'a@Ve@LH +Xy1<XzwYg@ +Y%NH<U0fa^ +Y~[[%5OX@d +ZL)eI5z"S$ +ZT[-~uLI)[ +[9VQ2>"}W; +[S)]6byA m +[Sb.8r[b5Q +[VD4|Swvl] +[[Lx&Ubo_& +\aZ{Kux;oE +]#<f!5A0/2 +]H&NywA&UO +]NN,?mXfFn +]sr@>j.mUz +_*u^.u0<N, +_9z+e^[Svg +_RMVKC8/KV +_ZT[-~uLI) +_e1LVoOd{| +`#9||w=nFU +`*uX?A^"g2 +`+0W:>F9Dw +`uBR|..b#] +a$`"WiH2o> +b4`Xe|IdeQ +bIzMD=/~)b +bpip1V|XZ# +c1gueA\riS +d6w&X@GAFQ +d[9VQ2>"}W +d[Bz~I#*c? +dqX7xL$:BS +f@jpK'i:?H +fZn),"ibhj +gCs5Xj,Nw> +gz|'Kxfm2O +h$VdF;\Xyx +i]C)h.:Q*o +iv@PFpmW9. +jY~[[%5OX@ +jjYSis[@q0 +jmRxiM\A-a +j{.TkiD2f9 +kPgh4d,q@W +k[[Lx&Ubo_ +l"]2vq>x%| +lP76bt0.dq +lkj=KxI!)# +m#7?^2*^vB +m6Qf=5KHMx +m@+@B*+,%9 +mRxiM\A-a, +mzCemV4I]w +nmb]2LQMD0 +no79`(x]f% +oJ'&t#@~ty +p"C[`\+0<6 +p%!]7$<!}< +p,Z_@(F(0: +p-Z6]ka+Om +p[Sb.8r[b5 +p]sr@>j.mU +pip1V|XZ#* +ptinhidK?. +q7X&k)Mnw7 +qB|~j!/o.A +qDzPRZ5}O* +qX7xL$:BS& +rC3!##k\4+ +rXa!\`%>}; +ry[fI-whv9 +t9l&/-RrdC +t;E`6m/n=B +tw+$P@p7** +uBR|..b#]X +u~]KWLu s% +vEU,y{4\Q7 +w+$P@p7**t +wD+*d~OplV +wIBHd-yE=* +wOwA\-ko3, +wq2~T%*`C. +xL4\6T(T8z +xWmj0-)<r( +xnmb]2LQMD +y%9Ty&[2+A +y1<XzwYg@5 +yCe3bHH1*$ +y[fI-whv9^ +y\F]9Klfe +zCemV4I]wZ +zP}sUVQjDU +zpEan^lN : +{MHX\>VSx" +{i_V5T0Y~ +|;OY,eC^mU +|[VD4|Swvl +}/tlA^J7dS +}1<Q8ka\IS +}8G]KhZ=^v +}<+`jK~}h[ +~M<q,taX*E +~]KWLu s%o +~w?:@7O%*e +~y\F]9Klfe http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/mediumsplits ---------------------------------------------------------------------- diff --git a/test/bench/lib/mediumsplits b/test/bench/lib/mediumsplits new file mode 100644 index 0000000..77b24cf --- /dev/null +++ b/test/bench/lib/mediumsplits @@ -0,0 +1,650 @@ + 5`[Tg\<Ro + >mj^DS'%i + mX(H;1tZh + nvsr*n7Nm +! Hm=E#(X} +!%-3jzL^Vx +!3!.b\Q,:5 +!97l@xN m' +!R?OI;j7fp +!`2TDk_[m} +!dZ)Kqr\Z$ +!dpSG}M^[! +!e;<w )%Ar +"!#02~UMAc +".#b>ep_3A +"C[`\+0<6_ +"S$kPgh4d, +"h4<#+*5^} +"iw\o7oX`^ +#$;~d/|&`) +#+*5^}O5h5 +#9||w=nFUS +#<f!5A0/2F +#=R8gSadto +#L3P9RLf@z +#\M_9bs,y~ +#d\%.)pDs_ +#x97^QGxAN +$VdF;\XyxC +$]d9-34zl0 +$`"WiH2o>, +$oBIw^3Q6g +${bV80R>13 +%!]7$<!}<5 +%$Af!rm 5` +%-`tW-TcJl +%.~VHFQ0J% +%9E,A_;2J/ +%9Ty&[2+AR +%Bu+%{xQk} +%IETwl`7@u +%NH<U0fa^T +%\}rXa!\`% +&b/=#x97^Q +&srQw5aK}Y +&z.@>ASN;z +&|?\H&?#d\ +'&D%F6V"t) +':X}rq!g7v +'pXQ1sTGoA +'tx\r-?j^@ +'z@KNK@<=, +($raW"A^%n +(2]N;m+QQ) +(O2Z+[\fEb +(U2mqCC|fy +(X}_ZT[-~u +(Y+Hm#7?^2 +(aK`!?\~;o +(qL0nP1qAM +)#K;~9@/]L +)S(BIkV+8$ +)UMqX3#~E1 +)g~h'DpOn9 +)ue+Y%*X|x +*$>>"34"iw +*$GrC3!##k +*7ozJGKA@~ +*DUx9EMa[? +*WUm48!G[? +*c?m@+@B*+ +*e>=+sqj~[ +*mZ>~yNm:2 +*qVlW` BEy +*u^.u0<N,m +*zQA'"wq%n ++-p''"g:ya ++/'Z6Lt{|6 ++0W:>F9Dw` ++8$71NFCWf ++C!GtinpGM ++Mq\;3:Zn~ ++QoBOq:F[7 ++sqj~[8<C7 +,"7lu'J[!& +,Cf`o&|LK{ +,j.9UR]}J@ +,}~/+gu=31 +-#JmI@DQd0 +-$O;nf/dKo +-){&T;kH|/ +-DED&srQw5 +-Xo.RbIa3{ +-Z6]ka+Omr +-a,t;E`6m/ +-jwCbA9sYF +.)pDs_!O`K +.AXX_RMVKC +.YJ|irdw_@ +.[4/|hir_Z +.d2~y\F]9K +.mo[d'qE0, +/#Udir>>68 +/BB]uzzf.g +/KVyCe3bHH +/OB^&Z.\,w +/^>ku2$G$s +0$\:M,0GbK +0&}~-jwCbA +0'Z[m^>Cxy +0Q:S5|;s y +0e'$+/'Z6L +0w0'7`l]'L +1<Q8ka\IS+ +1J"oyVzs^r +1NFCWfkIgL +1Zv$GFv0'F +1sTGoAZ8Eh +1xnSIJcn?u +1xvhKV*':X +2D8H[5ELY8 +2WQO@6PDGs +2`{pN[df,~ +2f9-_9z+e^ +2tacz_=}.6 +3!Z[JF1EV7 +32;i6wp$Br +3<XYUYu`{Y +3gL 9-WQ9h +3n!Me<W0'Z +3~5KmW<8Wk +4+L:HOBc>h +43vu4f@d]] +48!G[?/>Jv +4FdT,Cf`o& +4G3;-_4c@z +4O]Y@h-%.~ +4[s+a$lgN' +4h-S][gEg@ +4jqapc^pKf +4u&:,[%{/M +5!z{MHX\>V +5h5_5}Q8 Y +5qi[8O4c~g +5z'|f<aqR2 +5}Q8 Yrw|@ +6%~Wgz .`r +63Q=(;!P4F +6@vYDc%@-k +6O o/-@cf. +6UB2tRz9VG +6[SJTvb*>A +6^!Z3(vbR@ +6hnyeW+xuj +6iS1$M1ybT +6u`E8_HV#! +6w&X@GAFQ' +7@uA7hu(z$ +7F>0Vs>xU3 +7L)S@SUo@x +7T,N*L0|B$ +7UFT5@Y5qi +7X&k)Mnw7A +7dSvEU,y{4 +7hu(z$ .d2 +7p%d_S8+7b +7w.M`P'VRF +7|m#)G;g7' +8 gNp8#@5R +8$/O8Z<a$C +876I<O,T6p +88Imw^rpkO +8Eh!L@SfIJ +8G]KhZ=^vD +8O4c~gyV<2 +8X~QuCBfmG +8_[[@]V)gn +8hgssof,OQ +8z/lkj=KxI +9M#+/OB^&Z +:,7c#E@=cF +:?+9[weO=: +:F.DT"MrX= +:~fOCtBJFL +;'lj>LBq:\ +;2I4v0/X!a +;E`6m/n=B( +;m+QQ)MM:z +<+`jK~}h[K +<5eKO/BtO+ +<BC#]Hhe_Z +<C7@BT^o`( +<r(Qj{.Tki +<z0kV]]148 +=B('}/tlA^ +=Mo\my;(Y+ +=O8noj[T4U +>32ir!c?v) +>E|u|~bdnH +>H@1?E 1Sr +>Jv3*mZ>~y +>jMk(GRv5F +>rL,qr~TqI +?6dax-R-c2 +?:)y6{O[UH +?;a)g)>k|I +?h]XP;,'&D +?ky$X1@K|A +?v)wD+*d~O +@)f`<b%/^> +@+@B*+,%9E +@5RjY~[[%5 +@;3ByWA I: +@CN]@)f`<b +@CySoxVge. +@L97DQ2Ps| +@SUo@x8 >m +@WL]H&NywA +@`,Y#9tX0V +@xN m's*qV +A_;2J/poG# +Ar9oCA'~v +A~kBVEU?Jf +BFcq5=qK[! +BT^o`(~GO< +BbY^)[9#jl +B|~j!/o.AX +C.K%6hnyeW +C3!##k\4+L +CDIlg%Lsuu +CZu4y= 1]# +CdWn]fP!g` +Ce3bHH1*$G +CtBJFLcXs= +C{;F7F>0Vs +D+*d~OplV3 +D9<s%"8CO+ +DEK,*$>>"3 +DGs$+Mq\;3 +DUY`+0W:>F +Dw`oJ'&t#@ +Dz;CM_w~kw +DzPRZ5}O*o +E746NYvO}K +EE*wmHrS_A +EU,y{4\Q7y +EV7'rWEGvb +E]G~:ATEE* +Eg@p-Z6]ka +EhYZ1xvhKV +EypWN*I4D_ +F*[{e[,IG5 +F6V"t)bOCb +FJlUHUI0$\ +FQ'xL4\6T( +FUS9ZL)eI5 +FV1^w+wyfX +Fh9*<Ffi4S +GFv0'F=_G! +GO<H]>129! +GQE/UmI2_. +GhZ#W &4Fd +GudpcexeTj +GvjI/BB]uz +G}M^[!3R[k +H&NywA&UO, +H*d.B,one* +H;1tZhH5!z +H=ihzZ83L$ +HFQ0J%G]u> +HMx[S)]6by +HOBc>hCMu< +HQ\jNVWxb +HbF,_LWF}P +I)[)4h-S][ +I1htFb#Yk@ +I=.pMm$]&| +I@DQd0AYRu +IBHd-yE=*8 +IG51qSR$f[ +IMKmf2SH:r +IS+10Q:S5| +IZq^R;B`t7 +IgLLb4`Xe| +IyA_El%$KO +J'&t#@~tyq +J-CQw03`he +J2j^@_uGQE +J4hkmD /)y +JGKA@~/py) +J__e6iS1$M +K7DM&*6`e8 +KA!~Bd6{w/ +K[!O$oBIw^ +Kdn^X%#<tt +KgIM-K=cKv +K|AWnc)#HF +K}YZ#=R8gS +L%bR~/q-,] +L(D\MVWT]q +L+%AFX6]Hd +L2t?(RE::l +L4\6T(T8z/ +L@SfIJQ7p% +LK{DoW5Fdr +LMwq:K*2>D +LWfwq2~T%* +M*Hpr,LY5. +M,0GbK=~2X +M,L?h"$^ < +M:z0t!#F.j +METKC~VFEZ +MHX\>VSx"a +MQ_,z sLfk +MR]|XC+9~' +M_w~kw[7L) +Mc<F>'fXkv +Mqaze|RZ=' +Mu<EwOwA\- +N :-BFcq5= +N5z b*:Kdn +N<~+ Y7LWf +N?glp"fvT$ +NK@<=,NjP^ +Nk"~w?=7fW +NrRPUS/f[] +O*od6w&X@G +O7h/k3y4Wx +O9L>=;KJo? +O<K;.-fKB! +O@kKr2XOxr +OC'XGhZ#W +OCbRO@kKr2 +O^1mcl 5qe +O`K`F*[{e[ +Omr4_e1LVo +Op!:AIE@CN +Oxr?E]G~:A +O}K-KgIM-K +P4F'2`{pN[ +P<9]<"\Htb +PAB|J{K(PB +PDMJ43vu4f +Pgh4d,q@WL +P}sUVQjDUY +Q6g4d[Bz~I +Q7y`#9||w= +Q;5Zp=+%\} +R&:jtXwWz@ +RG/`J.H3#p +RH{]O><_tb +RN{k3uqof\ +RY5k[ndICZ +R[k >E|u|~ +Rev{v$&"XY +Rw2v5>R*~X +S)]6byA mX +S>k>0?5z%a +Sq:|?ky$X1 +SvgC8 gNp8 +T6pAa|<zVU +Tg\<RoTOC' +TqIQbIzMD= +Tvb*>A{CZu +U/50bXa<E& +U=n~3gOx(g +U>7^ux VgB +UO,}1<Q8ka +UmI2_.}qy} +V<2Zxq8A7> +VA>Shg;h$Q +Vic_v.LIoG +Vxd,Vz>!t] +W69cl*|{=r +WEbs?(S[Es +WR=\\fgZv_ +W^?k\EMo|g +W` BEyY{r[ +X%#<ttDr\% +X%u=$fKWE# +X@d?%IETwl +XC+9~'*XT@ +XT@S)UMqX3 +Xa!\`%>};~ +XkvC876I<O +Xq'a@Ve@LH +Xs=%fJ &xc +X|x-?h]XP; +YB1p%!]7$< +YRu-mZy=!@ +Yb+Z<Swys! +Yk@P~]e)*H +Y~[[%5OX@d +ZL)eI5z"S$ +ZT[-~uLI)[ +ZXq;}m~]p# +Zn~2twZ}"9 +Zp|~w?:@7O +[(5J-<liO= +[9VQ2>"}W; +[Sb.8r[b5Q +[UHHipTB`w +[VD4|Swvl] +[[Lx&Ubo_& +[m}y$]d9-3 +[weO=:KhB! +[}f=3<XYUY +\+][D~CY#! +\,wJ!dZ)Kq +\Tv*>qPviV +\Z$_q{7`8Y +\~7Qq)>`%d +]&|9voa'5X +]30hzA}9m: +]7)'VB#}A# +]7wVp5%c? +]<%w`M9[aD +]>129!z1Zv +]@Tw&|?\H& +]Hhe_Z,:?+ +]NN,?mXfFn +]_n27'F{sr +]sr@>j.mUz +]u>5r8Qtn] +]y !N<~+ Y +^ <P($raW" +^!CrsAG=O8 +^%ngN5z b* +^DS'%izC{; +^OB&SnJ.[4 +^PP3Obv_i7 +^Vx?lQTa c +^nIk!h,f`Z +^vB.zpEan^ +^vDq7X&k)M +_9z+e^[Svg +_G!Id~_^eb +_RMVKC8/KV +_S8+7bNEhY +_e1LVoOd{| +`*uX?A^"g2 +`e8p*DUx9E +`he%m^Eh,K +`r7#i5ux>W +`{Y{`r7#i5 +a3{ChOeh,b +aF[|z]5!dp +aZ{Kux;oE3 +a[?06^!Z3( +a^T2=Mo\my +ark:j*[]30 +a|<zVU0YB1 +b+'X,qosnD +b-R_#;lk?r +b4`Xe|IdeQ +bIzMD=/~)b +bR@hoE0tUg +bU%3*K$9[U +bhj)m6Qf=5 +c1gueA\riS +cKv#)S(BIk +cexeTj(Gvj +cf.uJ-CQw0 +cs5|IqCkKE +cv%/y_@;{h +cxR[Iawr'F +d,_Eu4Ag15 +d8B563Q=(; +d[Bz~I#*c? +d]]L^!CrsA +deQ,xWmj0- +dnH:M,L?h" +dto8ark:j* +d{|DJ2j^@_ +d~_^eb*:~f +e \@cxR[Ia +eT#S*'^m@8 +e|RZ=']"h4 +f,~>uQ3g!: +f.g^!`2TDk +f@jpK'i:?H +fJ &xc,uRy +fZn),"ibhj +f`8re6;Vic +fe Q>32ir! +g8{KnWc(2] +gCs5Xj,Nw> +gsMz}1ODz; +gz|'Kxfm2O +h-AQ~v3A,4 +hB!m3!Z[JF +hOeh,bJ]y +h[KY%NH<U0 +h{Q;eT#S*' +i+[~8};N?g +i.MH<0h0C? +i4SB>rL,qr +i<!Oka;4TE +i]C)h.:Q*o +ipTB`wfRev +iv@PFpmW9. +jP^PI=.pMm +j^@{{%)@6# +jjYSis[@q0 +j{.TkiD2f9 +kCy74jqapc +kj=KxI!)#K +kl#V4u&:,[ +koDl-SMJ0^ +k|ISgsMz}1 +l"]2vq>x%| +l?h,4O]Y@h +lP76bt0.dq +lQTa c1DEK +lV3}8G]KhZ +lvOc> 9p7{ +lvh@i+[~8} +ly'y8uN `l +m#7?^2*^vB +m6Qf=5KHMx +m9uz7UFT5@ +m:26{=K@GZ +m>:0/\2>cj +m@8?g8{KnW +mHrS_AsL%b +mRxiM\A-a, +mZy=!@=!e; +m^>CxyxM*H +m^Eh,K5]@T +nc#U4|$K=& +nc)#HF)kl# +ne*3Mc<F>' +nmb]2LQMD0 +no79`(x]f% +o3,d[9VQ2> +o7oX`^v6[S +oE0tUg 'pX +oE38^OB&Sn +oG#$l"]2vq +oW5FdrutGT +of\{K7DM&* +oj[T4Uld,_ +p"fvT$Hm9u +p,Z_@(F(0: +pGM0trHE&k +pKfxaF[|z] +p]i)u]_Zm* +pip1V|XZ#* +ptinhidK?. +py)b]_n27' +q2~T%*`C.K +qR2tI1htFb +qSR$f[7lvh +qX7xL$:BS& +qy}ME746NY +q{7`8Y(MR] +r'Fa3n!Me< +r,LY5.ekCy +r8Qtn]%Zp| +rWEGvb{J__ +r\%R?;a)g) +rc>hRN{k3u +rq!g7v4*WU +s yAfZn)," +sYFUS>k>0? +sof,OQOSq: +s{WIAn~d8B +t!#F.jycv% +t4%\aZ{Kux +t9l&/-RrdC +t<)4;e}n.Z +tGTjAr9oCA +tGXi"?3!=5 +tO+1Op!:AI +trHE&kdPDM +twZ}"9"8hg +tyq'H*d.B, +u2$G$s&rc> +u4Ag15R0e' +u?@J)ue+Y% +uBR|..b#]X +uQ3g!:{9M# +uRy<v3lFW: +u].=NvQ>S= +u]_Zm*X*7o +v$&"XY[}xC +v.LIoG'-#J +v3lFW:Ih{Q +v7/VXuP= C +vBxU"pSST4 +voa'5X-&b/ +w )%Ar9u?@ +w+$P@p7**t +w7AQQ;5Zp= +w?:@7O%*e> +wOwA\-ko3, +w|@-}e+G}} +x"a'Fh9*<F +x%|*! Hm=E +x>W[Yb+Z<S +xANONZA[HX +xU3ns{WIAn +xWmj0-)<r( +xq8A7>np]i +xujzP}sUVQ +y1<XzwYg@5 +y= 1]#mGud +yClc0Wb.[, +y[fI-whv9^ +y\F]9Klfe +y_@;{hWz?D +ybTW%$Af!r +yoJ&}Wem[p +ys!U'tx\r- +z%a"{w}$CV +z?DA-Xo.Rb +zA}9m:I<BC +zCemV4I]wZ +zl005z'|f< +zpEan^lN : +{%)@6#<0&} +{/MN?:)y6{ +{:MSW{z-DE +{=K@GZO!97 +{_$|Kc([VE +{dB0K$Rw[. +{i_V5T0Y~ +{r[~{:MSW{ +{srd+C!Gti +{w}$CV:Mqa +{|6D<5eKO/ +{|N$0:g^U= +|'`;&A'N\F +|;OY,eC^mU +|hir_ZKl?h +}/tlA^J7dS +};~qB|~j!/ +}<5G!%-3jz +}W;qDzPRZ5 +}e+G}}G'z@ +}xC+6O o/- +~)b}<+`jK~ +~/q-,]o[}f +~2Xuf`8re6 +~9@/]L7t4% +~E102WQO@6 +~M<q,taX*E +~]KWLu s%o +~]e)*Hte \ +~v 'FJlUHU http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/options.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/options.py b/test/bench/lib/options.py new file mode 100755 index 0000000..cfd6a99 --- /dev/null +++ b/test/bench/lib/options.py @@ -0,0 +1,39 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from optparse import OptionParser +import logging + +log = logging.getLogger("test.bench") + +usage = "usage: %prog [options] [benchmark]" +parser = OptionParser(usage) +parser.add_option('-l', '--list', dest='list', action='store_true', + default=False) +parser.add_option('-v', '--level', dest='logLevel', + default=logging.INFO, type=int, + help="The logging level (%default)") +parser.add_option('-s', '--speed', dest='runSpeed', action='store', default='slow') +parser.add_option('-u', '--user', dest='user', action='store', default='') +parser.add_option('-p', '--password', dest='password', action='store', default='') +parser.add_option('-z', '--zookeepers', dest='zookeepers', action='store', default='') +parser.add_option('-i', '--instance', dest='instance', action='store', default='') + + + +options, args = parser.parse_args() + +__all__ = ['options', 'args'] + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/path.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/path.py b/test/bench/lib/path.py new file mode 100755 index 0000000..22b8309 --- /dev/null +++ b/test/bench/lib/path.py @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os + +HERE = os.path.dirname(__file__) +ACCUMULO_HOME = os.getenv('ACCUMULO_HOME') +if not os.getenv('ACCUMULO_CONF_DIR'): + ACCUMULO_CONF_DIR = ACCUMULO_HOME+'/conf' +else: + ACCUMULO_CONF_DIR = os.getenv('ACCUMULO_CONF_DIR') + +def accumulo(*args): + return os.path.join(ACCUMULO_HOME, *args) + +def accumuloConf(*args): + return os.path.join(ACCUMULO_CONF_DIR, *args) + +def accumuloJar(): + import glob + options = (glob.glob(accumulo('lib', 'accumulo*.jar')) + + glob.glob(accumulo('accumulo', 'target', 'accumulo*.jar'))) + options = [jar for jar in options if jar.find('instrumented') < 0] + return options[0] + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/runner.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/runner.py b/test/bench/lib/runner.py new file mode 100755 index 0000000..5a85684 --- /dev/null +++ b/test/bench/lib/runner.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import subprocess + +from lib.options import log + +def start(command, stdin=None): + log.debug("Running %s", ' '.join(command)) + handle = subprocess.Popen(command, + stdin=stdin, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + # remember the command for debugging + handle.command = command + return handle http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/slowsplits ---------------------------------------------------------------------- diff --git a/test/bench/lib/slowsplits b/test/bench/lib/slowsplits new file mode 100644 index 0000000..363c56a --- /dev/null +++ b/test/bench/lib/slowsplits @@ -0,0 +1,1000 @@ + (pD{JbKCL + CL|'`;&A' + Y7LWfwq2~ + Yrw|@-}e+ + a6_eW3_U` + c1DEK,*$> + clA)/1,o0 + p'NiRfrp3 +! Hm=E#(X} +!%-3jzL^Vx +!&P1xnSIJc +!'>p]D)_fQ +!/\$4oMrW& +!/o.AXX_RM +!0f2rL6@Bu +!:{9M#+/OB +!?\~;oli.M +!@=!e;<w ) +!ADIG.w%Hh +!`2TDk_[m} +!aEJ4hkmD +!dZ)Kqr\Z$ +!h,f`Z!(qL +!nwO(JY9p: +!rm 5`[Tg\ +!tfhP,fKA8 +"!#02~UMAc +".v]dRo ]R +"34"iw\o7o +"5)>QhL~r& +"9"8hgssof +"?3!=5lHbF +"BN/#%-lA1 +"C[`\+0<6_ +"\AhQ4?"WL +"l#n6<mXSH +"pSST4J>jM +#!&]7)'VB# +#!Fv7/VXuP +#$;~d/|&`) +#%-lA18kw' +#+*5^}O5h5 +#9||w=nFUS +#;lk?rXU/5 +#<f!5A0/2F +#=R8gSadto +#@~tyq'H*d +#BoZ}ElkS@ +#D;(/-,5R| +#\M_9bs,y~ +#i?4[wm:>a +#k\4+L:HOB +#pCWR=\\fg +#x97^QGxAN +$<!}<5G!%- +$M1ybTW%$A +$VdF;\XyxC +$]d9-34zl0 +$`"WiH2o>, +$j,S@*vqo` +$nT`dP4-]k +$oBIw^3Q6g +$o~Fdu,ljs +$s&rc>hRN{ +%!]7$<!}<5 +%"8CO+W^PP +%$Af!rm 5` +%*`C.K%6hn +%9Ty&[2+AR +%Bu+%{xQk} +%IETwl`7@u +%NH<U0fa^T +%Pr;DN6C;4 +%d@@;3ByWA +%izC{;F7F> +%n/R&:jtXw +&*6`e8p*DU +&A'N\FIZXq +&CrH4,|c/6 +&L#.Jmp(DR +&QaBTSZBI` +&Z.\,wJ!dZ +&_2O[cq4ep +&kdPDMJ43v +&srQw5aK}Y +&|?\H&?#d\ +'"g:ya_{_$ +'"wq%n/R&: +'F=_G!Id~_ +'LW6u`E8_H +'Q b*WP\s, +'mrppzMh4+ +'tx\r-?j^@ +($raW"A^%n +('LV=7D#Bo +(;!P4F'2`{ +(GRv5FyD9< +(J"50*R;o< +(RE::l24[s +(Tb*w93B=q +(U2mqCC|fy +(Xb>)$^@D( +(iJ^e/()`b +)*D\ !cqon +)6l-2u}&P} +)Mnw7AQQ;5 +)S(BIkV+8$ +)UMqX3#~E1 +)g~h'DpOn9 +)ue+Y%*X|x +)y%1J"oyVz +*$>>"34"iw +*'^m@8?g8{ +*DUx9EMa[? +*H:Z -0O5= +*Hte \@cxR +*K$9[UZ32; +*WP\s,*D.d +*mZ>~yNm:2 +*p8LEas6=f +*uI6v0x%sW +*u^.u0<N,m ++/'Z6Lt{|6 ++0W:>F9Dw` ++C!GtinpGM ++Mq\;3:Zn~ ++QoBOq:F[7 ++[\fEbn{|N ++gu=312H=i ++sqj~[8<C7 +,!rQ8%q&e# +,4X0w0'7`l +,Cf`o&|LK{ +,G0Owz~Ki] +,K5]@Tw&|? +,[%{/MN?:) +,]o[}f=3<X +,bJ]y !N<~ +,j.9UR]}J@ +,mHv!'>p]D +,o0=3E:4#@ +,qosnDyu]. +-$O;nf/dKo +-){&T;kH|/ +-34zl005z' +-<liO=LCDI +->: VPO@M# +-FPWS=J@\{ +-SMJ0^zt<) +-T86yB|B#" +-Xo.RbIa3{ +-Z6]ka+Omr +-jwCbA9sYF +.)pDs_!O`K +.YJ|irdw_@ +.Zncs5|IqC +.^g$7rd=Y* +.jycv%/y_@ +.l5S`7lzv3 +/-,5R|f1$u +/-@cf.uJ-C +/BB]uzzf.g +/NI2R`i"5) +/OB^&Z.\,w +/\2>cj,b+' +0%36h!Wv]5 +0*5[Ue0Tgj +0*R;o</"BN +0,gtGXi"?3 +0:g^U=l^nI +0?5z%a"{w} +0Q:S5|;s y +0VG:)v1&Kg +0Wb.[,l%-` +0^zt<)4;e} +0hQ!Grw2+` +1$uo}p)7h7 +1)g6uj7@l" +13_IZq^R;B +15R0e'$+/' +1<Q8ka\IS+ +1NFCWfkIgL +1n{kL?47:; +1sTGoAZ8Eh +1uUo8!l4CN +1xvhKV*':X +231*y>ZDIq +2>"}W;qDzP +2F~b"l#n6< +2Pj89$_1uU +2WQO@6PDGs +2`{pN[df,~ +2tacz_=}.6 +3!Z[JF1EV7 +3(vbR@hoE0 +312H=ihzZ8 +3<XYUYu`{Y +3A0IMKmf2S +3E:4#@Q'Q +3U;1x77p4\ +3fE!$j,S@* +3n!Me<W0'Z +3uqof\{K7D +4,|c/6u4z5 +43vu4f@d]] +48!G[?/>Jv +48l7w.M`P' +4G3;-_4c@z +4KRGqCQ9W^ +4O]Y@h-%.~ +4Uld,_Eu4A +4X?69VB!Go +4epwLxsb=x +4f@d]]L^!C +4h-S][gEg@ +4jqapc^pKf +4u&:,[%{/M +4z5Tl+,b^M +4|$K=&7[(5 +5.ekCy74jq +5@Y5qi[8O4 +5FyD9<s%"8 +5VzVl$g0I* +5X-&b/=#x9 +5Z=<9e_xB? +5z'|f<aqR2 +5}Q8 Yrw|@ +6#<0&}~-jw +6%~Wgz .`r +63Q=(;!P4F +686&z.@>AS +6=Fq,}AUJe +6@vYDc%@-k +6Lt{|6D<5e +6O o/-@cf. +6Q~=v;8!jo +6UB2tRz9VG +6^!Z3(vbR@ +6hnyeW+xuj +6iS1$M1ybT +6rUuUNlC#r +6tvW2+>O#2 +6w&X@GAFQ' +6wp$Br(.mo +6{O[UHHipT +7'F{srd+C! +74(E0kxTv+ +7961a/r%'f +7>np]i)u]_ +7F>0Vs>xU3 +7O%*e>=+sq +7T,N*L0|B$ +7UFT5@Y5qi +7X&k)Mnw7A +7^ddJlgwL< +7`l]'LW6u` +7bNEhYZ1xv +7hu(z$ .d2 +7v4*WUm48! +7{A nvsr*n +7|m#)G;g7' +8 gNp8#@5R +8!l4CN0&L# +8$/O8Z<a$C +80R>13_IZq +876I<O,T6p +88Imw^rpkO +8=T!hBZ>$a +8G]KhZ=^vD +8LPAPHi$*~ +8Lsl=hpm!/ +8O4c~gyV<2 +8P}k#>EEI= +8X~QuCBfmG +8Y(MR]|XC+ +8_HV#!&]7) +8_[[@]V)gn +8`<q^.qdvt +8uN `lI\+] +8};N?glp"f +9!z1Zv$GFv +9-WQ9hn+-p +9EMa[?06^! +9HX-4k:]Ed +9Klfe Q>32 +9RLf@z>!3! +9Sd-y<;j{3 +9hn+-p''"g +9zw"sCJ,mH +:%7/^mI#*^ +:,7c#E@=cF +:.`u5Z=<9e +:5eO^1mcl +:>a{hK-d-^ +:ATEE*wmHr +:F.DT"MrX= +:K*2>D#nc# +:\e{?Gv=pT +:l24[s+a$l +:r\*zQA'"w +;3:Zn~2twZ +;E`6m/n=B( +;e}n.Zncs5 +;m+QQ)MM:z +;oli.MH<0h +;omC6rUuUN +;zqNrRPUS/ +<+`jK~}h[K +<0h0C?-ly' +<5eKO/BtO+ +<K|z'[wkC< +<O,T6pAa|< +<Swys!U'tx +<b%/^>ku2$ +<g|@}}YUu^ +=&7[(5J-<l +=']"h4<#+* +=,NjP^PI=. +=5lHbF,_LW +=:KhB!m3!Z +=I.54li^&u +=Mo\my;(Y+ +=pT)Qg"eJk +=rX4 (pD{J +=rf<z0kV]] +=z&$e*p0?j +> 9p7{A nv +>'fXkvC876 +>32ir!c?v) +>ASN;zqNrR +>A{CZu4y= +>D#nc#U4|$ +>E|u|~bdnH +>F9Dw`oJ'& +>H@1?E 1Sr +>LBq:\e{?G +>ep_3A0IMK +>hCMu<EwOw +>l&{f3F;n~ +>qPviV]A~k +>rL,qr~TqI +? u".#b>ep +?(S[Es"yoJ +?.w~XEWayx +?:)y6{O[UH +?;a)g)>k|I +?bJ*f;>Clb +?h]XP;,'&D +?ky$X1@K|A +?l\9>l<z3Z +?rXU/50bXa +?ui\~7Qq)> +@)f`<b%/^> +@+@B*+,%9E +@6PDGs$+Mq +@GAFQ'xL4\ +@SUo@x8 >m +@`,Y#9tX0V +@h-%.~VHFQ +@qI82}DU;5 +@x8 >mj^DS +@xN m's*qV +@z>!3!.b\Q +@~/py)b]_n +A#VW69cl*| +AIE@CN]@)f +AMD\Tv*>qP +A_;2J/poG# +Ah7ZH`^CT] +An~d8B563Q +Ar9oCA'~v +Ar9u?@J)ue +B'}L;XR*Fx +B,one*3Mc< +BFcq5=qK[! +BOD nfLqfC +BT^o`(~GO< +BbY^)[9#jl +Br(.mo[d'q +B|~j!/o.AX +C#r:VhD45= +C3!##k\4+L +C>nWUbKv!) +C?-ly'y8uN +CA'~v 'FJl +CV:Mqaze|R +CZ]L2t?(RE +C] @Y8=?.w +C_+L!/\$4o +CdWn]fP!g` +Ce3bHH1*$G +ClS)g\fcsM +Clb2QlYLv! +CtBJFLcXs= +C~StqP]"\5 +D+*d~OplV3 +D.dwBOD nf +DQ2Ps|C@Cy +Dk_[m}y$]d +DxJYjgIr?l +DzPRZ5}O*o +D~CY#!Fv7/ +E&l/#Udir> +E6/Z_Gf1K5 +E746NYvO}K +E<IdDujthf +EU,y{4\Q7y +E]G~:ATEE* +Ebn{|N$0:g +EnLYq'YI;g +Es"yoJ&}We +EyY{r[~{:M +EypWN*I4D_ +F*[{e[,IG5 +F6V"t)bOCb +FJlUHUI0$\ +FLcXs=%fJ +FV1^w+wyfX +FX6]HdM3gL +Fb#Yk@P~]e +Fh9*<Ffi4S +FpbMt"&/Y# +GFv0'F=_G! +GMAVpI4cd +GZO!97l@xN +GhZ#W &4Fd +Glb4a|5LUw +Gnm]mk3u"b +Grw2+`<cW$ +G}M^[!3R[k +H&?#d\%.)p +H&NywA&UO, +H*!0H336oE +H*d.B,one* +H;1tZhH5!z +H?l+xS)Y<3 +HF)kl#V4u& +HFQ0J%G]u> +HH1*$GrC3! +HOBc>hCMu< +HP%9xjE,+v +HQ\jNVWxb +HR$Bs_f|Fa +HUI0$\:M,0 +HXnm>:0/\2 +HYhv@qI82} +HdM3gL 9-W +H|<ytwI*IB +I/P|rCQ+y( +I1htFb#Yk@ +I:qh-AQ~v3 +I;j7fpYRG/ +I=.pMm$]&| +I@DQd0AYRu +IBHd-yE=*8 +IJQ7p%d_S8 +IJcn?ui\~7 +IKaUi/}:|} +Iawr'Fa3n! +IqCkKEyb-R +IyA_El%$KO +J%G]u>5r8Q +J'&t#@~tyq +J-CQw03`he +J.H3#pCWR= +J2j^@_uGQE +JD9<H"6LV# +JF1EV7'rWE +JFuK?l\9>l +JGKA@~/py) +Jfs@L97DQ2 +Jh+9i^,r7i +JlK,}~/+gu +Jmp(DR&[N3 +K$Rw[.AWEb +K7DM&*6`e8 +KA!~Bd6{w/ +KC8/KVyCe3 +KCLqPv-'XH +KEyb-R_#;l +KV*':X}rq! +K[2"A]]ZiC +Kc([VE!;'l +KgIM-K=cKv +Kqr\Z$_q{7 +L a^/4U5Vz +L$R(O2Z+[\ +L(D\MVWT]q +L4\6T(T8z/ +L@SfIJQ7p% +Lgv{|N&Zp' +Lxsb=x}j<U +M!JLHYVjjo +M,0GbK=~2X +M,L?h"$^ < +M9vSAL."aF +METKC~VFEZ +MHX\>VSx"a +MQ_,z sLfk +M_w~kw[7L) +Mc<F>'fXkv +Mm$]&|9voa +N'eL+%AFX6 +N5z b*:Kdn +N<~+ Y7LWf +NK@<=,NjP^ +NZA[HXnm>: +N[df,~>uQ3 +Nk"~w?=7fW +Nm8LMwq:K* +Np+U~LT89^ +NvQ>S=li<! +O+W^PP3Obv +O/BtO+1Op! +O5YtN<%e{I +O7h/k3y4Wx +O7zg$O0gZj +O9L>=;KJo? +O<K;.-fKB! +O=LCDIlg%L +O@kKr2XOxr +OQOSq:|?ky +O`q"Iq$fsD +Obv_i7?2D8 +Op!:AIE@CN +P,fKA8tlFg +P;,'&D%F6V +P<9]<"\Htb +PAB|J{K(PB +PgBqrPiP-1 +Pgh4d,q@WL +Pv-'XH6`s* +Py*Js[n(J" +P}sUVQjDUY +Q ort3?aO4 +Q)MM:z0t!# +Q41mD?*RU` +Q4?"WLYNp+ +Q4ny'ss*~. +Q79j$#ZgqL +Q;5Zp=+%\} +QL!)`$hE\" +Qg"eJk]\y, +QhL~r&ye>t +QlYLv!c!tf +R-,u-#4>E` +R/%vW7Bs:2 +R4PErdDVpt +R;B`t7\#L3 +RFuRY5k[nd +RH{]O><_tb +RN{k3uqof\ +RbIa3{ChOe +RoTOC'XGhZ +Rw2v5>R*~X +S)]6byA mX +S=li<!Oka; +S>k>0?5z%a +SG{|+])j-c +SHHCluc@Ub +SR/Ig;CQ5) +SnJ.[4/|hi +T$Hm9uz7UF +T(T8z/lkj= +T23Y{XPXSB +T4J>jMk(GR +TE^]<%w`M9 +TG_tF-dW3) +Tg\<RoTOC' +TgjsY'$wWX +Tj(GvjI/BB +Tv+3xHe|Z| +Tvb*>A{CZu +TyF#+)W:.` +U#R-DxJYjg +U,KjPMN%[x +U;5"`RLL)Y +U=l^nIk!h, +U=n~3gOx(g +U>7^ux VgB +UCkb('LV=7 +UJe<<g|@}} +UOI\z${e|u +US/f[]g3~5 +UYu`{Y{`r7 +Ug 'pXQ1sT +UmI2_.}qy} +Uu^k|f!Ln/ +V+vp2|R(yG +V@d, (alJy +VA>Shg;h$Q +VB#}A#VW69 +VE!;'lj>LB +VEU?Jfs@L9 +VG'R&_2O[c +VQjDUY`+0W +VU0YB1p%!] +V]]148l7w. +Vci@go:#D; +VhD45=lR4P +Vs>xU3ns{W +Vxd,Vz>!t] +W &4FdT,Cf +W"A^%ngN5z +W%ST^@CJ.I +W-TcJlK,}~ +W1*+}<b^|e +W3)1aPtOQM +W:Ih{Q;eT# +W^?k\EMo|g +W` BEyY{r[ +Wkf!R?OI;j +W{z-DED&sr +X%#<ttDr\% +X%u=$fKWE# +X/ayk;{"sI +X1@K|AWnc) +X3#~E102WQ +XC+9~'*XT@ +XEWayx2>l& +XSBPHR$Bs_ +XSHVy-D`+Y +XY[}xC+6O +Xa!\`%>};~ +Xq'a@Ve@LH +XuP= CL|'` +X|EUa.[@W^ +Y%*X|x-?h] +Y'$wWX{VG' +Y8?yClc0Wb +Yb+Z<Swys! +Y{"x=TzloE +Y~[[%5OX@d +Z5}O*od6w& +ZL)eI5z"S$ +ZT[-~uLI)[ +[!3R[k >E| +['>5usQF#C +[,l%-`tW-T +[.AWEbs?(S +[1E;uJ?3dx +[5ELY8?yCl +[9VQ2>"}W; +[?/>Jv3*mZ +[N3RT23Y{X +[Sb.8r[b5Q +[UZ32;i6wp +[VD4|Swvl] +[[Lx&Ubo_& +[]g3~5KmW< +[c5C,+wIKa +[ndICZ]L2t +[pB(aK`!?\ +[t om:4ln8 +[weO=:KhB! +\-ko3,d[9V +\FIZXq;}m~ +\asC#)EKE) +\fgZv_d,"7 +\y,l0*5[Ue +\{.+'2fXAh +]#mGudpcex +].'@;Gk0PF +]>129!z1Zv +]Edd6=Fq,} +]Hhe_Z,:?+ +]L7t4%\aZ{ +]N=ZKmNsPE +]NN,?mXfFn +]_n27'F{sr +]sr@>j.mUz +]}N6_l>5N" +]}bI`R46B0 +^!CrsAG=O8 +^3XNx)|`,l +^DS'%izC{; +^OB&SnJ.[4 +^QGxANONZA +^r>]7wVp5% +^}O5h5_5}Q +_9z+e^[Svg +_AsL%bR~/q +_LWF}P-koD +_ON,K_yAxi +_RMVKC8/KV +_S8+7bNEhY +_U`F?bJ*f; +_Z,:?+9[we +_ZKl?h,4O] +_e1LVoOd{| +_fQ"gncbqO +_hS5WUld}1 +_l>5N"_U#R +`%>};~qB|~ +`(~GO<H]>1 +`*uX?A^"g2 +`7lzv3/o'| +`M9[aD]{dB +`P'VRFuRY5 +`R46B0m;om +`RLL)Y0"\A +`Z!(qL0nP1 +`^v6[SJTvb +`lI\+][D~C +`r7#i5ux>W +`s*qqm/=SI +`wfRev{v$& +a$lgN'eL+% +aD]{dB0K$R +aF[|z]5!dp +aPtOQM;d U +aX!eG-$q4. +aZ{Kux;oE3 +anH=PW_Gwv +ark:j*[]30 +a|<zVU0YB1 +b*:Kdn^X%# +b4`Xe|IdeQ +bA9sYFUS>k +bB"Ref)Qe7 +bIzMD=/~)b +bK2XC9Gy7E +bK=~2Xuf`8 +bXa<E&l/#U +b\Q,:5eO^1 +bgGIRw8[6} +bzb2.4.4.5 +c1gueA\riS +c2xbU%3*K$ +cAPED?Iu4k +cW$V9zw"sC +cWXQWj-o;_ +cexeTj(Gvj +cj,b+'X,qo +cl 5qe2vBx +cxR[Iawr'F +cyaP^+;%}p +d U>2Pj89$ +d'qE0,gtGX +d([^tNXdQ/ +d0AYRu-mZy +dRo ]RT]}b +dXAG03O".v +d[Bz~I#*c? +drutGTjAr9 +d~_^eb*:~f +e.E;2I4v0/ +e3QY9HX-4k +e6;Vic_v.L +e<W0'Z[m^> +e>t"TG_tF- +eT#S*'^m@8 +eW+xujzP}s +e[,IG51qSR +eb*:~fOCtB +e|RZ=']"h4 +f MiN3eN,+ +f2SH:r\*zQ +f3F;n~BlPd +f9,QGZ%n91 +f<aqR2tI1h +f@jpK'i:?H +fFh=UH15pV +fJ &xc,uRy +fZn),"ibhj +f[7lvh@i+[ +f`8re6;Vic +fnM_)!.@]e +fpYRG/`J.H +g%LsuuC${b +g)>k|ISgsM +g8{KnWc(2] +gCs5Xj,Nw> +gSadto8ark +gncbqOGUCk +gsMz}1ODz; +gz|'Kxfm2O +h"$^ <P($r +hK-d-^g(Tb +hOeh,bJ]y +hZ=^vDq7X& +i)-= WoBbF +i+[~8};N?g +i/}:|}>zTt +i5ux>W[Yb+ +i6N!)lTBG4 +i7?2D8H[5E +iV]A~kBVEU +i]C)h.:Q*o +i^,r7i+&Cr +ipTB`wfRev +ir>>686&z. +iv@PFpmW9. +j*[]30hzA} +j-f#:\rsIr +j2|QJ)&,oq +j<Uc7^ddJl +jjYSis[@q0 +jjo[^3XNx) +jzL^Vx?lQT +j{.TkiD2f9 +k;8nfm[#"& +kMF?hv%3fE +kQwC qa.L1 +ka;4TE^]<% +kcmajf[`yw +kj=KxI!)#K +kw'`kMF?hv +kw[7L)S@SU +l"]2vq>x%| +l$g0I*o,G0 +l*|{=rf<z0 +l+,b^M^ogp +lFg-[c5C,+ +lP76bt0.dq +lPdKj-f#:\ +lQTa c1DEK +m#7?^2*^vB +m's*qVlW` +m*X*7ozJGK +m,[kUK*L"r +m6Qf=5KHMx +m:I<BC#]Hh +mD /)y%1J" +mHrS_AsL%b +mRxiM\A-a, +mW<8Wkf!R? +mZy=!@=!e; +m^>CxyxM*H +m^Eh,K5]@T +nDyu].=NvQ +nP1qAMD\Tv +nWc(2]N;m+ +n]%Zp|~w?: +nc)#HF)kl# +nmb]2LQMD0 +no79`(x]f% +o&|LK{DoW5 +o'|@TyF#+) +o7oX`^v6[S +oAZ8Eh!L@S +oE0tUg 'pX +oG'-#JmI@D +oW5FdrutGT +odr9:\$Ll# +ogpy/NI2R` +oj[T4Uld,_ +opiiZs#Y3[ +ow1Zc.`1)g +oxVge.E;2I +p"fvT$Hm9u +p#8lvOc> 9 +p,Z_@(F(0: +p5%c? u".# +p=+%\}rXa! +pKG#d=WM<a +pc^pKfxaF[ +pip1V|XZ#* +ptinhidK?. +q'YI;g=H|< +q)>`%d@@;3 +q2~T%*`C.K +q75Ps`Q4f' +qM|0@5:}]x +qSR$f[7lvh +qX7xL$:BS& +q]'zEE,'u/ +qe2vBxU"pS +qfC%L a^/4 +qm/=SIV.l5 +qo`>Vci@go +q{7`8Y(MR] +r!c?v)wD+* +r*n7Nm8LMw +r,LY5.ekCy +r-?j^@{{%) +r2XOxr?E]G +r8Qtn]%Zp| +r?lOC] @Y8 +rFl?@t74-O +rW&!Py*Js[ +rWEGvb{J__ +rd>x8(2vWe +rdDVpt!]}N +riWO"%y77} +rq!g7v4*WU +r{iF#i?4[w +sAG=O8noj[ +sIr\ow1Zc. +s_!O`K`F*[ +sof,OQOSq: +s{WIAn~d8B +s|C@CySoxV +t!#F.jycv% +t)bOCbRO@k +t1;{=Oh"ur +t7\#L3P9RL +t9l&/-RrdC +tH'e>x0{?? +tKab`fYpOL +tXwWz@r?6d +tinpGM0trH +trHE&kdPDM +ttDr\%R?;a +twI*IBc2F~ +twZ}"9"8hg +u'J[!&P1xn +u2$G$s&rc> +u4Ag15R0e' +uBR|..b#]X +uQ3g!:{9M# +u]_Zm*X*7o +uj7@l".C_+ +uq|#5{u]#1 +uuC${bV80R +ux;oE38^OB +uzzf.g^!`2 +v 0N4ne -\ +v$&"XY[}xC +v.LIoG'-#J +v0/X!aEJ4h +v3lFW:Ih{Q +v_d,"7lu'J +va1XuCc+*F +vb{J__e6iS +voa'5X-&b/ +w )%Ar9u?@ +w+$P@p7**t +w03`he%m^E +w5aK}YZ#=R +w93B=q'0hQ +w?:@7O%*e> +wL<x clA)/ +wOwA\-ko3, +wz~Ki]qHYh +x)b7<M%Y&5 +x-R-c2xbU% +xB?R74(E0k +xHe|Z|ae3Q +xI!)#K;~9@ +xWmj0-)<r( +xc,uRy<v3l +xq8A7>np]i +xuHrk~a_Y} +xyxM*Hpr,L +y-D`+Y_r{i +y1<XzwYg@5 +y= 1]#mGud +yVzs^r>]7w +yWA I:qh-A +y[fI-whv9^ +y\F]9Klfe +y_@;{hWz?D +ya_{_$|Kc( +z3Z2 a6_eW +z@r?6dax-R +zA}9m:I<BC +zCemV4I]wZ +zTtSdXAG03 +zZ83L$R(O2 +z]5!dpSG}M +zpEan^lN : +{%)@6#<0&} +{9)lj-{_:W +{:MSW{z-DE +{=K@GZO!97 +{hWz?DA-Xo +{i_V5T0Y~ +{w}$CV:Mqa +{zp[C|^"wJ +|:{vPNOa5e +|;OY,eC^mU +|FaJM!JLHY +|f!Ln/0JFu +|hir_ZKl?h +|~bdnH:M,L +}/tlA^J7dS +}1ODz;CM_w +}ElkS@@=rX +}P-koDl-SM +}Wem[pB(aK +}]E`?:A|/% +}c 'l8JK1( +}e+G}}G'z@ +}m~]p#8lvO +}p)7h7vJh+ +}}G'z@KNK@ +~'*XT@S)UM +~/q-,]o[}f +~9@/]L7t4% +~LT89^dEnL +~M<q,taX*E +~OplV3}8G] +~Q0U*;lxlH +~[8<C7@BT^ +~]KWLu s%o +~]e)*Hte \ +~gyV<2Zxq8 +~v3A,4X0w0 +~yNm:26{=K http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/splits ---------------------------------------------------------------------- diff --git a/test/bench/lib/splits b/test/bench/lib/splits new file mode 100644 index 0000000..a983c87 --- /dev/null +++ b/test/bench/lib/splits @@ -0,0 +1,190 @@ + P + +!P +!!!!!!!!!! +"P +"""""""""" +#P +########## +$P +$$$$$$$$$$ +%P +%%%%%%%%%% +&P +&&&&&&&&&& +'P +'''''''''' +(P +(((((((((( +)P +)))))))))) +*P +********** ++P +++++++++++ +,P +,,,,,,,,,, +-P +---------- +.P +.......... +/P +////////// +0P +0000000000 +1P +1111111111 +2P +2222222222 +3P +3333333333 +4P +4444444444 +5P +5555555555 +6P +6666666666 +7P +7777777777 +8P +8888888888 +9P +9999999999 +:P +:::::::::: +;P +;;;;;;;;;; +<P +<<<<<<<<<< +=P +========== +>P +>>>>>>>>>> +?P +?????????? +@P +@@@@@@@@@@ +AP +AAAAAAAAAA +BP +BBBBBBBBBB +CP +CCCCCCCCCC +DP +DDDDDDDDDD +EP +EEEEEEEEEE +FP +FFFFFFFFFF +GP +GGGGGGGGGG +HP +HHHHHHHHHH +IP +IIIIIIIIII +JP +JJJJJJJJJJ +KP +KKKKKKKKKK +LP +LLLLLLLLLL +MP +MMMMMMMMMM +NP +NNNNNNNNNN +OP +OOOOOOOOOO +PP +PPPPPPPPPP +QP +QQQQQQQQQQ +RP +RRRRRRRRRR +SP +SSSSSSSSSS +TP +TTTTTTTTTT +UP +UUUUUUUUUU +VP +VVVVVVVVVV +WP +WWWWWWWWWW +XP +XXXXXXXXXX +YP +YYYYYYYYYY +ZP +ZZZZZZZZZZ +[P +[[[[[[[[[[ +\P +\\\\\\\\\\ +]P +]]]]]]]]]] +^P +^^^^^^^^^^ +_P +__________ +`P +`````````` +aP +aaaaaaaaaa +bP +bbbbbbbbbb +cP +cccccccccc +dP +dddddddddd +eP +eeeeeeeeee +fP +ffffffffff +gP +gggggggggg +hP +hhhhhhhhhh +iP +iiiiiiiiii +jP +jjjjjjjjjj +kP +kkkkkkkkkk +lP +llllllllll +mP +mmmmmmmmmm +nP +nnnnnnnnnn +oP +oooooooooo +pP +pppppppppp +qP +qqqqqqqqqq +rP +rrrrrrrrrr +sP +ssssssssss +tP +tttttttttt +uP +uuuuuuuuuu +vP +vvvvvvvvvv +wP +wwwwwwwwww +xP +xxxxxxxxxx +yP +yyyyyyyyyy +zP +zzzzzzzzzz +{P +{{{{{{{{{{ +|P +|||||||||| +}P +}}}}}}}}}} +~P +~~~~~~~~~~ http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/tservers.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/tservers.py b/test/bench/lib/tservers.py new file mode 100755 index 0000000..b34397a --- /dev/null +++ b/test/bench/lib/tservers.py @@ -0,0 +1,89 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import fcntl + +import os +import time +import select +import subprocess + +from lib.path import accumuloConf +from lib.options import log + +def tserverNames(): + return [s.strip() for s in open(accumuloConf('tservers'))] + +def runEach(commandMap): + result = {} + handles = [] + for tserver, command in commandMap.items(): + log.debug("ssh: %s: %s", tserver, command) + handle = subprocess.Popen(['ssh',tserver] + [command], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for h in handle.stdout, handle.stderr: + fcntl.fcntl(h, fcntl.F_SETFL, os.O_NDELAY) + handle.tserver = tserver + handle.command = command + handle.start = time.time() + handles.append(handle) + handlesLeft = set(handles[:]) + while handlesLeft: + fds = {} + doomed = set() + for h in handlesLeft: + more = [] + if h.stdout != None: + more.append(h.stdout) + if h.stderr != None: + more.append(h.stderr) + for m in more: + fds[m] = h + if not more: + doomed.add(h) + handlesLeft -= doomed + if not handlesLeft: break + rd, wr, ex = select.select(fds.keys(), [], [], 10) + for r in rd: + handle = fds[r] + data = r.read(1024) + result.setdefault(handle, ['', '']) + if not data: + if r == handle.stdout: + handle.stdout = None + else: + handle.stderr = None + if r == handle.stdout: + result[handle][0] += data + else: + result[handle][1] += data + if handle.stdout == None and handle.stderr == None: + log.debug("Tserver %s finished in %.2f", + handle.tserver, + time.time() - handle.start) + handle.wait() + if not rd: + log.debug("Waiting on %d tservers (%s...)", + len(handlesLeft), + ', '.join([h.tserver for h in handlesLeft])[:50]) + return dict([(h.tserver, (h.returncode, out, err)) + for h, (out, err) in result.items()]) + +def runAll(command): + tservers = tserverNames() + log.debug("Running %s on %s..", command, ', '.join(tservers)[:50]) + return runEach(dict([(s, command) for s in tservers])) + http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/util.py ---------------------------------------------------------------------- diff --git a/test/bench/lib/util.py b/test/bench/lib/util.py new file mode 100755 index 0000000..bfe38db --- /dev/null +++ b/test/bench/lib/util.py @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time + + +def sleep(n): + time.sleep(n) http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/run.py ---------------------------------------------------------------------- diff --git a/test/bench/run.py b/test/bench/run.py new file mode 100755 index 0000000..63a21fa --- /dev/null +++ b/test/bench/run.py @@ -0,0 +1,116 @@ +#! /usr/bin/env python + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import getopt +import os +import sys +import logging +import unittest + +from lib.options import options, args, log +from lib.Benchmark import Benchmark + +def getBenchmarks(): + import glob + result = [] + here = os.path.dirname(__file__) + sys.path.insert(0, here) + for path in glob.glob('%s/*/*.py' % here): + path = path[len(here):] + if path.find('__init__') >= 0: continue + if path.find('/lib/') >= 0: continue + moduleName = path.replace(os.path.sep, '.') + moduleName = moduleName.lstrip('.')[:-3] + module = __import__(moduleName, globals(), locals(), [moduleName]) + result.extend(list(module.suite())) + return result + +def benchComparator(first, second): + if (first.name() < second.name()): + return -1 + elif (second.name() < first.name()): + return 1 + else: + return 0 + +def main(): + if not os.getenv('HADOOP_HOME'): + print 'Please set the environment variable \'HADOOP_HOME\' before running the benchmarks' + sys.exit(0) + if not os.getenv('ZOOKEEPER_HOME'): + print 'Please set the environment variable \'ZOOKEEPER_HOME\' before running the benchmarks' + sys.exit(0) + if not os.getenv('ACCUMULO_HOME'): + print 'Please set the environment variable \'ACCUMULO_HOME\' before running the benchmarks' + sys.exit(0) + import textwrap + benchmarks = getBenchmarks() + benchmarks.sort(benchComparator) + auth = 0 + for b in benchmarks: + b.setSpeed(options.runSpeed) + if auth == 0 and b.needsAuthentication > 0: + auth = 1 + if options.list: + indent = len(benchmarks[0].name()) + wrap = 78 - indent + prefix = ' ' * indent + ' ' + for b in benchmarks: + desc = b.shortDescription() or "No description" + desc = textwrap.wrap(desc, wrap) + desc = '\n'.join([(prefix + line) for line in desc]) + print '%*s: %s' % (indent, b.name(), desc.lstrip()) + sys.exit(0) + logging.basicConfig(level=options.logLevel) + if auth == 1: + if options.user == '': + print 'User: ', + user = sys.stdin.readline().strip() + else: + user = options.user + if options.password == '': + import getpass + password = getpass.getpass('Password: ') + else: + password = options.password + if options.zookeepers == '': + print 'Zookeepers: ', + zookeepers = sys.stdin.readline().strip() + else: + zookeepers = options.zookeepers + if options.instance == '': + print 'Instance: ', + instance = sys.stdin.readline().strip() + else: + instance = options.instance + Benchmark.instance = instance + Benchmark.zookeepers = zookeepers + Benchmark.instance = instance + Benchmark.password = password + Benchmark.username = user + if args: + benchmarks = [ + b for b in benchmarks if b.name() in args + ] + runner = unittest.TextTestRunner(verbosity=2) + runner.run(unittest.TestSuite(benchmarks)) + for b in benchmarks: + log.info("%30s: %5.2f", b.name(), b.score()) + +if __name__ == '__main__': + main()