HBase写入操作卡住长时间不返回的原因分析

本文出处:http://blog.csdn.net/chaijunkun/article/details/44238163,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

这些天研究HBase,写了一段Demo代码,具体如下:

@Test
public void doTest() throws MasterNotRunningException, ZooKeeperConnectionException, IOException {
	Configuration config = HBaseConfiguration.create();
	config.set(zkSetKey, zkConn);
	HBaseAdmin hBaseAdmin = null;
	try{
		hBaseAdmin = new HBaseAdmin(config);
		ClusterStatus clusterStatus = hBaseAdmin.getClusterStatus();
		ServerName master = clusterStatus.getMaster();
		log.info("Master主机:{},端口号:{}", master.getHostname(), master.getPort());
		Collection<ServerName> servers = clusterStatus.getServers();
		for (ServerName serverName : servers) {
			log.info("Region主机{},端口号:{}", serverName.getHostname(), serverName.getPort());
		}
		HTableDescriptor targetTableDesc = null;
		try{
			targetTableDesc = hBaseAdmin.getTableDescriptor(TableName.valueOf(tableName));
			log.info("表已经存在,显示信息");
			log.info("属性:{}", targetTableDesc.toString());
		}catch(TableNotFoundException notFound){
			log.info("表不存在,创建");
			HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
			HColumnDescriptor hcd_info = new HColumnDescriptor("info");
			hcd_info.setMaxVersions(3);
			HColumnDescriptor hcd_data = new HColumnDescriptor("data");
			htd.addFamily(hcd_info);
			htd.addFamily(hcd_data);
			hBaseAdmin.createTable(htd);
			log.info("创建成功");
			targetTableDesc = hBaseAdmin.getTableDescriptor(TableName.valueOf(tableName));
			log.info("属性:{}", targetTableDesc.toString());
		}
		TableName[] listTableNames = hBaseAdmin.listTableNames();
		if (listTableNames == null){
			log.info("无表");
		}else{
			for (TableName tableName : listTableNames) {
				log.info("表名:{}", tableName.getNameAsString());
			}
		}
	}finally{
		IOUtils.closeQuietly(hBaseAdmin);
		log.info("结束");
	}
}

运行这段代码,程序会卡在第28行不动,也就是创建表操作,并且没有报出任何异常,其它的读取操作却很快(例如获取集群状态、列出所有表等操作)。于是本人陷入了深深地思考……

在CSDN找到了一种类似的情况:http://blog.csdn.net/lxpbs8851/article/details/8287471

主要是说HBase所依赖的HDFS进入了安全模式,需要手动退出该模式(运行命令:hdfs dfsadmin -safemode leave)。可是我查询当前的HDFS安全模式状态(hdfs dfsadmin -safemode get)时得到的信息是:Safe mode is OFF,也就是说根本没在安全模式下。

后来偶然地过了一段时间再去看日志发现如下信息:

#1, waiting for some tasks to finish. Expected max=0, tasksSent=9, tasksDone=8, currentTasksDone=8, retries=8 hasError=false, tableName=demo_table
#1, waiting for some tasks to finish. Expected max=0, tasksSent=10, tasksDone=9, currentTasksDone=9, retries=9 hasError=false, tableName=demo_table
#1, table=demo_table, attempt=10/35 failed 1 ops, last exception: java.net.UnknownHostException: unknown host: admin.demo.com on admin.demo.cn,5020,1426211698289, tracking started Fri Mar 13 11:41:19 CST 2015, retrying after 10037 ms, replay 1 ops.

最后一行的主机名:admin.demo.com和admin.demo.cn引起了我的注意。因为我的测试环境为3台实体服务器,配置如下:

IP地址 hosts文件配置的主机名 linux系统的hostname HBase角色 HDFS角色
192.168.1.21 hd-21 test-21 MasterServer NameNode、DataNode、ZooKeeper
192.168.1.22 hd-22 test-22 RegionServer NameNode、DataNode、ZooKeeper
192.168.1.23 hd-23 test-23 RegionServer DataNode、ZooKeeper

另外,因为是测试环境,在192.168.1.22这台机器上还添加了如下hosts信息:

192.168.1.22 admin.demo.com
192.168.1.22 admin.demo.cn

