- 经验
- 30
- 分贝
- 0
- 家园分
- 30
- 在线时间:
- 0 小时
- 最后登录:
- 2010-1-11
- 帖子:
- 0
- 精华:
- 0
- 注册时间:
- 2010-1-11
- UID:
- 482871
注册:2010-1-11
|
在测试用HADOOP和hbase处理大数据量时,发现每次内存一旦超出物理内存而使用SWAP内存时,HBASE就会退出。
可以从RegionServer上看到log:
2009-12-22 10:18:38,555 WARNorg.apache.hadoop.hbase.util.Sleeper: We slept 187123ms, ten times longer thanscheduled: 3000
2009-12-22 10:18:38,513 WARNorg.apache.hadoop.hbase.util.Sleeper: We slept 188510ms, ten times longer thanscheduled: 10000
2009-12-22 10:18:42,042 WARNorg.apache.hadoop.hbase.regionserver.HRegionServer: unable to report to masterfor 193533 milliseconds - retrying
2009-12-22 10:18:44,712 WARNorg.apache.zookeeper.ClientCnxn: Exception closing session 0x125afa9121c002f tosun.nio.ch.SelectionKeyImpl@7a34cdfc
java.io.IOException: TIMED OUT
atorg.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:858)
2009-12-22 10:18:44,733 WARNorg.apache.hadoop.hbase.regionserver.HRegionServer: Processing message (Retry:0)
org.apache.hadoop.hbase.Leases$LeaseStillHeldException
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
分析log和代码:
RegionServer的Sleeper类,本来只要sleep3000的,结果sleep了187123ms,表示系统特别忙,根本没有时间执行RegionServer的主线程,所以不能向HMaster(zookeeper)发送心跳,导致HMaster认为这个RegionServer已经当掉,所以把它删除了,等到RegionServer有时间发送心跳时,HMaster已经不接受了,因此当有多个RegionServer被认为当掉时,导致Job失败。
而且这个系统忙的时候是在排序MR时,这个时候HBase基本没有业务要跑。
按道理他们的优先级是一样的,应该都能得到机会执行,但是再次执行时,用top看到,Hbase退出时,系统是在做SWAP操作。而我们的处理程序也是大量操作硬盘,所以导致硬盘IO能力不足,进而导致SWAP操作时间过长,从而导致HBASE超时退出。
所以呢,解决方法就是:
修改java各个JVM堆大小,让它不超过物理内存大小。
比我我8core 16GB的机器:Child: 768MB, DataNode and TaskTracker: 512MB, HRegionRerver: 4GB, 7 reduce, 7 map总共占用:15.5GB,还余下512MB给系统用
|
|