使用Java操作远程HBase请移步
前提条件
- 本地Windows(7或10)系统下已经装好了JDK和Eclipse,笔者电脑JDK1.8。
- 已经有搭建好的完全分布式集群,并已经成功启动Hadoop,Zookeeper和HBase。笔者当前搭建好的集群是
Hadoop-3.0.3
,Zookeeper-3.4.13
和HBase-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盘中。(本地其他位置也可以,能记住路径即可)
二、配置本地Win系统的环境变量
在环境变量设置中增加HADOOP_HOME
配置项,路径是刚才复制到本地对应的路径。
之后在Path
配置项尾部添加如下路径,并点击确定:
%HADOOP_HOME%\bin
添加完成后,测试是否修改成功,在Win系统命令提示符下输入hadoop
,出现如下命令提示则成功。
【可能出现的问题】:输入
hadoop
提示JAVA_HOME路径不对。
【原因】:JDK安装目录中含有空格。如笔者当前JDK安装在C盘下的Program Files下,该路径下存在一个空格。
【解决方法】:修改 %HADOOP_HOME%\etc\hadoop\hadoop-env.cmd下的set JAVA_HOME=%JAVA_HOME%为set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_77
即可
三、修改Win下hosts文件
hosts
文件在如下路径:C:\Windows\System32\drivers\etc
,加入集群所有节点的IP
和Hostname
。
四、在本地Eclipse中创建Java Project项目并加入额外jar包
笔者在Eclipse下新建了个HbaseTest1项目。
继续通过使用Xshell5登录到master结点后,将master
结点下的hbase
安装目录下的lib
文件夹拖拽到本地中。HBase-lib文件网盘下载地址
在Eclipse中新建好的项目中右键Build Path->Configure Build Path
添加额外的JAR包,把刚才复制到本地的lib
文件夹中的所有JAR包导入进去。
一个好的方式是把lib包插入到项目中,如下图:
五、把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文件网盘链接下载
六、重启电脑(保证前面环境变量配置生效)
最后运行程序,成功连接到HBase~!