简单来说就是hosts文件中配置的主机名和真实主机名不一致,并且还加入了额外的hosts配置信息干扰到了正确解析主机名。

我运行demo程序的工作机没有配置任何额外的hosts,连接ZooKeeper时直接使用的IP地址,但是HBase Client 底层在进行操作时可能引入了主机名反向连接,作为完全干净的工作机当然找不到对应的服务器,就不断地在后台重试导致生成了上述的日志。当我把出现问题的两个hosts记录加入到工作机后,问题解决。

经验:通过上述错误可知,Hadoop集群中hostname一定要与hosts文件中配置的名称一致,并且力求保证集群映射关系的纯净,不要把其他不相干的业务也部署在其中,引起不必要的麻烦。

时间: 2024-10-15 09:24:49

HBase写入操作卡住长时间不返回的原因分析的相关文章

Linux环境下,traceroute返回一系列*原因分析

Traceroute transmits packets with small TTL (Time To Live) values. The TTL is an IP header field that is used to prevent packets from running into endless loops. When a router that handles the packet subtracts one from the packet's TTL. The packet ex

Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系

在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进不到hbase下取数据,出现socket hang up的错误,查了很多资料也没解决.当时认为是hbase的并发数问题,其并发数的限制导致了资源负载的极限,后来不断测试找到原因所在,其实与hbase处理并发的能力无关,真正的原因是jsvascript的垃圾回收机制使得资源使用达到瓶颈,下面是代码处理

WPF:鼠标长时间无操作,窗口隐藏

//设置鼠标长时间无操作计时器 private System.Timers.Timer MouseTimerTick = new System.Timers.Timer(10000); private void Window_Activated(object sender, EventArgs e) { this.Dispatcher.Invoke(new Action(() => { //显示 })); MouseTimerTick.Stop(); } private void Window_

WPF窗口长时间无人操作鼠标自动隐藏

原文:WPF窗口长时间无人操作鼠标自动隐藏 在软件开发中有时会有等待一段时间无人操作后隐藏鼠标,可能原因大致如下: 1.为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面: 2.软件为了更好的播放效果,需要隐藏鼠标. 这里写的是第二种情况,wpf做播放时,需要隐藏鼠标. 思路是:假如3s鼠标不动则隐藏,设计了计时器的间隔时间为1s,并添加鼠标没移动的计数器,计数器达到3才执行程序.实现是这样的:每隔1s检测鼠标是否移动,如果不移动则计数器

SSH长时间登入不操作导致断开的解决办法有哪些?

大家肯定遇到过这样的情况,我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,下面总结一下解决此问题的方法 方法一: 修改/etc/ssh/sshd_config配置文件,找到ClientAliveCountMax(单位为分钟)修改你想要的值, 执行service sshd reload 方法二: 找到所在用户的.ssh目录,如root用户该目录在: /root/.ssh/ 在该目录创建config文件 vi /root/.ssh/con

SSH长时间登入不操作导致断开该怎么办?

大家肯定遇到过这样的情况,我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,下面总结一下解决此问题的方法 方法一: 修改/etc/ssh/sshd_config配置文件,找到ClientAliveCountMax(单位为分钟)修改你想要的值, 执行service sshd reload 方法二: 找到所在用户的.ssh目录,如root用户该目录在: /root/.ssh/ 在该目录创建config文件 vi /root/.ssh/con

web项目长时间未操作,退出登录,跳转到登录页面

<script type="text/javascript"> var lastTime = new Date().getTime();var currentTime = new Date().getTime();var timeOut = 1601000; //设置超时时间: 1分$(function(){/ 鼠标移动事件 /$(document).mouseover(function(){lastTime = new Date().getTime(); //更新操作时间

HBase基本数据操作具体解释

引言 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于"hbase 0.96.2-hadoop2"版本号编写.均实測通过. 概述 对于建表,和RDBMS类似,HBase也有namespace的概念,能够指定表空间创建表,也能够直接创建表.进入default表空间. 对于数据操作.HBase支持四类基本的数据操作.各自是: Put:添加一行,改动一行: Delete:删除一行.删除指定列族.删除指定column的多个版本

【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于"hbase 0.96.2-hadoop2"版本号编写,均实測通过. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念.能够指定表