|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在1995年5月23日以“Java”的名称正式发布了。1,写HBase莫名卡住
之前有个多线程数据同步程序在写HBase时偶然会卡住,从jstack剖析,有一个线程block在
而其他要写统一个regionserver的线程block在下面这把锁。
在HBaseclient的代码中发明在机关out对象的时分,timeout设成了0.详细代码以下:
接着看write这个挪用
当挪用write时,先写channel的buffer,写满今后,将数据发送进来。
好了,从代码路径上看到,恰是卡在selector.select这个中央,由于在机关的时分设置了timeout为0,0意味着无穷守候。
select是当注册的channel停当时就前往,关于读的,通道缓存中意味着停当,关于写,将通道的数据清空意味着停当。而写只是用户空间的缓存数据移到内核空间,实际上是不会失利的,除非收集有成绩,Send-Q里的数据一向没发送进来。
而经由过程netstat看到情形证明了这一点,regionserver地点的呆板在18:15时已当机,当机缘故原由,但client地点的呆板在19:30仍然有如许的tcp毗连
tcp065160::ffff:{clientip}:57589::ffff:{serverip}:30020ESTABLISHED
毗连形态仍是ESTABLISHED,关于client来讲,仍是一个一般的链接,可是写又写不出来,征询了内核专家,得知这是内核的一个bug。那
如今看上往可行的办理办法只能是在hbaseclient的代码里
加超时了
相干同事提交了issue到社区https://issues.apache.org/jira/browse/HBASE-8558,在0.94.16已被修复。
2,多线程读写HBase的一个注重点
仍是这个程序,某天报了个错
1
2
3
4
5
6
7
8
java.util.concurrent.ExecutionException:java.lang.RuntimeException:java.lang.OutOfMemoryError:unabletocreatenewnativethread
atjava.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
atjava.util.concurrent.FutureTask.get(FutureTask.java:83)
atorg.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1604)
atorg.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1456)
atorg.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1011)
atorg.apache.hadoop.hbase.client.HTable.put(HTable.java:834)
atcom.taobao.dump.sapclient.client.HbaseClient.set(HbaseClient.java:224)
看毛病信息,不克不及创建新的线程,和之前集群晋级时碰到的一个成绩相似,剖析是某个程序建了大批的线程,到达了体系的下限。看呆板上跑的历程的,最年夜多是这个程序本人。从堕落信息剖析,分离hbase源码,在每一个htable创建的时分,会初始化一个线程池。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
intmaxThreads=conf.getInt("hbase.htable.threads.max",Integer.MAX_VALUE);
if(maxThreads==0){
maxThreads=1;//isthereabetterdefault?
}
longkeepAliveTime=conf.getLong("hbase.htable.threads.keepalivetime",60);
//Usingthe"directhandoff"approach,newthreadswillonlybecreated
//ifitisnecessaryandwillgrowunbounded.ThiscouldbebadbutinHCM
//weonlycreateasmanyRunnablesasthereareregionservers.Itmeans
//italsoscaleswhennewregionserversareadded.
this.pool=newThreadPoolExecutor(1,maxThreads,
keepAliveTime,TimeUnit.SECONDS,
newSynchronousQueue<Runnable>(),
Threads.newDaemonThreadFactory("hbase-table"));
((ThreadPoolExecutor)this.pool).allowCoreThreadTimeOut(true);
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|