Hbase给初学者的“下马威”

自从成为架构师()之后,李大胖的学习动力似乎少了一些,尤其是今年(当然也有一些客观因素)。

临近岁末,内心着实有些惭愧,决定学习一把大数据。跟随一下业界前沿(其实已经不是前沿了),梦想着有一天能够拥有拥有梦想的权力。

操练起来

启动装有CentOS的虚拟机(IP是172.18.232.181),按照官方文档内容选择hadoop-2.8.5和hbase-2.0.2,还有zookeeper-3.4.11进行下载、解压。

以下是官方文档的步骤,熟悉的同学可以直接跳到“噩梦开始”


HDFS
进入hadoop的解压目录,进入etc/hadoop/hadoop-env.sh中设置Java目录,如图

执行./sbin/start-dfs.sh脚本,如图

jps一下,发现启动好了,如图

执行./bin/hdfs dfs -ls /命令,进到hdfs里看看,如图

注:初次进来是空的,没有这个hbase目录的。

Zookeeper
进入zookeeper解压目录,进入conf/zoo.cfg中设置下数据目录,如图

执行./bin/zkServer.sh start命令启动,如图

jps一下,发现启动好了,如图


Hbase
进入hbase的解压目录,进入conf/hbase-env.sh中设置Java目录,如图

进入conf/hbase-site.xml中修改内容,如图

注:指定好hdfs,zookeeper和集群模式。

执行./bin/start-hbase.sh脚本启动,如图

jps一下,启动好了,如图

执行./bin/hbase shell命令,进入shell交互,如图

可以进行建表,插入数据,删除数据等(这里不再演示了)。

最后进入hdfs看一下,发现hbase已经在里面存了数据,如图

李大胖发现按照官方文档一路走下来,非常顺畅,心里不由得成就感倍增(是不是略有肤浅)。

噩梦开始

作为一个写了近十年Java的老码农,不用Java连一下Hbase,那怎么能让李大胖死心呢(噩梦的种子就在此刻埋进了土里)。

开始整起来,先弄个springboot,再引入相关依赖、获取连接等等(具体细节等明年会推文,明年?没毛病啊),按照官方文档方法搞好了。

激动的心,颤抖的手,点了运行按钮。咦,竟然没报错,正常启动了()。

李大胖心想,见证奇迹的时刻到了。就点了页面上的调用按钮,仿佛整个世界都在静静的等待看到结果的喜悦()。1秒,2秒,3秒过去了,没反应,不好,估计出问题了,赶紧看下Eclipse的控制台,果然报错了(噩梦的种子已经发芽了)。错误如下:

Caused by: org.apache.hadoop.hbase.MasterNotRunningException: java.net.ConnectException: Call to localhost/127.0.0.1:16000 failed on connection exception: org.apache.hbase.thirdparty.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:16000

错误是说Master没有运行,原因是访问localhost/127.0.0.1:16000被拒绝。

得亏学了一点Hbase,知道16000是master(节点)的默认端口(老版本中master的默认端口是60000),只是这个IP为啥是本机啊,李大胖心中有些疑惑,Hbase明明是在虚拟机里运行的呀。

“狄仁杰”办案

这就像狄仁杰遇到了大案,而且是离奇的案子。此时狄阁老总是说,在大案面前一定要稳住,不能自乱方寸。特别是案件前期扑朔迷离,陷入僵局,你甚至都不知道对手是谁的时候,一定是你在办案过程中忽略了某些细节,此时你需要从头仔细回忆一遍,看能不能想起一些蛛丝马迹(是不是有点入戏太深了)。

好吧,那就跟着李大胖复盘一下吧()。Hbase在启动的时候会把一些信息注册到zookeeper中,我们在Java程序中只配置了zookeeper的地址,所以程序是从zookeeper中读出了master的地址,然后才去访问的。

既然最后访问的是localhost/127.0.0.1:16000,说明master注册的就是它。想到Dubbo在往zookeeper里注册url时使用的就是IP,所以李大胖认为master往zookeeper里注册的也是IP,即127.0.0.1:16000。

为了验证自己的想法,就进到zookeeper里去看,发现有master节点,但是并没有它的地址信息。既然验证不了,那就解决问题吧,目前看起来只需要master采用所在机器的实际IP注册就行了。

于是使用中文关键词进行了搜索,发现可以在hbase-site.xml配置文件中设置一个hbase.master的参数,赶紧加进去试试,如图:

重启Hbase后发现不行()。

“元芳”的猜想

李大胖继续想,这是搭建的伪集群,官方文档明确说明,伪集群的意思是虽然有多个进程,但是还都是在一个机器上的。会不会是Hbase在启动时检测到了自己是伪集群,所以总是用127.0.0.1去注册啊(请允许李大胖自顾自的胡思乱想)。

俗话说的好,是骡子是马拉出来遛遛()。首先把zookeeper移到另一台虚拟机上,重启Hbase,发现还不行()。莫非还要把HDFS也移到第三台虚拟机上?仔细想想,不对吧,Hbase应该不会自己去检测安装方式,单节点/伪集群/真集群,它不会这么无聊的()。于是放弃了后续的验证。

