本文出处: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. legend---九、js的核心是什么

    legend---九.js的核心是什么 一.总结 一句话总结:js里面一切东西都是对象,包括数组,字符串,所以你就知道数组啊,对象啊,的很多东西怎么用了 1.js如何合并两个数组? concat,ar ...

  2. [luogu P3360] 偷天换日 解题报告(树形DP)

    题目链接:https://www.luogu.org/problemnew/show/P3360 题解: 首先我们把边上的消耗放到向下的点上,如果是叶子节点的话就先做一次0/1背包 发现这是一颗二叉树 ...

  3. <Sicily>Brackets Matching

    一.题目描述 Let us define a regular brackets sequence in the following way: Empty sequence is a regular s ...

  4. c# 值类型 之枚举

    1声明枚举(enum)类型的变量 enum 变量名 { //标识符列表中,元素与元素之间用 , 逗号分隔: 标识符列表 } 枚举列表中的每个符号代表一个整数值,一个比他前面符号大的整数值,默认情况下, ...

  5. vue下载模板、导出excle

    1.下载模板是 下载模版比较简单,就是跳一个新的页面 2.导出excle 就是get请求,把自己要导出的参数一一拼接起来 }

  6. d3 bubble源码分析

    技术 d3.d3.pack.d3.hierarchy 展示 https://bl.ocks.org/xunhanliu/e0688dc2ae9167c4c7fc264c0aedcdd1 关于怎么使用, ...

  7. [洛谷P1343]地震逃生

    题目大意:有n个点m条单向边,每条边有一个容量.现有x人要分批从1走到n,问每批最多能走多少人,分几批运完(或输出无法运完). 解题思路:一看就是网络流的题目.每批最多能走多少人,即最大流.分几批运完 ...

  8. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  9. django-xadmin定制之列表页searchbar placeholder

    环境:xadmin-for-python3 python3.5.2 django1.9.12 列表页的searchbar如果提供的可搜索字段,都没提示哪个字段可搜索,很不友好,本次定制主要增加inpu ...

  10. 可穿戴KEY带来的身份认证的革命

    在用户身份认证方面,PKI体系给出了极好的解决方式.即基于X.509数字证书的用户身份认证.该方法基于非对称公钥算法的难题为用户提供非常安全的认证过程. PKI体系尽管明白要求"私钥必须保密 ...