Hi dlmarion,

toList should also call iterator(), and that is done in independently for each 
batch scanner iterator in the context of the Future.

Regards,
Sven

-- 
Sven Hodapp, M.Sc.,
Fraunhofer Institute for Algorithms and Scientific Computing SCAI,
Department of Bioinformatics
Schloss Birlinghoven, 53754 Sankt Augustin, Germany
sven.hod...@scai.fraunhofer.de
www.scai.fraunhofer.de

----- Ursprüngliche Mail -----
> Von: dlmar...@comcast.net
> An: "user" <user@accumulo.apache.org>
> Gesendet: Donnerstag, 25. August 2016 14:34:39
> Betreff: Re: Accumulo Seek performance

> Calling BatchScanner.iterator() is what starts the work on the server side. 
> You
> should do this first for all 6 batch scanners, then iterate over all of them 
> in
> parallel.
> 
> ----- Original Message -----
> 
> From: "Sven Hodapp" <sven.hod...@scai.fraunhofer.de>
> To: "user" <user@accumulo.apache.org>
> Sent: Thursday, August 25, 2016 4:53:41 AM
> Subject: Re: Accumulo Seek performance
> 
> Hi,
> 
> I've changed the code a little bit, so that it uses a thread pool (via the
> Future):
> 
> val ranges500 = ranges.asScala.grouped(500) // this means 6 BatchScanners will
> be created
> 
> for (ranges <- ranges500) {
> val bscan = instance.createBatchScanner(ARTIFACTS, auths, 2)
> bscan.setRanges(ranges.asJava)
> Future {
> time("mult-scanner") {
> bscan.asScala.toList // toList forces the iteration of the iterator
> }
> }
> }
> 
> Here are the results:
> 
> background log: info: mult-scanner time: 4807.289358 ms
> background log: info: mult-scanner time: 4930.996522 ms
> background log: info: mult-scanner time: 9510.010808 ms
> background log: info: mult-scanner time: 11394.152391 ms
> background log: info: mult-scanner time: 13297.247295 ms
> background log: info: mult-scanner time: 14032.704837 ms
> 
> background log: info: single-scanner time: 15322.624393 ms
> 
> Every Future completes independent, but in return every batch scanner iterator
> needs more time to complete. :(
> This means the batch scanners aren't really processed in parallel on the 
> server
> side?
> Should I reconfigure something? Maybe the tablet servers haven't/can't 
> allocate
> enough threads or memory? (Every of the two nodes has 8 cores and 64GB memory
> and a storage with ~300MB/s...)
> 
> Regards,
> Sven
> 
> --
> Sven Hodapp, M.Sc.,
> Fraunhofer Institute for Algorithms and Scientific Computing SCAI,
> Department of Bioinformatics
> Schloss Birlinghoven, 53754 Sankt Augustin, Germany
> sven.hod...@scai.fraunhofer.de
> www.scai.fraunhofer.de
> 
> ----- Ursprüngliche Mail -----
>> Von: "Josh Elser" <josh.el...@gmail.com>
>> An: "user" <user@accumulo.apache.org>
>> Gesendet: Mittwoch, 24. August 2016 18:36:42
>> Betreff: Re: Accumulo Seek performance
> 
>> Ahh duh. Bad advice from me in the first place :)
>> 
>> Throw 'em in a threadpool locally.
>> 
>> dlmar...@comcast.net wrote:
>>> Doesn't this use the 6 batch scanners serially?
>>> 
>>> ------------------------------------------------------------------------
>>> *From: *"Sven Hodapp" <sven.hod...@scai.fraunhofer.de>
>>> *To: *"user" <user@accumulo.apache.org>
>>> *Sent: *Wednesday, August 24, 2016 11:56:14 AM
>>> *Subject: *Re: Accumulo Seek performance
>>> 
>>> Hi Josh,
>>> 
>>> thanks for your reply!
>>> 
>>> I've tested your suggestion with a implementation like that:
>>> 
>>> val ranges500 = ranges.asScala.grouped(500) // this means 6
>>> BatchScanners will be created
>>> 
>>> time("mult-scanner") {
>>> for (ranges <- ranges500) {
>>> val bscan = instance.createBatchScanner(ARTIFACTS, auths, 1)
>>> bscan.setRanges(ranges.asJava)
>>> for (entry <- bscan.asScala) yield {
>>> entry.getKey()
>>> }
>>> }
>>> }
>>> 
>>> And the result is a bit disappointing:
>>> 
>>> background log: info: mult-scanner time: 18064.969281 ms
>>> background log: info: single-scanner time: 6527.482383 ms
>>> 
>>> I'm doing something wrong here?
>>> 
>>> 
>>> Regards,
>>> Sven
>>> 
>>> --
>>> Sven Hodapp, M.Sc.,
>>> Fraunhofer Institute for Algorithms and Scientific Computing SCAI,
>>> Department of Bioinformatics
>>> Schloss Birlinghoven, 53754 Sankt Augustin, Germany
>>> sven.hod...@scai.fraunhofer.de
>>> www.scai.fraunhofer.de
>>> 
>>> ----- Ursprüngliche Mail -----
>>> > Von: "Josh Elser" <josh.el...@gmail.com>
>>> > An: "user" <user@accumulo.apache.org>
>>> > Gesendet: Mittwoch, 24. August 2016 16:33:37
>>> > Betreff: Re: Accumulo Seek performance
>>> 
>>> > This reminded me of https://issues.apache.org/jira/browse/ACCUMULO-3710
>>> > 
>>> > I don't feel like 3000 ranges is too many, but this isn't quantitative.
>>> > 
>>> > IIRC, the BatchScanner will take each Range you provide, bin each Range
>>> > to the TabletServer(s) currently hosting the corresponding data, clip
>>> > (truncate) each Range to match the Tablet boundaries, and then does an
>>> > RPC to each TabletServer with just the Ranges hosted there.
>>> > 
>>> > Inside the TabletServer, it will then have many Ranges, binned by Tablet
>>> > (KeyExtent, to be precise). This will spawn a
>>> > org.apache.accumulo.tserver.scan.LookupTask will will start collecting
>>> > results to send back to the client.
>>> > 
>>> > The caveat here is that those ranges are processed serially on a
>>> > TabletServer. Maybe, you're swamping one TabletServer with lots of
>>> > Ranges that it could be processing in parallel.
>>> > 
>>> > Could you experiment with using multiple BatchScanners and something
>>> > like Guava's Iterables.concat to make it appear like one Iterator?
>>> > 
>>> > I'm curious if we should put an optimization into the BatchScanner
>>> > itself to limit the number of ranges we send in one RPC to a
>>> > TabletServer (e.g. one BatchScanner might open multiple
>>> > MultiScanSessions to a TabletServer).
>>> > 
>>> > Sven Hodapp wrote:
>>> >> Hi there,
>>> >> 
>>> >> currently we're experimenting with a two node Accumulo cluster (two
>>> tablet
>>> >> servers) setup for document storage.
>>> >> This documents are decomposed up to the sentence level.
>>> >> 
>>> >> Now I'm using a BatchScanner to assemble the full document like this:
>>> >> 
>>> >> val bscan = instance.createBatchScanner(ARTIFACTS, auths, 10) //
>>> ARTIFACTS table
>>> >> currently hosts ~30GB data, ~200M entries on ~45 tablets
>>> >> bscan.setRanges(ranges) // there are like 3000 Range.exact's in the
>>> ranges-list
>>> >> for (entry<- bscan.asScala) yield {
>>> >> val key = entry.getKey()
>>> >> val value = entry.getValue()
>>> >> // etc.
>>> >> }
>>> >> 
>>> >> For larger full documents (e.g. 3000 exact ranges), this operation
>>> will take
>>> >> about 12 seconds.
>>> >> But shorter documents are assembled blazing fast...
>>> >> 
>>> >> Is that to much for a BatchScanner / I'm misusing the BatchScaner?
>>> >> Is that a normal time for such a (seek) operation?
>>> >> Can I do something to get a better seek performance?
>>> >> 
>>> >> Note: I have already enabled bloom filtering on that table.
>>> >> 
>>> >> Thank you for any advice!
>>> >> 
>>> >> Regards,
> >> >> Sven

Reply via email to