1、IDEA连接伪分布式Hbase测试遇到问题
1、问题描述
1、环境
(1)ubuntu-18.4
(2)hadoop-2.7.1
(3)zookeeper-3.4.10
(4)HBase-1.3.1
2、描述
前几天安装上面的要求在一台虚拟机上安装好环境后,今天在IDEA中测试师兄给我的Hbasedemo的代码,发现一直报一些错误,经过测试,我发现zookeeper可以进行连接,那么就是HBase配置的问题。
Connection refused: no further information: localhost/xx
这样的错误导致IDEA连接HBase超时,进而导致失败。看到上面的报错,我感到很奇怪,因为我的Ubuntu虚拟机的IP地址是:
192.168.10.141
hostname 为 xiaolunserver 为啥变成 localhost了呢?原来是HBase的服务器IP地址出错导致的。
2、解决问题
1、在本地hosts文件中添加Linux服务器的映射关系
192.168.10.141 xiaolunserver
2、Linux服务器的 /etc/hosts中添加映射关系
192.168.10.141 xiaolunserver
通过 hostname 指令查看Linux的主机名。
2、Hbase的节点无法注册进zookeeper
1、问题描述
1、环境
Hbase采用伪分布式安装,环境基本配置同问题1,只是Hbase版本变成1.2.4,1.3.1版本也可以运行,和hadoop-2.7.1兼容。
2、描述
从学校回家以来,就很少看项目上的事。这几天搞一下项目,期间会用到HBase从Kafka中获取数据。依次启动Zookeeper(Standalone方式)、Hadoop(伪分布式安装,采用sbin/start-all.sh
启动),然后使用bin/start-hbase.sh
启动集群,此时,通过下面的网址可以看到HBase有正在运行的HRegionServer和HMaster:
# xialunserver是linux服务器hostname
http://xiaolunserver:16010
通过jps命令可以看到对应的HRegionServer和HMaster进程,但是通过下面指令进行HBase的shell操作时:
bin/hbase shell
在新启动的窗口中可以看到HRegionServer、HMaster、DataNode或者NameNode进程会有一个或者几个挂掉,导致HBase报连接zookeeper中Node=null
的错误,进而无法正常连接Zookeeper节点。但是通过指令bin/zkCli.sh
可以查看到/hbase
节点,这说明HBase已经注册进入到Zookeeper节点了。
2、解决问题
1、保证hadoop正常运行
推荐以sbin/start-dfs.sh
方式启动,此时后台有三个进程:DataNode、NameNode和SecondaryNameNode
。这三个进程是HBase正常运行所需要的。
由于经常对NameNode执行下面的命令进行格式化操作:
bin/hdfs namenode -format
因此,在DataNode、NameNode
在运行一段时间后,会自动挂掉,进而导致HBase无法重启。解决方法如下:
(1)执行指令/hdfs dfs -rm -rf /Hbase
,将配置在<name>hbase.rootdir</name>
中数据从NameNode中进行删除;
(2)停止运行的Hadoop,执行bin/hdfs namenode -format
再次对NameNode进行格式化;
(3)对core-site.xml中配置的<name>hadoop.tmp.dir</name>
保存数据的位置进行删除;
(4)以sbin/start-dfs.sh
方式重启Hadoop。
2、保证Zookeeper正常运行
(1)使用bin/zkCli.sh
将/hbase
节点删除;
(2)停止运行的Zookeeper,将<name>hbase.zookeeper.property.dataDir</name>
配置的数据完全删除。
3、依次启动Zookeeper、Hadoop,在保证正常运行的情况下,启动HBase。
3、方法
1、获取指定标签的行键
项目中需要获取HBase数据库中某张表某个行键从现在起往前推n天的数据,可以使用下面的方式进行获取。
Scan scan = new Scan();
// startRow:ffbc0a2021011617;tagDigest:ffbc0a。
scan = HBaseDaoUtil.rowStartByTag(scan, startRow, tagDigest);
//获取扫描器对象进行遍历
for (Result result : scan(tableName, scan)) {}
// 检索指定开始行键和指定标签的hbase数据
public static Scan rowStartByTag(Scan scan, String start, String tag) {
return rowStart(scan, start).setRowPrefixFilter(tag.getBytes());
}
/**
* @desc hbase中的结果
* @param table hbase中对应的表名
* @param scan
* @return
*/
public static ResultScanner scan(String table, Scan scan) {
try {
return HBaseConfig.getConnection().getTable(TableName.valueOf(table)).
getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
其中,startRow
是使用MD5进行加密后截取前6位的标签和年月日结合而存储到HBase表中的一个行键,tagDigest
使用MD5进行加密后截取前6位的标签。将行键中以startRow
为开始含有tagDigest
数据进行筛选,可以完成获取所有大于startRow
行键数据的要求。下面的检索条件不包含结束的行键,故没有采用。
//设置检索结束row,不包含该行数据
public static Scan rowStop(Scan scan, String stop) {
return scan.withStopRow(stop.getBytes());
}
2、对于行键条数的理解
做项目时,发现存到HBase表中的数据条数通过下面指令查看的时候:
count 'tableName'
发现数据条数会到达一个极限值,按照常理来说,会一直增加,通过下面代码的测试,明白了数据条数不增加的原因。对于同一个行键rowKey,当column
不同的时候进行存储,使用count tableName
发现,数据条数不改变。