李大胖接着想,既然在Hbase的配置文件中可以指定hbase.master配置项,那我直接把这个配置项放到Java程序里试试(),兴许管用。但前提是在本机可以访问虚拟机里的master。

于是进入cmd窗口,执行telnet 172.18.232.181 16000,我去,竟然不通()。赶紧跑到虚拟机里执行telnet 172.18.232.181 16000,我嘞个去,竟然还不通()。既然已经在虚拟机里了,就试试telnet 127.0.0.1 16000,擦,竟然它是通的()。于是忽然想起之前看master日志时,总是发现绑定到127.0.0.1,只不过当时没有引起重视。如图

雪上加霜

得,老的问题还没解决,新的问题又出现了。那就解决新问题吧,再次使用中文关键词一通搜索,没有很好的答案。

突然想到,要不使用英文关键词试试,哈哈,一下子就被我get到了。发现这是一个2010年()的提问。八年后被我赶上了,在此非常感谢这个问题的提出者和回答者(https://grokbase.com/t/hbase/user/103pq6p14k/master-binds-only-to-loopback)。

回答中指出,Hbase master绑定的一般算法是这样的,分三步(和把大象装进冰箱里一样):
1、获取host name(在posix系统上一般使用hostname命令获取)
2、在这个hostname上执行DNS查找
3、使用找到的IP作为绑定的IP

忽然想起几年前看视频学习时,提到过Java程序部署到Linux后,很多网络问题有时都和hostname有关。

赶紧执行hostname命令,发现结果是localhost,根据localhost得到的IP就是127.0.0.1,所以master最后绑定到了127.0.0.1:16000上。

于是修改了hostname为host1,同时在/etc/hosts文件中将host1映射为本机实际IP,如图:

重启Hbase,看master日志,终于绑定的IP变了,如图:

我开心地认为是不是所有问题都解决了,赶紧使用Java再调一下,发现还是一开始的错误。因为我每次重启Hbase时都会把logs目录清空,当我修改完hostname后重启时,我发现zookeeper的日志文件名称发生了变化,原来是以localhost结尾,现在变成以新的hostname结尾了,如图:

但是发现master的日志文件还是以localhost结尾,心想是不是因为修改完hostname没有reboot呀(我既在文件中修改了,又用hostname命令修改了,就是懒得重启了),算了,还是重启下吧()。重启完Linux后,再启动Hbase,果然master的日志文件名称变了,也以host1结尾了,如图:

又兴奋起来了,赶紧再用Java调一下试试,可惜,还是原来的配方,原来的味道()。

痛定思痛

再总结下目前的情况,master在启动时,已经绑定到正确的IP和端口,即172.18.232.181:16000。但是Java调用时依然是原来的错误,即访问127.0.0.10:16000被拒绝。说明master虽然启动时server socket绑定对了,但是往zookeeper里注册时错了,依然使用的是127.0.0.1:16000()。

此时李大胖更加纳闷,既然绑定都对了,没有理由往zookeeper里注册时不对啊。为什么非要注册127.0.0.1,而不是实际的IP呢。这个问题之前已经使用中文关键词搜索了很多次,没有得到解决。

狄公曾经说过,有些案子,表面上看去是什么样子,实际就是什么样子。有些案子却恰恰相反,因为有人在故意蒙蔽你的双眼(也有可能是自我蒙蔽了双眼)。

那这个问题该如何解决呢?或者更准确的说,现在的问题根本还没有被定位出来,我们看到的错误只是一个结果(或者说现象)。

爱因斯坦

爱因斯坦曾经说过,“提出一个问题比解决一个问题更重要”。他还说过,“想象力比知识更重要”。(他的名言翻译成中国话,怎么感觉像“没有做不到的,只有想不到的”。

正在李大胖一筹莫展时,一道灵光乍现()。等等,既然server socket绑定时是根据hostname找到IP的,而且修改了hostname后连日志文件名的后面部分都变了,说明和hostname有莫大的关系,且又回忆起master日志文件中在master注册时打印的日志,忽然就想明白了,先看下日志吧,如图:

可以看到首先注册一个备份master,然后删除了这个备份master,因为把它注册为一个活动的master了。而且注册时使用的是localhost而不是IP。我们的Java程序拿到的是localhost而不是一开始想到的127.0.0.1。

那为什么最后又变成了127.0.0.1了呢,因为Windows系统的hosts文件同样把localhost映射为127.0.0.1,这就造成了最后向127.0.0.1:16000发起连接请求而被拒绝,也就是一开始看到的错误现象。到此真相已大白()。

之所以一直认为master向zookeeper注册时使用的是IP,就是受到Dubbo的影响了(当然这里不能怪Dubbo,只能怪自己)。

柳暗花明

问题已经找到,这次直接使用英文关键词搜索,又是一下子就get到答案了。解决方案很简单,就是往hbase-site.xml中加一个hbase.master.hostname的配置项(https://stackoverflow.com/questions/9615707/hbase-how-to-specify-hostname-for-hbase-master),如图:

老外给的答案一般还是值得相信的。重启Hbase。

按照李大胖的推断,此时使用Java调用时,应该报的错是host1无法被解析,因为Windows并不知道host1是什么鬼。那就调一下试试吧,哈哈,果然是这样的,如图:

那么就修改下Windows的hosts文件,把host1加进去,映射为虚拟机的IP即可,如图:

再调一次,已经调通了。

最后再看一眼maser的日志文件,验证下master往zookeeper注册时的内容,如图:

可以看到已经变为host1了。至此,所有问题都已解决。

PS:虽然说理论+实践才能出效果,但是千万别还没看几眼就着急实践,这样会被一些弱智的问题绊倒。事后发现明明很容易,自己却在此耗费好多时间。而且也容易使自己的自信心受到严重打击,甚至怀疑人生()。

相关文章

五分钟轻松了解Hbase列式存储

(完)

编程新说



用独特的视角说技术

原文地址:https://www.cnblogs.com/lixinjie/p/a-head-on-blow-from-hbase-for-newer.html

时间: 2024-10-14 13:25:15

Hbase给初学者的“下马威”的相关文章

工作中我自己总结的hbase文档,供初学者学习。看了这个,就不用去查什么文档了。

HBase配置和使用文档 HBase配置和使用文档...................................................................................................... 1 一. HBase原理和结构说明............................................................................................. 2 二. HBase的

HBase系统入门--整体介绍

转自:http://www.aboutyun.com/thread-8957-1-2.html 问题导读:1.HBase查询与写入哪个更好一些?2.HBase面对复杂操作能否实现?3.Region服务器由哪2部分构成?扩展:4.HBase能否实现join操作?5.二级索引的作用是什么? 前言如今在软件开发领域,谈及大数据已经是家常便饭.笔者相信在未来几年内,大数据的运算和存储一定会成为企业关注的核心.在此普及一个概念,什么级别的数据才能称之为大数据?如果你存储在DB中的数据达到了PB或者单表过亿

JAVA上连接ubuntu14.04上的Hbase

对于新手来说,连接虚拟机上的Hbase有点繁琐,而且网上的配置不太适合初学者,今天我就整理了一下,希望对你们有帮助,第一次发博客. 1.首先去官网下载Hbase的压缩包.我这里用的是1.2.1 http://hbase.apache.org/ 2.把他上传到ubuntu里,我这里安装了vmware tools,所有直接拉进去,命令行的快捷键是ctrl+Alt+T,vmware tools安装参照这里 http://jingyan.baidu.com/album/93f9803f0d9d9be0e

通过tarball形式安装HBASE Cluster(CDH5.0.2)系列随笔

本系列文章只是记录了笔者本人在学习实验安装和使用基于CDH5.0.2的HBASE集群过程中的一些经验教训和心得,绝不是详细的安装过程,因本人不过一初学者,很多方面不甚了了,如果能让不幸读到的人有所得则不胜欣喜,否则大家一笑置之即可. 通过tarball形式安装HBASE Cluster(CDH5.0.2)——集群安装总览 通过tarball形式安装HBASE Cluster(CDH5.0.2)——如何配置分布式集群中的zookeeper 通过tarball形式安装HBASE Cluster(CD

Java初学者

一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容,同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和J

一位资深程序员大牛给予Java初学者的学习建议(转)

一位资深程序员大牛给予Java初学者的学习建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容, 同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点. 1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线, 非Java Web和Java后

Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' 添加记录 put '表名称', '行名称', '列名称:', '值' 查看记录 get '表名称', '行名称' 查看表中的记录总数 count  '表名称' 删除记录 delete  '表名' ,'行名称' , '列名称' 删除一张表 先要屏蔽该表,才能对

Hbase学习(五)-hbase常识及habse适合什么场景

当我们对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用使用什么数据库?答案是什么,如果我们使用的传统数据库,肯定留有多余的字段,10个不行,20个,但是这个严重影响了质量.并且如果面对大数据库,pt级别的数据,这种浪费更是严重的,那么我们该使用是什么数据库?hbase数个不错的选择,那么我们对于hbase还存在下列问题: 1.Column Family代表什么? 2.HBase通过row和column确定一份数据,这份数据的值可能有多个版本,为什么会存在多个版本? 3.查询

HBase使用场景和成功案例 (转)

HBase 使用场景和成功案例 有时候了解软件产品的最好方法是看看它是怎么用的.它可以解决什么问题和这些解决方案如何适用于大型应用架构,能够告诉你很多.因为HBase有许多公开的产品部署,我们正好可以这么做.本章节将详细介绍一些人们成功使用HBase的使用场景. 注意:不要自我限制,认为HBase只能解决这些使用场景.它是一个初生的技术,根据使用场景进行创新正驱动着系统的发展.如果你有新想法,认为可以受益于HBase提供的功能,试试吧.社区很乐于帮助你,也会从你的经验中学习.这正是开源软件精神.