本文出处: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写入操作卡住长时间不返回的原因分析的更多相关文章

  1. 查看Oracle中存储过程长时间被卡住的原因

    1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0 ...

  2. ASP.NET 工作流:支持长时间运行操作的 Web 应用程序

    ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy   代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...

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

    在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进 ...

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

    在软件开发中有时会有等待一段时间无人操作后隐藏鼠标,可能原因大致如下: 1.为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面: 2.软件为了 ...

  5. WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z

    操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作.那么对于WinForm程序怎么实现呢? 实现原理:拦截Application ...

  6. 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息

    三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.

  7. WPF程序长时间无人操作

    在软件开发中为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面. 判断程序是否长时间无人操作,有两个依据,第一个是鼠标长时间不动,第二个是鼠标 ...

  8. Web页面长时间无操作后再获取焦点时转到登录界面

    今天开始讲新浪博客搬到博客园.        在工作中遇到的小问题,感觉有点意思,就记录下来吧!        该问题分为两种情况,一.Web页面长时间无操作后,在对其进行操作,比如点击“首页”.“设 ...

  9. JavaScript长时间未操作自动退出登录

    主要是通过mouseover 来监听有没有进行当前页面操作,通过未操作时间和设定退出的时间做比较,从而退出登录. var oldTime = new Date().getTime(); var new ...

随机推荐

  1. LBP(Local Binary Patterns)局部二进制模式

    1. LBP 用于人脸识别 为了预测每个像素属于哪个脸部器官(眼睛.鼻子.嘴.头发),通常的作法是在该像素周围取一个小的区域,提取纹理特征(例如局部二值模式),再基于该特征利用支持向量机等浅层模型分类 ...

  2. PowerDesigner怎么调出工具箱?

    PowerDesigner怎么调出工具箱? 如图操作:

  3. Java类和对象9

    (1)创建一个叫做机动车的类:属性:车牌号(String),车速(int),载重量(double)功能:加速(车速自增).减速(车速自减).修改车牌号,查询车的载重量.编写两个构造方法:一个没有形参, ...

  4. bootstrap如何自定义5列

    废话少说,先上代码: <!DOCTYPE html><html> <head> <meta charset="utf-8"> < ...

  5. Division Game UVA - 11859 Nim

    Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ...

  6. SQL Server存储ntext截断问题

    SQL Server存储ntext截断问题   最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...

  7. 【SRM 717 div2 B】LexmaxReplace

    Problem Statement Alice has a string s of lowercase letters. The string is written on a wall. Alice ...

  8. HDU 5373(2015多校7)-The shortest problem(模拟%11)

    题目地址:pid=5373">HDU 5373 题意:给你一个数n和操作次数t,每次操作将n的各位数之和求出来放在n的末尾形成新的n,问t次操作后得到的n能否够被11整除. 思路:就是 ...

  9. HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源代码泄露

    [简单介绍] 经常使用网名: 猪头三 出生日期: 1981.XX.XX 个人站点: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] ...

  10. 深度拷贝java对象

    有时,如,修改session中对象的时候,如果直接修改session中的对象,修改步骤比较多,一部分修改成功,另一部分不成功,这个时候程序报错,数据库会回滚,但是session已经修改一部分了. 这样 ...