今天我在虚拟机里面安装了Hbase 1.2.4,说在windows上Java API调用访问下玩玩,结果始终连接不上。
现象是启动程序后,程序出现卡死的状态,没报错也不停止,大约半分钟后才打印一堆日志出来,说连接重试了多次也连接不上:
这个问题纠结了我半天,一查看发现HBase绑定的是本地IP:127.0.0.1,这当然访问不了
然后我想可以把HBase的绑定在指定IP上,去查Hbase官网,却没有这样的配置项
后面百度下,发现HBase的这个问题要特殊处理
分下面三步走,即可访问
1、配置Linux的hostname 配置教程
2、配置Linux的hosts,映射ip的hostname的关系
3、配置访问windows的hosts
首先通过POM将需要的JAR包导入。如果怕版本不一致,可以将安装HBase的lib里面的jar导入程序当中
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import java.io.IOException;
/**
* @Author: Stephen
* @Date: 2020/2/13 9:42
* @Content:
*/
public class MyHbase {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
config.set("hbase.rootdir","hdfs://192.168.56.122:9000/hbase");// 和hadoop中的core_site.xml信息一置
config.set("hbase.zookeeper.quorum","192.168.56.122");// zookeeper地址
config.set("hbase.zookeeper.property.clientPort","2181");// 端口号
Connection connection = ConnectionFactory.createConnection(config);
Table table = connection.getTable(TableName.valueOf("mtest:demo"));
Put put = new Put("1".getBytes());
put.addColumn("base".getBytes(),"name".getBytes(),"hehe".getBytes());
put.addColumn("base".getBytes(),"sex".getBytes(),"female".getBytes());
table.put(put);
table.close();
}
}
查看虚拟机hostname以及ip
**注意一定要在本地HOSTS文件(C:\Windows\System32\drivers\etc\hosts)配置hbase集群地址 **
在末尾添加 192.168.56.122 hw1
问题1:java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set
处理方法:在本地安装一个HADOOP,然后配置环境变量 配置详解HADOOP_HOME 尽管是调用的远程的Hadoop下的HBASE,所以这个问题困扰了我好久。
直接在官方网站下载一个安装的包 hadoop-2.7.6.tar.gz 然后直接解压放在硬盘下。接着配置环境变量HADOOP_HOME 并添加到Path当中。
上面步骤完成之后启动报错
问题2:java.io.IOException: Could not locate executable E:\hadoop-2.7.6\hadoop-2.7.6\bin\winutils.exe in the Hadoop binaries.
需要下载winutils.exe hadoop.dll等组件放在hadoop安装目录的bin当中。下载地址:https://github.com/srccodes/hadoop-common-2.2.0-bin
虽然是2.2.0的,但是亲测试可用的。下载完毕解压,将里面的bin里面的全部复制,然后拷贝到hadoop安装目录的bin当中,如果有相同的替换掉就是了
在上述步骤解决后还有一个问题
问题3:The node /hbase is not in ZooKeeper. It should have been written by the master
zookeeper.znode.parent 的配置信息不是/hbase-unsecure 会报错。
可以在HBase安装目录中的配置文件hbase-site.xml当中查看具体信息
[root@hw1 ~]# vi /opt/soft/hbase120/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.56.122:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hw1:2181,hw2:2181,hw3:2181</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
# 需要添加的部分
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.56.122</value>
</property>
</configuration>
最后重启 hadoop以及hbase就能够远程连接了