伪集群部署Hbase与外置zookeeper,JAVAAPI局域网访问Hbase
服务器安装虚拟机下安装centos、配置ip,本地可以通过ssh连接到centos中ip配置,直接使用nat虚拟机内部配置静态IPIPADDR=192.168.1.234GATEWAR=192.168.1.1BOOTPROTO=staticONBOOT=yes下载安装jdk、hbaseyum install -y java配置JAVA_HOME环境变量...
服务器安装
-
虚拟机下安装centos、配置ip,本地可以通过ssh连接到centos中
-
ip配置,直接使用nat
-
虚拟机内部配置静态IP
IPADDR=192.168.1.234
GATEWAR=192.168.1.1
BOOTPROTO=static
ONBOOT=yes
- 下载安装jdk、hbase
yum install -y java
配置JAVA_HOME环境变量
ll $(whereis javac)
vi ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64
//使环境变量生效
source ~/.bashrc
//hbase官方网站下载可执行包
//http://mirror.bit.edu.cn/apache/hbase/2.1.1/hbase-2.1.1-bin.tar.gz
sftp 上传文件至虚拟机
//解压tar文件
tar zxvf hbase-2.1.1-bin.tar.gz
- hbase-env.sh 中配置
jdk//1. 修改JAVA_HOME export JAVA_HOME=${JAVA_HOME} //外置Zookeeper开启需要关闭HBASE_MANAGES_ZK //Tell HBase whether it should manage it's own instance of ZooKeeper or not. export HBASE_MANAGES_ZK=false
- 下载安装zookeeper、配置jdk,拷贝zoo.cfg到hbase的conf的目录下
//下载apache zookeeper官网可执行文件包 http://mirror.bit.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz sftp 上传至 虚拟机,也可以直接在centos中wget该文件,hbase不这么下载是因为hbase确实有点大,本地下载多线程会快一些 tar -zxvf zookeeper-3.4.12.tar.gz // 拷贝conf中的zoo_sample.cfg到hbase的conf中一份
cp zoo_sample.cfg ../../hbase/conf/ //单节点配置,zookeeper中的配置文件不需要修改,可直接启动
- 修改hbase 的 hbase-site.xml, 配置外置zookeeper位置,hbase 数据存储位置
<!-- hbase数据存放的目录,若用本地目录,必须带上file://,否则hbase启动不起来 -->
<property>
<name>hbase.rootdir</name>
<value>file:///root/liyang/hbase-data</value>
</property>
<!-- zk的位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.1.234</value>
<description>/root/liyang/zookeeper</description>
</property>
<!-- 此处必须为true,不然hbase仍用自带的zk,若启动了外部的zookeeper,会导致冲突,hbase启动不起来 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
-
host添加hbase master访问节点域名
vi /etc/hosts //增加一行 192.168.1.234 hbase_node //不重启生效host文件修改(如果使用xshell或者securtcrt需要断开连接重新连接,就可以看见host文件修改是否生效了) hostnamectl set-hostname hbase_node
-
编辑 regionservers ,添加host配置过的域名信息
//修改regionservers,将上一步配置的hbase_node添加到regionservers中,用来其他节点控制访问hbase
-
配置ssh(单节点访问这步应该可以不用配置也可以)
ssh-keygen ssh-copy-id hbase_node ssh hbase_node
-
启动服务
1. 先启动zookeeper,hbase再启动的时候才能正确像zookeeper中注册节点信息 ./zkServer.sh start
启动zookeeper之后启动客户端查看一下当前注册的节点信息 ./zkCli.sh
//当前节点应该是没有hbase的节点信息的,因为hbase还没有启动,接下来启动hbase 2. 启动hbase ./start-hbase.sh
出现running master,running regionserver则证明启动成功,现在看一下zookeeper中是否有hbase的节点信息
//可以看到hbase是注册到zookeeper中了的,现在hbase、zookeeper都启动成功了,最后一步,上面配置了host,reginserver根据hostname启动的,其他节点就可以通过hostname与ssh进行连接访问hbase了,现在看一下hbase启动所监听的端口跟ip是多少 netstat -ntlp
//由于配置了reginserver的hostname,现在所监听的地址是192.168.1.234,如果不设置hostname的话,就只能监听到127.0.0.1,局域网内的其他机器就没办法连接zookeeper
-
现在hbase与zookeeper都启动成功了,zookeeper中的hbase节点也以及注册了,就可以在本地写程序通过javaapi访问hbase了
但是首先需要在本地配置host指定centos中的hostname到centos的ip上,否则本地通过一个hostname没有办法正确访问到hbase的ip
windows 中打开C:\Windows\System32\drivers\etc下的hosts文件进行修改 添加上这么一条(ip就是hbase所在服务器ip, hostname就是注册到zookeeper中的hostname) 192.168.1.234 hbase_node
现在就可以开始写程序了,我就直接将测试程序放上来了
- 先测试下zookeeper是否可以连接没有问题
package com.wecredo.MainTest;
import org.apache.zookeeper.*;
import java.io.IOException;
/**
* @author: liyang
* @date:2018/12/13 0013
* describe:
*/
public class ZKTest implements Watcher {
ZooKeeper zooKeeper;
public static void main(String[] args) throws IOException, InterruptedException {
ZKTest zkTest = new ZKTest();
zkTest.zooKeeper = new ZooKeeper("192.168.1.234:2181", 5000, zkTest);
System.out.println(zkTest.zooKeeper.getState());
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
System.out.println("Receive watched event:" + event);
if(event.getState() == Event.KeeperState.SyncConnected){
System.out.println("ZooKeeper session established.");
doSomething();
}
}
private void doSomething() {
try {
String path = zooKeeper.create("/test_node", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("return path:" + path);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("do something");
}
}
配置ip后直接启动此程序,查看zookeeper中是否可以创建test_node节点
- 测试hbase是否可以正确连接
package com.wecredo.MainTest;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
/**
* @author: liyang
* @date:2018/12/13 0013
* describe:
*/
public class HbaseTest {
public static void main(String[] args) throws IOException {
//第一步,设置HBsae配置信息
Configuration configuration = HBaseConfiguration.create();
//注意。这里这行目前没有注释掉的,这行和问题3有关系 是要根据自己zookeeper.znode.parent的配置信息进行修改。
configuration.set("hbase.zookeeper.quorum","192.168.1.234"); //hbase 服务地址
configuration.set("hbase.zookeeper.property.clientPort","2181"); //端口号
//这里使用的是接口Admin 该接口有一个实现类HBaseAdmin 也可以直接使用这个实现类
Admin admin = ConnectionFactory.createConnection(configuration).getAdmin();
if(admin !=null){
try {
//获取到数据库所有表信息
HTableDescriptor[] allTable = admin.listTables();
for (HTableDescriptor hTableDescriptor : allTable) {
System.out.println(hTableDescriptor.getNameAsString());
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
也是配置好ip后直接启动
直接启动会抛出一个java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.的异常,这个在本地启动并没有hadoop的环境所以可以不用管,这个程序是看hbase中都有哪些表的,可以先用hbase shell连接hbase,然后通过这个程序测试是否能都得出来
更多推荐
所有评论(0)