You don't have to use synchronized, just create multiple instances of HTable and you will be fine. Le 4 févr. 2013 23:40, "Bing Li" <[email protected]> a écrit :
> Dear Nicolas, > > If using synchronized is required, the performance must be too low, > right? Are there any other ways to minimize the synchronization > granularity? > > Thanks so much! > Bing > > On Tue, Feb 5, 2013 at 5:31 AM, Nicolas Liochon <[email protected]> wrote: > > Yes, HTable is not thread safe, and using synchronized around them could > > work, but would be implementation dependent. > > You can have one HTable per request at a reasonable cost since > > https://issues.apache.org/jira/browse/HBASE-4805. It's seems to be > > available in 0.92 as well. > > > > Cheers, > > > > Nicolas > > > > > > On Mon, Feb 4, 2013 at 10:13 PM, Adrien Mogenet < > [email protected]>wrote: > > > >> Beware, HTablePool is not totally thread-safe as well: > >> https://issues.apache.org/jira/browse/HBASE-6651. > >> > >> > >> On Mon, Feb 4, 2013 at 9:42 PM, Haijia Zhou <[email protected]> wrote: > >> > >> > Hi, Bing, > >> > > >> > Not sure about your scenario but HTable class is not thread safe for > >> > neither reads nor write. > >> > If you consider writing/reading from a table in a multiple-threaded > way, > >> > you can consider using HTablePool. > >> > > >> > Hope it helps > >> > > >> > HJ > >> > > >> > > >> > On Mon, Feb 4, 2013 at 3:32 PM, Bing Li <[email protected]> wrote: > >> > > >> > > Dear Ted and Harsh, > >> > > > >> > > I am sorry I didn't keep the exceptions. It occurred many days ago. > My > >> > > current version is 0.92. > >> > > > >> > > Now "synchronized" is removed. Is it correct? > >> > > > >> > > I will test if such exceptions are raised. I will let you know. > >> > > > >> > > Thanks! > >> > > > >> > > Best wishes, > >> > > Bing > >> > > > >> > > > >> > > On Tue, Feb 5, 2013 at 4:25 AM, Ted Yu <[email protected]> wrote: > >> > > > Bing: > >> > > > Use pastebin.com instead of attaching exception report. > >> > > > > >> > > > What version of HBase are you using ? > >> > > > > >> > > > Thanks > >> > > > > >> > > > > >> > > > On Mon, Feb 4, 2013 at 12:21 PM, Harsh J <[email protected]> > wrote: > >> > > >> > >> > > >> What exceptions do you actually receive - can you send them here? > >> > > >> Knowing that is key to addressing your issue. > >> > > >> > >> > > >> On Tue, Feb 5, 2013 at 1:50 AM, Bing Li <[email protected]> > wrote: > >> > > >> > Dear all, > >> > > >> > > >> > > >> > When writing data into HBase, sometimes I got exceptions. I > guess > >> > they > >> > > >> > might be caused by concurrent writings. But I am not sure. > >> > > >> > > >> > > >> > My question is whether it is necessary to put "synchronized" > >> before > >> > > >> > the writing methods? The following lines are the sample code. > >> > > >> > > >> > > >> > I think the directive, synchronized, must lower the > performance of > >> > > >> > writing. Sometimes concurrent writing is needed in my system. > >> > > >> > > >> > > >> > Thanks so much! > >> > > >> > > >> > > >> > Best wishes, > >> > > >> > Bing > >> > > >> > > >> > > >> > public synchronized void AddDomainNodeRanks(String domainKey, > int > >> > > >> > timingScale, Map<String, Double> nodeRankMap) > >> > > >> > { > >> > > >> > List<Put> puts = new ArrayList<Put>(); > >> > > >> > Put domainKeyPut; > >> > > >> > Put timingScalePut; > >> > > >> > Put nodeKeyPut; > >> > > >> > Put rankPut; > >> > > >> > > >> > > >> > byte[] domainNodeRankRowKey; > >> > > >> > > >> > > >> > for (Map.Entry<String, Double> nodeRankEntry : > >> > > >> > nodeRankMap.entrySet()) > >> > > >> > { > >> > > >> > domainNodeRankRowKey = > >> > > >> > Bytes.toBytes(RankStructure.DOMAIN_NODE_RANK_ROW + > >> > > >> > Tools.GetAHash(domainKey + timingScale + > nodeRankEntry.getKey())); > >> > > >> > > >> > > >> > domainKeyPut = new Put(domainNodeRankRowKey); > >> > > >> > > domainKeyPut.add(RankStructure.DOMAIN_NODE_RANK_FAMILY, > >> > > >> > RankStructure.DOMAIN_NODE_RANK_DOMAIN_KEY_COLUMN, > >> > > >> > Bytes.toBytes(domainKey)); > >> > > >> > puts.add(domainKeyPut); > >> > > >> > > >> > > >> > timingScalePut = new Put(domainNodeRankRowKey); > >> > > >> > > timingScalePut.add(RankStructure.DOMAIN_NODE_RANK_FAMILY, > >> > > >> > RankStructure.DOMAIN_NODE_RANK_TIMING_SCALE_COLUMN, > >> > > >> > Bytes.toBytes(timingScale)); > >> > > >> > puts.add(timingScalePut); > >> > > >> > > >> > > >> > nodeKeyPut = new Put(domainNodeRankRowKey); > >> > > >> > nodeKeyPut.add(RankStructure.DOMAIN_NODE_RANK_FAMILY, > >> > > >> > RankStructure.DOMAIN_NODE_RANK_NODE_KEY_COLUMN, > >> > > >> > Bytes.toBytes(nodeRankEntry.getKey())); > >> > > >> > puts.add(nodeKeyPut); > >> > > >> > > >> > > >> > rankPut = new Put(domainNodeRankRowKey); > >> > > >> > rankPut.add(RankStructure.DOMAIN_NODE_RANK_FAMILY, > >> > > >> > RankStructure.DOMAIN_NODE_RANK_RANKS_COLUMN, > >> > > >> > Bytes.toBytes(nodeRankEntry.getValue())); > >> > > >> > puts.add(rankPut); > >> > > >> > } > >> > > >> > > >> > > >> > try > >> > > >> > { > >> > > >> > this.rankTable.put(puts); > >> > > >> > } > >> > > >> > catch (IOException e) > >> > > >> > { > >> > > >> > e.printStackTrace(); > >> > > >> > } > >> > > >> > } > >> > > >> > >> > > >> > >> > > >> > >> > > >> -- > >> > > >> Harsh J > >> > > > > >> > > > > >> > > > >> > > >> > >> > >> > >> -- > >> Adrien Mogenet > >> 06.59.16.64.22 > >> http://www.mogenet.me > >> >
