On Tue, Feb 9, 2016 at 6:37 AM, Serega Sheypak <serega.shey...@gmail.com>
wrote:

> Hi, thanks for reply!
>
>
> > What should we add here to make the doc more clear on BufferedMutator?
> >
>
> http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/BufferedMutator.html
> It's pretty clear.
>
> > And in the example?
> Example shows that both connection and buffered mutator are thread safe and
> they are closed at once.
> - Should keep single instance of connection and bufferedmutator per thread?
>

No. Connection says you should generally share the Connection instance.
Ditto for BufferedMutator. It is backed by a buffer so you are batching
your writes when you use it. If you share the BM, your batching will more
'regular'.


> - Should I keep connection per thread and instantiate mutator for each
> request?
>

See above.


> - what happens if autoflush enabled?
>

When the backing buffer is full, it gets flushed to the cluster.


> - is it possible to turn on sync mode for saving data?
>

Yes. Don't use a BufferedMutator. Your throughput will go down as you do an
RPC per write.


> - Connection could get into failed/invalid state for some reason (RS down,
> RS up, some networking partitioned happend). Is it possible?



It could happen but I think by now we've seen nearly all of the ways in
which a Connection can fail and internally, it compensates.



> If it's
> possible, then what is the right way to handle it: "close" failed
> connection and ask for new one?
>
>
Good question. Connection internally will retry and 'ride over' near all
cluster issues but the catastrophic.

St.Ack



> > I assume users is collection of User's.
> > Have you tried obtaining / closing mutator for each User instead of
> sharing
> > the mutator ?
>
> > If another flush, say because there were lots of puts, then when close
> > comes in, we are out of threads and you'd get below.
> Looks like it's the root cause, let me try!
>
> Thank you for detailed explanation!
>
>
>
> 2016-02-09 7:10 GMT+01:00 Stack <st...@duboce.net>:
>
> > On Mon, Feb 8, 2016 at 3:01 PM, Serega Sheypak <serega.shey...@gmail.com
> >
> > wrote:
> >
> > > Hi, I'm confused with new HBase 1.0 API. API says that application
> should
> > > manage connections (Previously HConnections) on their own. Nothing is
> > > managed itnernally now.
> > >
> > >
> > That is right.
> >
> >
> >
> >
> > > Here is an example:
> > >
> > >
> >
> https://hbase.apache.org/xref/org/apache/hadoop/hbase/client/example/BufferedMutatorExample.html
> > >
> > > It gives no clue about lifecycle :(
> > >
> >
> >
> > Connection is fairly explicit:
> >
> >
> http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Connection.html
> >
> > What should we add here to make the doc more clear on BufferedMutator?
> >
> >
> http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/BufferedMutator.html
> >
> > And in the example?
> >
> >
> >
> > > Right now I create single connection instance for servlet and
> > > BufferedMutator per request.
> > >
> > >
> > >
> > The recommendation is a singled BufferedMutator shared across requests.
> >
> >
> >
> >
> > > //getConnection returns single instance, it doesn't return new
> connection
> > > each time
> > > def mutator =
> > > getConnection().getBufferedMutator(getBufferedMutatorParams())
> > >
> >
> >
> > getConnection is your method?
> >
> >
> > getBufferedMutator creates a new one?
> >
> >
> >
> > > users.each{ mutator.mutate(toPut(it))}
> > > mutator.close() //exception is thrown here
> > >
> > >
> > The close is flushing out all the writes.
> >
> > If a BufferedMutator per servlet instance, there are probably many when
> > many requests coming in.
> >
> > See what happens when you create one:
> >
> >
> >
> http://hbase.apache.org/xref/org/apache/hadoop/hbase/client/ConnectionImplementation.html#313
> >
> > which calls through to here....
> >
> >
> http://hbase.apache.org/xref/org/apache/hadoop/hbase/client/HTable.html#126
> >
> > ... which creates an executor of max 1 task only.
> >
> > If another flush, say because there were lots of puts, then when close
> > comes in, we are out of threads and you'd get below.
> >
> > St.Ack
> >
> >
> >
> >
> > >
> > > And I get tons of exceptions thrown on "mutator.close()", what do I do
> > > wrong?
> > >
> > > WARNING: #905, the task was rejected by the pool. This is unexpected.
> > > Server is node04.server.com, 60020,1447338864601
> > > java.util.concurrent.RejectedExecutionException: Task
> > > java.util.concurrent.FutureTask@5cff3b40 rejected from
> > > java.util.concurrent.ThreadPoolExecutor@686c2853[Terminated, pool
> size =
> > > 0,
> > > active threads = 0, queued tasks = 0, completed tasks = 1]
> > > at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
> > > at
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
> > > at
> > >
> > >
> >
> java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
> > > at
> > >
> > >
> >
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
> > > at
> > >
> > >
> >
> org.apache.hadoop.hbase.client.AsyncProcess$AsyncRequestFutureImpl.sendMultiAction(AsyncProcess.java:956)
> > > at
> > >
> > >
> >
> org.apache.hadoop.hbase.client.AsyncProcess$AsyncRequestFutureImpl.access$000(AsyncProcess.java:574)
> > > at
> > >
> > >
> >
> org.apache.hadoop.hbase.client.AsyncProcess.submitMultiActions(AsyncProcess.java:423)
> > > at
> > >
> org.apache.hadoop.hbase.client.AsyncProcess.submit(AsyncProcess.java:403)
> > > at
> > >
> org.apache.hadoop.hbase.client.AsyncProcess.submit(AsyncProcess.java:320)
> > > at
> > >
> > >
> >
> org.apache.hadoop.hbase.client.BufferedMutatorImpl.backgroundFlushCommits(BufferedMutatorImpl.java:206)
> > > at
> > >
> > >
> >
> org.apache.hadoop.hbase.client.BufferedMutatorImpl.close(BufferedMutatorImpl.java:158)
> > > at org.apache.hadoop.hbase.client.BufferedMutator$close$0.call(Unknown
> > > Source)
> > >
> >
>

Reply via email to