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主机:{},port号:{}", master.getHostname(), master.getPort());
Collection<ServerName> servers = clusterStatus.getServers();
for (ServerName serverName : servers) {
log.info("Region主机{},port号:{}", 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文件里配置的名称一致,而且力求保证集群映射关系的纯净。不要把其他不相干的业务也部署在当中,引起不必要的麻烦。
HBase写入操作卡住长时间不返回的原因分析的更多相关文章
- 查看Oracle中存储过程长时间被卡住的原因
1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0 ...
- ASP.NET 工作流:支持长时间运行操作的 Web 应用程序
ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy 代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...
- Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系
在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进 ...
- WPF窗口长时间无人操作鼠标自动隐藏
在软件开发中有时会有等待一段时间无人操作后隐藏鼠标,可能原因大致如下: 1.为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面: 2.软件为了 ...
- WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z
操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作.那么对于WinForm程序怎么实现呢? 实现原理:拦截Application ...
- 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息
三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.
- WPF程序长时间无人操作
在软件开发中为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面. 判断程序是否长时间无人操作,有两个依据,第一个是鼠标长时间不动,第二个是鼠标 ...
- Web页面长时间无操作后再获取焦点时转到登录界面
今天开始讲新浪博客搬到博客园. 在工作中遇到的小问题,感觉有点意思,就记录下来吧! 该问题分为两种情况,一.Web页面长时间无操作后,在对其进行操作,比如点击“首页”.“设 ...
- JavaScript长时间未操作自动退出登录
主要是通过mouseover 来监听有没有进行当前页面操作,通过未操作时间和设定退出的时间做比较,从而退出登录. var oldTime = new Date().getTime(); var new ...
随机推荐
- C# App.config 自定义 配置节 出现的问题:配置系统未能初始化
C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案 新建C#项目,在app.config中添加了appSettings项,运行时出现&q ...
- IE11 补丁 KB2929437[已过期]
2014年4月 请更新此补丁 KB2929437 开发人员工具有重要更新 DOM 面板右侧新增 "更改"面板,用于记录调试时修改的 CSS Rules: JS 调试面板,新增 so ...
- 增强for循环的使用详解及代码
首先说一下他的语法结构: for(数据类型 变量 :集合){ //这里写要遍历的元素,或者所需要的代码即可//如果集合中存放的是对象,可以获取到每个对象(数据类型=对象类型 变量(遍历出来的每个对象) ...
- PostgreSQL Replication之第三章 理解即时恢复(1)
到现在为止,您已经掌握了一定的理论.因为生活不仅由理论组成(它可能同样重要),是时候深入实际的工作了. 本章的目标是让您明白如何恢复数据到一个给定的时间点.当您的系统崩溃或者有人意外地删除了一个表,不 ...
- QQ音乐
import re import requestsimport json class Search: def __init__(self, song): ''' self.vkey_url ---&g ...
- Unity ContextMenu特性
有时候我们需要在编辑器下,频繁的做一些操作,比如说在不同的位置创建物体,一个个的修改坐标显然有点繁琐 这时候ContextMenu就派上用处了 例:利用 LineRenderer 画圆,我们不可能一个 ...
- 洛谷—— P1926 小书童——刷题大军
https://www.luogu.org/problem/show?pid=1926#sub 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人 ...
- PipeCAD之管道标准库PipeStd(2)
PipeCAD之管道标准库PipeStd(2) eryar@163.com Key Words. PipeCAD, PipeStd, 管道设计软件,管件库 1. Introduction 管道标准部件 ...
- [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...
- 无法往SQL Server Management Studio拖脚本
解决方法:不要用Administrator权限打开sql server