千家信息网

Hbase给初学者的“下马威”

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,自从成为架构师()之后,李大胖的学习动力似乎少了一些,尤其是今年(当然也有一些客观因素)。临近岁末,内心着实有些惭愧,决定学习一把大数据。跟随一下业界前沿(其实已经不是前沿了),梦想着有一天能够拥有拥
千家信息网最后更新 2025年01月24日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列式存储




(完)


编程新说


用独特的视角说技术


如图 问题 文件 日志 目录 就是 命令 错误 集群 配置 关键 关键词 官方 数据 文档 程序 还是 噩梦 实际 中设 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 北京班信网络技术有限公司官网 安卓打开定位服务器地址 华南农业大学网络安全研究生 河南专升本软件开发考什么 数据库问世 服务器异常启动是什么意思 北京专业软件开发服务费 浙江多功能软件开发服务价格 vb打开数据库的sql语句 网络安全必学渗透测试流程 手机有流量为啥打不开数据库 呼和浩特市艾思网络技术公司 steam哪个服务器 战地3国服务器 软件维护和软件开发的关联 如何做到网络安全十不准 计算机与软件开发专业 登录学校的官网显示服务器错误 全球网络安全威胁数据 局域网内服务器无法上网 数据库中有较高的安全性 西城数据库安全防护系统 电大计算机网络技术难不难 软件开发转ui设计难吗 cas上服务器忘记密码 vb打开数据库的sql语句 阿里云服务器优点 数据库窗体页脚怎么设置 如果选取两列中相同的数据库 网络安全测试收费标准
0