使用Java操作远程HBase请移步

Win下使用Java操作远程分布式集群中的HBase

前提条件

  1. 本地Windows(7或10)系统下已经装好了JDK和Eclipse,笔者电脑JDK1.8。
  2. 已经有搭建好的完全分布式集群,并已经成功启动Hadoop,Zookeeper和HBase。笔者当前搭建好的集群是Hadoop-3.0.3Zookeeper-3.4.13HBase-2.1.0

Hostname

IP

master

10.0.86.245

ceph1

10.0.86.246

ceph2

10.0.86.221

ceph3

10.0.86.253

一、把服务器端的Hadoop安装文件整体复制到本地Win系统下

这里笔者使用Xshell5新建文件传输功能,使用Xshell5登录到master结点后,将服务器端的master结点下的安装好的Hadoop文件夹拖拽到本地F盘中。(本地其他位置也可以,能记住路径即可)

Java连接远程hadoop java连接远程linux 单机hbase_Java

二、配置本地Win系统的环境变量

在环境变量设置中增加HADOOP_HOME配置项,路径是刚才复制到本地对应的路径。

Java连接远程hadoop java连接远程linux 单机hbase_连接数据库_02


之后在Path配置项尾部添加如下路径,并点击确定:

%HADOOP_HOME%\bin

Java连接远程hadoop java连接远程linux 单机hbase_集群_03


添加完成后,测试是否修改成功,在Win系统命令提示符下输入hadoop,出现如下命令提示则成功。

Java连接远程hadoop java连接远程linux 单机hbase_连接数据库_04

【可能出现的问题】:输入hadoop提示JAVA_HOME路径不对。
【原因】:JDK安装目录中含有空格。如笔者当前JDK安装在C盘下的Program Files下,该路径下存在一个空格。

Java连接远程hadoop java连接远程linux 单机hbase_连接数据库_05

【解决方法】:修改 %HADOOP_HOME%\etc\hadoop\hadoop-env.cmd下的set JAVA_HOME=%JAVA_HOME%为

set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_77

即可

Java连接远程hadoop java连接远程linux 单机hbase_Java连接远程hadoop_06

三、修改Win下hosts文件

hosts文件在如下路径:C:\Windows\System32\drivers\etc,加入集群所有节点的IPHostname

Java连接远程hadoop java连接远程linux 单机hbase_HBase_07

四、在本地Eclipse中创建Java Project项目并加入额外jar包

笔者在Eclipse下新建了个HbaseTest1项目。

Java连接远程hadoop java连接远程linux 单机hbase_HBase_08


继续通过使用Xshell5登录到master结点后,将master结点下的hbase安装目录下的lib文件夹拖拽到本地中。HBase-lib文件网盘下载地址

Java连接远程hadoop java连接远程linux 单机hbase_HBase_09


在Eclipse中新建好的项目中右键Build Path->Configure Build Path添加额外的JAR包,把刚才复制到本地的lib文件夹中的所有JAR包导入进去。

Java连接远程hadoop java连接远程linux 单机hbase_Java连接远程hadoop_10


一个好的方式是把lib包插入到项目中,如下图:

Java连接远程hadoop java连接远程linux 单机hbase_集群_11

五、把winutils相关文件覆盖到本地hadoop的bin目录下

现在我们就可以在Eclipse中写代码啦,新建好项目后,敲好代码如下:

package test1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
 
public class testOne{
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
    public static void main(String[] args)throws IOException{
    	init();   //建立连接
    	close();  //关闭连接
    }
    //建立连接
    public static void init(){
       configuration  = HBaseConfiguration.create();  //创建配置实例
//以下对配置实例进行设置,需要设置1)基本的hbase根目录 2)zookeeper进程所在结点 3)zookeeper进程端口号
       configuration.set("hbase.rootdir","hdfs://master:9000/hbase");
       configuration.set("hbase.zookeeper.quorum", "master,ceph1,ceph2,ceph3");
       configuration.set("hbase.zookeeper.property.clientPort", "2181");
       try{ //带入配置实例到连接实例中,创建连接。
            connection = ConnectionFactory.createConnection(configuration);
            admin = connection.getAdmin();  //admin用于管理HBase的增删改查等功能
            System.out.println("连接HBase成功.");
       }catch (IOException e){
            System.err.println("连接HBase失败.");
       }
    }
    //关闭连接
    public static void close(){
        try{
            if(admin != null){
                admin.close();
            }
            if(null != connection){
                connection.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

注:以下三个设置代码缺一不可,之前笔者仅设置了第一行HBase的根目录,后发现无法连接HBase,加入zookeeper的设置才成功。

configuration.set("hbase.rootdir","hdfs://master:9000/hbase");
configuration.set("hbase.zookeeper.quorum", "master,ceph1,ceph2,ceph3");
configuration.set("hbase.zookeeper.property.clientPort", "2181");

运行的时候报错如下:

2018-12-21 10:21:28,822 ERROR [main] util.Shell (Shell.java:getWinUtilsPath(400)) - Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
	at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:382)
	at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:397)
	at org.apache.hadoop.util.Shell.<clinit>(Shell.java:390)
	at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:80)
	at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:1437)
	at org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java:66)
	at org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:80)
	at org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:94)
	at test1.testOne.init(testOne.java:23)
	at test1.testOne.insertRow(testOne.java:110)
	at test1.testOne.main(testOne.java:17)

意思是没有在Hadoop路径中找到Winutils,所以此处需要添加winutils相关文件,把winutils文件添加到本地Hadoop安装目录的bin文件下,遇到相同文件则覆盖,此处我将如下文件全部放入F:\hadoop\bin中,虽然版本有点低,但亲测可用~。

Winutils文件网盘链接下载

Java连接远程hadoop java连接远程linux 单机hbase_集群_12

六、重启电脑(保证前面环境变量配置生效)

最后运行程序,成功连接到HBase~!

Java连接远程hadoop java连接远程linux 单机hbase_HBase_13