Hbase安装和测试过程中的一些见解

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发现,数据条数不改变。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值